Handle multiple return values.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50604 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Devang Patel 2008-05-03 01:12:15 +00:00
parent 7a07428ad1
commit 7b39969528

View 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;
}
}