From: Daniel Sanders Date: Tue, 17 Mar 2015 14:37:39 +0000 (+0000) Subject: Re-commit: [hexagon] Distinguish the 'o', 'v', and 'm' inline assembly memory constra... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=42c951a74c9cebe42adc2508f7074f1106b9fb3c;p=oota-llvm.git Re-commit: [hexagon] Distinguish the 'o', 'v', and 'm' inline assembly memory constraints. Summary: But still handle them the same way since I don't know how they differ on this target. No functional change intended. Reviewers: kparzysz, adasgupt Reviewed By: kparzysz, adasgupt Subscribers: colinl, llvm-commits Differential Revision: http://reviews.llvm.org/D8204 Like for the PowerPC target, I've had to add 'i' to the constraint mappings in order to pass 2007-12-17-InvokeAsm.ll. It's not clear why 'i' has historically been treated as a memory constraint. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232480 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/InlineAsm.h b/include/llvm/IR/InlineAsm.h index a1d72a4af73..bdb75dbc5b2 100644 --- a/include/llvm/IR/InlineAsm.h +++ b/include/llvm/IR/InlineAsm.h @@ -243,7 +243,7 @@ public: Constraint_i, Constraint_m, Constraint_o, - Constraint_v, // Unused at the moment since Constraint_m is always used. + Constraint_v, Constraint_Q, Constraint_Z, Constraint_Zy, diff --git a/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp index 795faf97af4..33c4ce51aac 100644 --- a/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp +++ b/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp @@ -1108,11 +1108,12 @@ SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID, SDValue Inp = Op, Res; switch (ConstraintID) { - case InlineAsm::Constraint_o: // Offsetable. - case InlineAsm::Constraint_v: // Not offsetable. default: return true; - case InlineAsm::Constraint_m: // Memory. + case InlineAsm::Constraint_i: + case InlineAsm::Constraint_o: // Offsetable. + case InlineAsm::Constraint_v: // Not offsetable. + case InlineAsm::Constraint_m: // Memory. if (SelectAddrFI(Inp, Res)) OutOps.push_back(Res); else diff --git a/lib/Target/Hexagon/HexagonISelLowering.h b/lib/Target/Hexagon/HexagonISelLowering.h index 7b772f07eb0..99214c8d445 100644 --- a/lib/Target/Hexagon/HexagonISelLowering.h +++ b/lib/Target/Hexagon/HexagonISelLowering.h @@ -185,8 +185,11 @@ bool isPositiveHalfWord(SDNode *N); unsigned getInlineAsmMemConstraint( const std::string &ConstraintCode) const override { - // FIXME: Map different constraints differently. - return InlineAsm::Constraint_m; + if (ConstraintCode == "o") + return InlineAsm::Constraint_o; + else if (ConstraintCode == "v") + return InlineAsm::Constraint_v; + return TargetLowering::getInlineAsmMemConstraint(ConstraintCode); } // Intrinsics