Fix PR306: Loop simplify incorrectly updates dominator information
authorChris Lattner <sabre@nondot.org>
Thu, 1 Apr 2004 19:06:07 +0000 (19:06 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 1 Apr 2004 19:06:07 +0000 (19:06 +0000)
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

index 120f0297643a7d1ff5132a35f03263fb71a3d9ec..bf68b8a7b2c1d97f80ed52a2ed7e800dad623d92 100644 (file)
@@ -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.