in the old destination block to indicate that the value flows from the new
edge splitting block, not from the original multi-successor block.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3590
91177308-0d34-0410-b5e6-
96231b3b80d8
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/iTerminators.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/iTerminators.h"
+#include "llvm/iPHINode.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Support/CFG.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Support/CFG.h"
// Create a new basic block, linking it into the CFG.
BasicBlock *NewBB = new BasicBlock(TIBB->getName()+"_crit_edge");
// Create a new basic block, linking it into the CFG.
BasicBlock *NewBB = new BasicBlock(TIBB->getName()+"_crit_edge");
+ BasicBlock *DestBB = TI->getSuccessor(SuccNum);
// Create our unconditional branch...
// Create our unconditional branch...
- BranchInst *BI = new BranchInst(TI->getSuccessor(SuccNum));
+ BranchInst *BI = new BranchInst(DestBB);
NewBB->getInstList().push_back(BI);
// Branch to the new block, breaking the edge...
NewBB->getInstList().push_back(BI);
// Branch to the new block, breaking the edge...
Function &F = *TIBB->getParent();
F.getBasicBlockList().insert(TIBB->getNext(), NewBB);
Function &F = *TIBB->getParent();
F.getBasicBlockList().insert(TIBB->getNext(), NewBB);
+ // If there are any PHI nodes in DestBB, we need to update them so that they
+ // merge incoming values from NewBB instead of from TIBB.
+ //
+ for (BasicBlock::iterator I = DestBB->begin();
+ PHINode *PN = dyn_cast<PHINode>(&*I); ++I) {
+ // We no longer enter through TIBB, now we come in through NewBB.
+ PN->replaceUsesOfWith(TIBB, NewBB);
+ }
+
// Now if we have a pass object, update analysis information. Currently we
// update DominatorSet and DominatorTree information if it's available.
//
// Now if we have a pass object, update analysis information. Currently we
// update DominatorSet and DominatorTree information if it's available.
//