[llvm-commits] [llvm] r50604 - /llvm/trunk/lib/Transforms/Utils/LCSSA.cpp
Devang Patel
dpatel at apple.com
Fri May 2 18:12:15 PDT 2008
Author: dpatel
Date: Fri May 2 20:12:15 2008
New Revision: 50604
URL: http://llvm.org/viewvc/llvm-project?rev=50604&view=rev
Log:
Handle multiple return values.
Modified:
llvm/trunk/lib/Transforms/Utils/LCSSA.cpp
Modified: llvm/trunk/lib/Transforms/Utils/LCSSA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LCSSA.cpp?rev=50604&r1=50603&r2=50604&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/LCSSA.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/LCSSA.cpp Fri May 2 20:12:15 2008
@@ -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;
}
}
More information about the llvm-commits
mailing list