diff options
author | Chris Lattner <sabre@nondot.org> | 2005-08-03 18:51:44 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-08-03 18:51:44 +0000 |
commit | f1adce42b26c5986306341eb8a7cec0d16e190f1 (patch) | |
tree | d93dbc29161cf257fdd3fc1aa86480ffe9327cdf /lib/Transforms/Utils/LowerInvoke.cpp | |
parent | 999b814a6d3abec19de9692e2ded7d4124af636f (diff) |
The correct fix for PR612, which also fixes
Transforms/LowerInvoke/2005-08-03-InvokeWithPHIUse.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22628 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/LowerInvoke.cpp')
-rw-r--r-- | lib/Transforms/Utils/LowerInvoke.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/Transforms/Utils/LowerInvoke.cpp b/lib/Transforms/Utils/LowerInvoke.cpp index 96d5b98c6b..b0d8fb8a30 100644 --- a/lib/Transforms/Utils/LowerInvoke.cpp +++ b/lib/Transforms/Utils/LowerInvoke.cpp @@ -283,10 +283,20 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) { // Create the receiver block if there is a critical edge to the normal // destination. SplitCriticalEdge(II, 0, this); - BasicBlock::iterator InsertLoc = II->getNormalDest()->begin(); - while (isa<PHINode>(InsertLoc)) ++InsertLoc; + // There should not be any PHI nodes in II->getNormalDest() now. It has + // a single predecessor, so any PHI nodes are unneeded. Remove them now + // by replacing them with their single input value. + assert(II->getNormalDest()->getSinglePredecessor() && + "Split crit edge doesn't have a single predecessor!"); + BasicBlock::iterator InsertLoc = II->getNormalDest()->begin(); + while (PHINode *PN = dyn_cast<PHINode>(InsertLoc)) { + PN->replaceAllUsesWith(PN->getIncomingValue(0)); + PN->eraseFromParent(); + InsertLoc = II->getNormalDest()->begin(); + } + // Insert a normal call instruction on the normal execution path. std::string Name = II->getName(); II->setName(""); CallInst *NewCall = new CallInst(II->getCalledValue(), |