From e8e320d2faa997605c76a7c3ab9e9b4fb578e8c0 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 25 Feb 2002 00:35:07 +0000 Subject: [PATCH] Fix bug: test/Regression/Other/2002-02-24-InlineBrokePHINodes.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1798 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/BasicBlock.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lib/VMCore/BasicBlock.cpp b/lib/VMCore/BasicBlock.cpp index 222bb140193..45ae72bc1e0 100644 --- a/lib/VMCore/BasicBlock.cpp +++ b/lib/VMCore/BasicBlock.cpp @@ -155,5 +155,25 @@ BasicBlock *BasicBlock::splitBasicBlock(iterator I) { // Add a branch instruction to the newly formed basic block. InstList.push_back(new BranchInst(New)); + + // Now we must loop through all of the successors of the New block (which + // _were_ the successors of the 'this' block), and update any PHI nodes in + // successors. If there were PHI nodes in the successors, then they need to + // know that incoming branches will be from New, not from Old. + // + for (BasicBlock::succ_iterator I = succ_begin(New), E = succ_end(New); + I != E; ++I) { + // Loop over any phi nodes in the basic block, updating the BB field of + // incoming values... + BasicBlock *Successor = *I; + for (BasicBlock::iterator II = Successor->begin(); + PHINode *PN = dyn_cast(*II); ++II) { + int IDX = PN->getBasicBlockIndex(this); + while (IDX != -1) { + PN->setIncomingBlock((unsigned)IDX, New); + IDX = PN->getBasicBlockIndex(this); + } + } + } return New; }