generalize aggregate handling
authorChris Lattner <sabre@nondot.org>
Sun, 29 Apr 2007 18:58:03 +0000 (18:58 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 29 Apr 2007 18:58:03 +0000 (18:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36568 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index d2b7e44e9f87fe2515807f57096f0c0fbdd0303d..023bbfd0906a63be32d688360eb3f4baeb314ba9 100644 (file)
@@ -3248,12 +3248,28 @@ void SelectionDAGLowering::visitInlineAsm(CallInst &I) {
     if (OpInfo.CallOperandVal) {
       OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);
       const Type *OpTy = OpInfo.CallOperandVal->getType();
-      if (!OpInfo.isIndirect) {
-        // Must be an input.
-        OpVT = TLI.getValueType(OpTy);
-      } else {
-        OpVT = TLI.getValueType(cast<PointerType>(OpTy)->getElementType(),true);
+      // If this is an indirect operand, the operand is a pointer to the
+      // accessed type.
+      if (OpInfo.isIndirect)
+        OpTy = cast<PointerType>(OpTy)->getElementType();
+      
+      // If OpTy is not a first-class value, it may be a struct/union that we
+      // can tile with integers.
+      if (!OpTy->isFirstClassType() && OpTy->isSized()) {
+        unsigned BitSize = TD->getTypeSizeInBits(OpTy);
+        switch (BitSize) {
+        default: break;
+        case 1:
+        case 8:
+        case 16:
+        case 32:
+        case 64:
+          OpTy = IntegerType::get(BitSize);
+          break;
+        }
       }
+      
+      OpVT = TLI.getValueType(OpTy, true);
     }
     
     OpInfo.ConstraintVT = OpVT;