Auto-upgrade code for multiple-value return statements. This code

isn't actually called yet.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52435 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2008-06-17 23:38:43 +00:00
parent 80b9626ee3
commit 44f6a2c951
2 changed files with 30 additions and 0 deletions

View File

@ -35,6 +35,12 @@ namespace llvm {
/// so that it can update all calls to the old function.
void UpgradeCallsToIntrinsic(Function* F);
/// This is an auto-upgrade hook for mutiple-value return statements.
/// This function auto-upgrades all such return statements in the given
/// function to use aggregate return values built with insertvalue
/// instructions.
void UpgradeMultipleReturnValues(Function *F);
} // End llvm namespace
#endif

View File

@ -391,3 +391,27 @@ void llvm::UpgradeCallsToIntrinsic(Function* F) {
}
}
/// This is an auto-upgrade hook for mutiple-value return statements.
/// This function auto-upgrades all such return statements in the given
/// function to use aggregate return values built with insertvalue
/// instructions.
void llvm::UpgradeMultipleReturnValues(Function *CurrentFunction) {
for (Function::iterator I = CurrentFunction->begin(),
E = CurrentFunction->end(); I != E; ++I) {
BasicBlock *BB = I;
if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) {
unsigned NumVals = RI->getNumOperands();
if (NumVals > 1) {
std::vector<const Type *> Types(NumVals);
for (unsigned i = 0; i != NumVals; ++i)
Types[i] = RI->getOperand(i)->getType();
const Type *ReturnType = StructType::get(Types);
Value *RV = UndefValue::get(ReturnType);
for (unsigned i = 0; i != NumVals; ++i)
RV = InsertValueInst::Create(RV, RI->getOperand(i), i, "mrv", RI);
ReturnInst::Create(RV, RI);
RI->eraseFromParent();
}
}
}
}