aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-10-11 21:04:37 +0000
committerChris Lattner <sabre@nondot.org>2009-10-11 21:04:37 +0000
commit9a12a786b0cb2acf9a87a37d6969064cedc39fd0 (patch)
tree6a7cc5afe3f5be3a5c2aae3b4b02a7b8e4fb8cdf
parent849a639e170ad9ce6fc721a4198547a52fa7d766 (diff)
downloadexternal_llvm-9a12a786b0cb2acf9a87a37d6969064cedc39fd0.zip
external_llvm-9a12a786b0cb2acf9a87a37d6969064cedc39fd0.tar.gz
external_llvm-9a12a786b0cb2acf9a87a37d6969064cedc39fd0.tar.bz2
populate instcombine's initial worklist more carefully, causing
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
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 06a5660..9d88354 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -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) {