Fix CodeGen/Generic/2007-04-27-LargeMemObject.ll and
authorChris Lattner <sabre@nondot.org>
Sat, 28 Apr 2007 06:08:13 +0000 (06:08 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 28 Apr 2007 06:08:13 +0000 (06:08 +0000)
    CodeGen/Generic/2007-04-27-InlineAsm-X-Dest.ll

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36534 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index 4e57a7b36aa3b9364294088a39e025fd006f8531..829dae50d1f446925d8946f030a63fe3fab1f7ec 100644 (file)
@@ -3210,16 +3210,22 @@ void SelectionDAGLowering::visitInlineAsm(CallInst &I) {
     switch (Constraints[i].Type) {
     case InlineAsm::isOutput:
       if (!Constraints[i].isIndirect) {
+        // The return value of the call is this value.
         assert(I.getType() != Type::VoidTy && "Bad inline asm!");
         OpVT = TLI.getValueType(I.getType());
       } else {
         const Type *OpTy = I.getOperand(OpNum)->getType();
-        OpVT = TLI.getValueType(cast<PointerType>(OpTy)->getElementType());
+        OpVT = TLI.getValueType(cast<PointerType>(OpTy)->getElementType(),true);
         OpNum++;  // Consumes a call operand.
       }
       break;
     case InlineAsm::isInput:
-      OpVT = TLI.getValueType(I.getOperand(OpNum)->getType());
+      if (!Constraints[i].isIndirect) {
+        OpVT = TLI.getValueType(I.getOperand(OpNum)->getType());
+      } else {
+        const Type *OpTy = I.getOperand(OpNum)->getType();
+        OpVT = TLI.getValueType(cast<PointerType>(OpTy)->getElementType(),true);
+      }
       OpNum++;  // Consumes a call operand.
       break;
     case InlineAsm::isClobber:
@@ -3275,8 +3281,8 @@ void SelectionDAGLowering::visitInlineAsm(CallInst &I) {
       if (ConstraintCode.size() == 1)   // not a physreg name.
         CTy = TLI.getConstraintType(ConstraintCode);
       
-      if (CTy == TargetLowering::C_Memory) {
-        // Memory output.
+      if (CTy != TargetLowering::C_RegisterClass) {
+        // Memory output, or 'other' output (e.g. 'X' constraint).
         SDOperand InOperandVal = getValue(I.getOperand(OpNum));
         
         // Check that the operand (the address to store to) isn't a float.