Handle multiple return values.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50604 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp
index a9d1dc4..3931467 100644
--- a/lib/Transforms/Utils/LCSSA.cpp
+++ b/lib/Transforms/Utils/LCSSA.cpp
@@ -217,7 +217,29 @@
         }
         
         if (*BB != UserBB && !inLoop(UserBB)) {
-          AffectedValues.insert(I);
+          const StructType *STy = dyn_cast<StructType>(I->getType());
+          if (STy) {
+            // I is a call or an invoke that returns multiple values.
+            // These values are accessible through getresult only.
+            // If the getresult value is not in the BB then move it
+            // immediately here. It will be processed in next iteration.
+            BasicBlock::iterator InsertPoint;
+            if (InvokeInst *II = dyn_cast<InvokeInst>(I)) {
+              InsertPoint = II->getNormalDest()->begin();
+              while (isa<PHINode>(InsertPoint))
+                ++InsertPoint;
+            } else {
+              InsertPoint = I;
+              InsertPoint++;
+            }
+            for (Value::use_iterator TmpI = I->use_begin(), 
+                   TmpE = I->use_end(); TmpI != TmpE; ++TmpI) {
+              GetResultInst *GR = cast<GetResultInst>(TmpI);
+              if (GR->getParent() != *BB)
+                GR->moveBefore(InsertPoint);
+            }
+          } else
+            AffectedValues.insert(I);
           break;
         }
       }