Fix PR404 try #2
authorChris Lattner <sabre@nondot.org>
Thu, 15 Jul 2004 08:20:22 +0000 (08:20 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 15 Jul 2004 08:20:22 +0000 (08:20 +0000)
This version takes about 1s longer than the previous one (down to 2.35s),
but on the positive side, it actually works :)

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

lib/Transforms/Utils/LoopSimplify.cpp

index b2752089d44614531eb019186060aa1b26e6865b..ada858e1dda18f3f008b3841947f1c0bbb6dd1c2 100644 (file)
@@ -43,6 +43,7 @@
 #include "llvm/Support/CFG.h"
 #include "llvm/Transforms/Utils/Local.h"
 #include "Support/SetOperations.h"
+#include "Support/SetVector.h"
 #include "Support/Statistic.h"
 #include "Support/DepthFirstIterator.h"
 using namespace llvm;
@@ -153,21 +154,20 @@ bool LoopSimplify::ProcessLoop(Loop *L) {
   // predecessors from outside of the loop, split the edge now.
   std::vector<BasicBlock*> ExitBlocks;
   L->getExitBlocks(ExitBlocks);
-  for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
-    BasicBlock *ExitBlock = ExitBlocks[i];
+
+  SetVector<BasicBlock*> ExitBlockSet(ExitBlocks.begin(), ExitBlocks.end());
+  for (SetVector<BasicBlock*>::iterator I = ExitBlockSet.begin(),
+         E = ExitBlockSet.end(); I != E; ++I) {
+    BasicBlock *ExitBlock = *I;
     for (pred_iterator PI = pred_begin(ExitBlock), PE = pred_end(ExitBlock);
          PI != PE; ++PI)
       if (!L->contains(*PI)) {
-        BasicBlock *NewBB = RewriteLoopExitBlock(L, ExitBlock);
-        for (unsigned j = i; j != ExitBlocks.size(); ++j)
-          if (ExitBlocks[j] == ExitBlock)
-            ExitBlocks[j] = NewBB;
-
+        RewriteLoopExitBlock(L, ExitBlock);
         NumInserted++;
         Changed = true;
         break;
       }
-    }
+  }
 
   // If the header has more than two predecessors at this point (from the
   // preheader and from multiple backedges), we must adjust the loop.