Another step to getting multiple result inline asm to work.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50329 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index b63470f..b43ff1c 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -3760,6 +3760,7 @@
   bool SawEarlyClobber = false;
   
   unsigned ArgNo = 0;   // ArgNo - The argument of the CallInst.
+  unsigned ResNo = 0;   // ResNo - The result number of the next output.
   for (unsigned i = 0, e = ConstraintInfos.size(); i != e; ++i) {
     ConstraintOperands.push_back(SDISelAsmOperandInfo(ConstraintInfos[i]));
     SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
@@ -3769,14 +3770,21 @@
     // Compute the value type for each operand.
     switch (OpInfo.Type) {
     case InlineAsm::isOutput:
-      if (!OpInfo.isIndirect) {
-        // The return value of the call is this value.  As such, there is no
-        // corresponding argument.
-        assert(CS.getType() != Type::VoidTy && "Bad inline asm!");
-        OpVT = TLI.getValueType(CS.getType());
-      } else {
+      // Indirect outputs just consume an argument.
+      if (OpInfo.isIndirect) {
         OpInfo.CallOperandVal = CS.getArgument(ArgNo++);
+        break;
       }
+      // The return value of the call is this value.  As such, there is no
+      // corresponding argument.
+      assert(CS.getType() != Type::VoidTy && "Bad inline asm!");
+      if (const StructType *STy = dyn_cast<StructType>(CS.getType())) {
+        OpVT = TLI.getValueType(STy->getElementType(ResNo));
+      } else {
+        assert(ResNo == 0 && "Asm only has one result!");
+        OpVT = TLI.getValueType(CS.getType());
+      }
+      ++ResNo;
       break;
     case InlineAsm::isInput:
       OpInfo.CallOperandVal = CS.getArgument(ArgNo++);