summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-10-27 05:33:09 +0000
committerChris Lattner <sabre@nondot.org>2003-10-27 05:33:09 +0000
commitd9f4ffdf5eeb39a7fb3849e339f1c54b1c4418d1 (patch)
treed91dfdc8b3299a134b26d74f56db0b632fbab661 /llvm/lib/Transforms/Utils
parent0fd9c24e5679a1f277ff801795195f220299c65e (diff)
downloadbcm5719-llvm-d9f4ffdf5eeb39a7fb3849e339f1c54b1c4418d1.tar.gz
bcm5719-llvm-d9f4ffdf5eeb39a7fb3849e339f1c54b1c4418d1.zip
Get the list of PHI node values before the basic block is split. Also, add
PHI node entries for unwind instructions just like for call instructions which became invokes! This fixes PR57, tested by Inline/2003-10-26-InlineInvokeExceptionDestPhi.ll llvm-svn: 9526
Diffstat (limited to 'llvm/lib/Transforms/Utils')
-rw-r--r--llvm/lib/Transforms/Utils/InlineFunction.cpp25
1 files changed, 16 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp
index 735142b78c7..1481324330a 100644
--- a/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -60,6 +60,15 @@ bool InlineFunction(CallSite CS) {
if (InvokeInst *II = dyn_cast<InvokeInst>(TheCall)) {
InvokeDest = II->getExceptionalDest();
+ // If there are PHI nodes in the exceptional destination block, we need to
+ // keep track of which values came into them from this invoke, then remove
+ // the entry for this block.
+ for (BasicBlock::iterator I = InvokeDest->begin();
+ PHINode *PN = dyn_cast<PHINode>(I); ++I) {
+ // Save the value to use for this edge...
+ InvokeDestPHIValues.push_back(PN->getIncomingValueForBlock(OrigBB));
+ }
+
// Add an unconditional branch to make this look like the CallInst case...
BranchInst *NewBr = new BranchInst(II->getNormalDest(), TheCall);
@@ -69,15 +78,6 @@ bool InlineFunction(CallSite CS) {
AfterCallBB = OrigBB->splitBasicBlock(NewBr,
CalledFunc->getName()+".entry");
- // If there are PHI nodes in the exceptional destination block, we need to
- // keep track of which values came into them from this invoke, then remove
- // the entry for this block.
- for (BasicBlock::iterator I = InvokeDest->begin();
- PHINode *PN = dyn_cast<PHINode>(I); ++I) {
- // Save the value to use for this edge...
- InvokeDestPHIValues.push_back(PN->getIncomingValueForBlock(AfterCallBB));
- }
-
// Remove (unlink) the InvokeInst from the function...
OrigBB->getInstList().remove(TheCall);
@@ -240,6 +240,13 @@ bool InlineFunction(CallSite CS) {
// Delete the unwind instruction!
UI->getParent()->getInstList().pop_back();
+
+ // Update any PHI nodes in the exceptional block to indicate that
+ // there is now a new entry in them.
+ unsigned i = 0;
+ for (BasicBlock::iterator I = InvokeDest->begin();
+ PHINode *PN = dyn_cast<PHINode>(I); ++I, ++i)
+ PN->addIncoming(InvokeDestPHIValues[i], BB);
}
}
OpenPOWER on IntegriCloud