diff options
author | Devang Patel <dpatel@apple.com> | 2008-04-08 02:24:08 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2008-04-08 02:24:08 +0000 |
commit | 34437f35e9ecc5891b3f8b50c52adc305dd19228 (patch) | |
tree | 57e47781cd1e280999de2be5da9899d3316a86a1 /lib/Transforms/Utils/UnifyFunctionExitNodes.cpp | |
parent | f2247cfb38851c20c9667c608b2dceb16d5e9f26 (diff) |
Fix insert point handling for multiple return values.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49367 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/UnifyFunctionExitNodes.cpp')
-rw-r--r-- | lib/Transforms/Utils/UnifyFunctionExitNodes.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp b/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp index 76b565c0e2..6cdaba53a0 100644 --- a/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp +++ b/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp @@ -117,13 +117,21 @@ bool UnifyFunctionExitNodes::runOnFunction(Function &F) { if (NumRetVals == 0) ReturnInst::Create(NULL, NewRetBlock); else if (const StructType *STy = dyn_cast<StructType>(F.getReturnType())) { - Instruction *InsertPt = NewRetBlock->getFirstNonPHI(); + Instruction *InsertPt = NULL; + if (NumRetVals == 0) + InsertPt = NewRetBlock->getFirstNonPHI(); + PHINode *PN = NULL; for (unsigned i = 0; i < NumRetVals; ++i) { - PHINode *PN = PHINode::Create(STy->getElementType(i), "UnifiedRetVal." - + utostr(i), InsertPt); + if (InsertPt) + PN = PHINode::Create(STy->getElementType(i), "UnifiedRetVal." + + utostr(i), InsertPt); + else + PN = PHINode::Create(STy->getElementType(i), "UnifiedRetVal." + + utostr(i), NewRetBlock); Phis.push_back(PN); + InsertPt = PN; } - ReturnInst::Create(&Phis[0], NumRetVals); + ReturnInst::Create(&Phis[0], NumRetVals, NewRetBlock); } else { // If the function doesn't return void... add a PHI node to the block... |