[llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopSimplify.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Mar 16 00:01:03 PST 2004


Changes in directory llvm/lib/Transforms/Scalar:

LoopSimplify.cpp updated: 1.36 -> 1.37

---
Log message:

Fix a regression from this patch:
http://mail.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20040308/013095.html

Basically, this patch only updated the immediate dominatees of the header node
to tell them that the preheader also dominated them.  In practice, ALL 
dominatees of the header node are also dominated by the preheader.

This fixes: LoopSimplify/2004-03-15-IncorrectDomUpdate.
and PR293: http://llvm.cs.uiuc.edu/PR293 



---
Diffs of the changes:  (+13 -16)

Index: llvm/lib/Transforms/Scalar/LoopSimplify.cpp
diff -u llvm/lib/Transforms/Scalar/LoopSimplify.cpp:1.36 llvm/lib/Transforms/Scalar/LoopSimplify.cpp:1.37
--- llvm/lib/Transforms/Scalar/LoopSimplify.cpp:1.36	Sat Mar 13 21:59:22 2004
+++ llvm/lib/Transforms/Scalar/LoopSimplify.cpp	Tue Mar 16 00:00:15 2004
@@ -312,31 +312,28 @@
   
   DominatorSet &DS = getAnalysis<DominatorSet>();  // Update dominator info
   DominatorTree &DT = getAnalysis<DominatorTree>();
-  DominatorTree::Node *HeaderDTNode = DT.getNode(Header);
+    
+
+  // Update the dominator tree information.
+  // The immediate dominator of the preheader is the immediate dominator of
+  // the old header.
+  DominatorTree::Node *PHDomTreeNode =
+    DT.createNewNode(NewBB, DT.getNode(Header)->getIDom());
+
+  // Change the header node so that PNHode is the new immediate dominator
+  DT.changeImmediateDominator(DT.getNode(Header), PHDomTreeNode);
 
   {
     // The blocks that dominate NewBB are the blocks that dominate Header,
     // minus Header, plus NewBB.
     DominatorSet::DomSetType DomSet = DS.getDominators(Header);
-    DomSet.insert(NewBB);  // We dominate ourself
     DomSet.erase(Header);  // Header does not dominate us...
     DS.addBasicBlock(NewBB, DomSet);
 
     // The newly created basic block dominates all nodes dominated by Header.
-    for (DominatorTree::Node::iterator I = HeaderDTNode->begin(),
-           E = HeaderDTNode->end(); I != E; ++I)
-      DS.addDominator((*I)->getBlock(), NewBB);
-  }
-
-  { // Update the dominator tree information.
-    // The immediate dominator of the preheader is the immediate dominator of
-    // the old header.
-    //
-    DominatorTree::Node *PHNode =
-      DT.createNewNode(NewBB, HeaderDTNode->getIDom());
-    
-    // Change the header node so that PNHode is the new immediate dominator
-    DT.changeImmediateDominator(HeaderDTNode, PHNode);
+    for (df_iterator<DominatorTree::Node*> DFI = df_begin(PHDomTreeNode),
+           E = df_end(PHDomTreeNode); DFI != E; ++DFI)
+      DS.addDominator((*DFI)->getBlock(), NewBB);
   }
   
   // Update immediate dominator information if we have it...





More information about the llvm-commits mailing list