From: Dan Gohman Date: Tue, 17 Jun 2008 23:38:43 +0000 (+0000) Subject: Auto-upgrade code for multiple-value return statements. This code X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=44f6a2c951b0536c6e4ab6f576f82676ed97322c;p=oota-llvm.git 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 --- diff --git a/include/llvm/AutoUpgrade.h b/include/llvm/AutoUpgrade.h index 3a97353ac92..023587790f2 100644 --- a/include/llvm/AutoUpgrade.h +++ b/include/llvm/AutoUpgrade.h @@ -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 diff --git a/lib/VMCore/AutoUpgrade.cpp b/lib/VMCore/AutoUpgrade.cpp index 2f1e07c2112..7b6369208c1 100644 --- a/lib/VMCore/AutoUpgrade.cpp +++ b/lib/VMCore/AutoUpgrade.cpp @@ -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(BB->getTerminator())) { + unsigned NumVals = RI->getNumOperands(); + if (NumVals > 1) { + std::vector 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(); + } + } + } +}