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

Chris Lattner lattner at cs.uiuc.edu
Tue Aug 16 23:35:28 PDT 2005



Changes in directory llvm/lib/Transforms/Scalar:

LoopStrengthReduce.cpp updated: 1.52 -> 1.53
---
Log message:

Use a new helper to split critical edges, making the code simpler.

Do not claim to not change the CFG.  We do change the cfg to split critical
edges.  This isn't causing us a problem now, but could likely do so in the 
future.


---
Diffs of the changes:  (+21 -18)

 LoopStrengthReduce.cpp |   39 +++++++++++++++++++++------------------
 1 files changed, 21 insertions(+), 18 deletions(-)


Index: llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
diff -u llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.52 llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.53
--- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.52	Mon Aug 15 19:38:11 2005
+++ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp	Wed Aug 17 01:35:16 2005
@@ -119,7 +119,15 @@
     }
 
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-      AU.setPreservesCFG();
+      // We split critical edges, so we change the CFG.  However, we do update
+      // many analyses if they are around.
+      AU.addPreservedID(LoopSimplifyID);
+      AU.addPreserved<LoopInfo>();
+      AU.addPreserved<DominatorSet>();
+      AU.addPreserved<ImmediateDominators>();
+      AU.addPreserved<DominanceFrontier>();
+      AU.addPreserved<DominatorTree>();
+
       AU.addRequiredID(LoopSimplifyID);
       AU.addRequired<LoopInfo>();
       AU.addRequired<DominatorSet>();
@@ -440,25 +448,20 @@
       // code on all predecessor/successor paths.
       if (e != 1 &&
           PN->getIncomingBlock(i)->getTerminator()->getNumSuccessors() > 1) {
-        TerminatorInst *PredTI = PN->getIncomingBlock(i)->getTerminator();
-        for (unsigned Succ = 0; ; ++Succ) {
-          assert(Succ != PredTI->getNumSuccessors() &&"Didn't find successor?");
-          if (PredTI->getSuccessor(Succ) == PN->getParent()) {
-            // First step, split the critical edge.
-            SplitCriticalEdge(PredTI, Succ, P);
+
+        // First step, split the critical edge.
+        SplitCriticalEdge(PN->getIncomingBlock(i), PN->getParent(), P);
             
-            // Next step: move the basic block.  In particular, if the PHI node
-            // is outside of the loop, and PredTI is in the loop, we want to
-            // move the block to be immediately before the PHI block, not
-            // immediately after PredTI.
-            if (L->contains(PredTI->getParent()) &&
-                !L->contains(PN->getParent())) {
-              BasicBlock *NewBB = PN->getIncomingBlock(i);
-              NewBB->moveBefore(PN->getParent());
-            }
-            break;
-          }
+        // Next step: move the basic block.  In particular, if the PHI node
+        // is outside of the loop, and PredTI is in the loop, we want to
+        // move the block to be immediately before the PHI block, not
+        // immediately after PredTI.
+        if (L->contains(PN->getIncomingBlock(i)) &&
+            !L->contains(PN->getParent())) {
+          BasicBlock *NewBB = PN->getIncomingBlock(i);
+          NewBB->moveBefore(PN->getParent());
         }
+        break;
       }
 
       Value *&Code = InsertedCode[PN->getIncomingBlock(i)];






More information about the llvm-commits mailing list