diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 15 | 
1 files changed, 14 insertions, 1 deletions
| diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 06a5660f72e..9d883543c80 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/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) { | 

