aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-04-01 19:06:07 +0000
committerChris Lattner <sabre@nondot.org>2004-04-01 19:06:07 +0000
commit4f303bd4a579cc567879fbd1cf6c7a928fae8210 (patch)
tree05564f5605927fbea4f60b9587de61e35459792f /lib
parentafd5e2fdecdcb93b3ad4fd6e5b86555e3c251714 (diff)
Fix PR306: Loop simplify incorrectly updates dominator information
Testcase: LoopSimplify/2004-04-01-IncorrectDomUpdate.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12592 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/Utils/LoopSimplify.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/lib/Transforms/Utils/LoopSimplify.cpp b/lib/Transforms/Utils/LoopSimplify.cpp
index 120f029764..bf68b8a7b2 100644
--- a/lib/Transforms/Utils/LoopSimplify.cpp
+++ b/lib/Transforms/Utils/LoopSimplify.cpp
@@ -530,9 +530,19 @@ void LoopSimplify::UpdateDomInfoForRevectoredPreds(BasicBlock *NewBB,
BasicBlock *NewBBSucc = *succ_begin(NewBB);
DominatorSet &DS = getAnalysis<DominatorSet>();
+ // Update dominator information... The blocks that dominate NewBB are the
+ // intersection of the dominators of predecessors, plus the block itself.
+ //
+ DominatorSet::DomSetType NewBBDomSet = DS.getDominators(PredBlocks[0]);
+ for (unsigned i = 1, e = PredBlocks.size(); i != e; ++i)
+ set_intersect(NewBBDomSet, DS.getDominators(PredBlocks[i]));
+ NewBBDomSet.insert(NewBB); // All blocks dominate themselves...
+ DS.addBasicBlock(NewBB, NewBBDomSet);
+
// The newly inserted basic block will dominate existing basic blocks iff the
// PredBlocks dominate all of the non-pred blocks. If all predblocks dominate
// the non-pred blocks, then they all must be the same block!
+ //
bool NewBBDominatesNewBBSucc = true;
{
BasicBlock *OnePred = PredBlocks[0];
@@ -551,15 +561,18 @@ void LoopSimplify::UpdateDomInfoForRevectoredPreds(BasicBlock *NewBB,
}
}
- // Update dominator information... The blocks that dominate NewBB are the
- // intersection of the dominators of predecessors, plus the block itself.
- // The newly created basic block does not dominate anything except itself.
- //
- DominatorSet::DomSetType NewBBDomSet = DS.getDominators(PredBlocks[0]);
- for (unsigned i = 1, e = PredBlocks.size(); i != e; ++i)
- set_intersect(NewBBDomSet, DS.getDominators(PredBlocks[i]));
- NewBBDomSet.insert(NewBB); // All blocks dominate themselves...
- DS.addBasicBlock(NewBB, NewBBDomSet);
+ // The other scenario where the new block can dominate its successors are when
+ // all predecessors of NewBBSucc that are not NewBB are dominated by NewBBSucc
+ // already.
+ if (!NewBBDominatesNewBBSucc) {
+ NewBBDominatesNewBBSucc = true;
+ for (pred_iterator PI = pred_begin(NewBBSucc), E = pred_end(NewBBSucc);
+ PI != E; ++PI)
+ if (*PI != NewBB && !DS.dominates(NewBBSucc, *PI)) {
+ NewBBDominatesNewBBSucc = false;
+ break;
+ }
+ }
// If NewBB dominates some blocks, then it will dominate all blocks that
// NewBBSucc does.