Enable first-class aggregates support.

Remove the GetResultInst instruction. It is still accepted in LLVM assembly
and bitcode, where it is now auto-upgraded to ExtractValueInst. Also, remove
support for return instructions with multiple values. These are auto-upgraded
to use InsertValueInst instructions.

The IRBuilder still accepts multiple-value returns, and auto-upgrades them
to InsertValueInst instructions.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53941 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman
2008-07-23 00:34:11 +00:00
parent 5e6ebaf4d1
commit fc74abfba5
29 changed files with 167 additions and 558 deletions

View File

@ -217,27 +217,7 @@ void LCSSA::getLoopValuesUsedOutsideLoop(Loop *L,
}
if (*BB != UserBB && !inLoop(UserBB)) {
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()->getFirstNonPHI();
} 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);
AffectedValues.insert(I);
break;
}
}