From 4f303bd4a579cc567879fbd1cf6c7a928fae8210 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 1 Apr 2004 19:06:07 +0000 Subject: [PATCH] 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 --- lib/Transforms/Utils/LoopSimplify.cpp | 31 +++++++++++++++++++-------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/lib/Transforms/Utils/LoopSimplify.cpp b/lib/Transforms/Utils/LoopSimplify.cpp index 120f0297643..bf68b8a7b2c 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(); + // 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.