populate instcombine's initial worklist more carefully, causing
authorChris Lattner <sabre@nondot.org>
Sun, 11 Oct 2009 21:04:37 +0000 (21:04 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 11 Oct 2009 21:04:37 +0000 (21:04 +0000)
it to visit instructions from the start of the function to the
end of the function in the first path.  This greatly speeds up
some pathological cases (e.g. PR5150).

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

lib/Transforms/Scalar/InstructionCombining.cpp

index 06a5660f72ec8b8af6e3f45274d30f897074af4c..9d883543c800373594cd2a516febb272fea47be2 100644 (file)
@@ -12681,6 +12681,9 @@ static void AddReachableCodeToWorklist(BasicBlock *BB,
                                        const TargetData *TD) {
   SmallVector<BasicBlock*, 256> Worklist;
   Worklist.push_back(BB);
+  
+  std::vector<Instruction*> InstrsForInstCombineWorklist;
+  InstrsForInstCombineWorklist.reserve(128);
 
   while (!Worklist.empty()) {
     BB = Worklist.back();
@@ -12727,7 +12730,7 @@ static void AddReachableCodeToWorklist(BasicBlock *BB,
         DBI_Prev = 0;
       }
 
-      IC.Worklist.Add(Inst);
+      InstrsForInstCombineWorklist.push_back(Inst);
     }
 
     // Recursively visit successors.  If this is a branch or switch on a
@@ -12759,6 +12762,16 @@ static void AddReachableCodeToWorklist(BasicBlock *BB,
     for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
       Worklist.push_back(TI->getSuccessor(i));
   }
+  
+  // Once we've found all of the instructions to add to instcombine's worklist,
+  // add them in reverse order.  This way instcombine will visit from the top
+  // of the function down.  This jives well with the way that it adds all uses
+  // of instructions to the worklist after doing a transformation, thus avoiding
+  // some N^2 behavior in pathological cases.
+  for (std::vector<Instruction*>::reverse_iterator
+       I = InstrsForInstCombineWorklist.rbegin(),
+       E = InstrsForInstCombineWorklist.rend(); I != E; ++I)
+    IC.Worklist.Add(*I);
 }
 
 bool InstCombiner::DoOneIteration(Function &F, unsigned Iteration) {