Handle multiple return values.
authorDevang Patel <dpatel@apple.com>
Sat, 3 May 2008 01:12:15 +0000 (01:12 +0000)
committerDevang Patel <dpatel@apple.com>
Sat, 3 May 2008 01:12:15 +0000 (01:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50604 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/LCSSA.cpp

index a9d1dc40cf6cfdddc07fd43785f7047722c56c7d..39314678bd4d812a30a4eb20c90f8bf1d3403ba7 100644 (file)
@@ -217,7 +217,29 @@ void LCSSA::getLoopValuesUsedOutsideLoop(Loop *L,
         }
         
         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;
         }
       }