Use a new helper to split critical edges, making the code simpler.
authorChris Lattner <sabre@nondot.org>
Wed, 17 Aug 2005 06:35:16 +0000 (06:35 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 17 Aug 2005 06:35:16 +0000 (06:35 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22824 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopStrengthReduce.cpp

index e97e0911c17ad851b83795f0c7226f866c6db552..c8e86d8e9d5a6309771496531e4b952cd8f0658a 100644 (file)
@@ -119,7 +119,15 @@ namespace {
     }
 
     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 @@ void BasedUser::RewriteInstructionToUseNewBase(const SCEVHandle &NewBase,
       // 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)];