summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/CriticalEdge.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-09-06 03:51:45 +0000
committerChris Lattner <sabre@nondot.org>2002-09-06 03:51:45 +0000
commit50dd6724a26577b63d653a430911784dc1a3f408 (patch)
treecb1d20d736ba1ccd50f65f6cac59110e1f6ac9a8 /llvm/lib/Transforms/Utils/CriticalEdge.cpp
parentbcf337b0a6c5d957247fc604c30f60ac7f08c292 (diff)
downloadbcm5719-llvm-50dd6724a26577b63d653a430911784dc1a3f408.tar.gz
bcm5719-llvm-50dd6724a26577b63d653a430911784dc1a3f408.zip
Fix bug with critical edge splitting code where it wouldn't update PHI nodes
in the old destination block to indicate that the value flows from the new edge splitting block, not from the original multi-successor block. llvm-svn: 3590
Diffstat (limited to 'llvm/lib/Transforms/Utils/CriticalEdge.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/CriticalEdge.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/CriticalEdge.cpp b/llvm/lib/Transforms/Utils/CriticalEdge.cpp
index 07a3a542e55..35eac3f34d6 100644
--- a/llvm/lib/Transforms/Utils/CriticalEdge.cpp
+++ b/llvm/lib/Transforms/Utils/CriticalEdge.cpp
@@ -7,6 +7,7 @@
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/iTerminators.h"
+#include "llvm/iPHINode.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Support/CFG.h"
@@ -38,9 +39,9 @@ void SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P) {
// 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...
- 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...
@@ -50,6 +51,15 @@ void SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P) {
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.
//
OpenPOWER on IntegriCloud