diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstSimplifyPass.cpp | 38 | 
1 files changed, 17 insertions, 21 deletions
| diff --git a/llvm/lib/Transforms/Scalar/InstSimplifyPass.cpp b/llvm/lib/Transforms/Scalar/InstSimplifyPass.cpp index 6616364ab20..c31d0e74641 100644 --- a/llvm/lib/Transforms/Scalar/InstSimplifyPass.cpp +++ b/llvm/lib/Transforms/Scalar/InstSimplifyPass.cpp @@ -33,37 +33,33 @@ static bool runImpl(Function &F, const SimplifyQuery &SQ,    bool Changed = false;    do { -    for (BasicBlock *BB : depth_first(&F.getEntryBlock())) { -      // Here be subtlety: the iterator must be incremented before the loop -      // body (not sure why), so a range-for loop won't work here. -      for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) { -        Instruction *I = &*BI++; -        // The first time through the loop ToSimplify is empty and we try to -        // simplify all instructions.  On later iterations ToSimplify is not +    for (BasicBlock &BB : F) { +      SmallVector<Instruction *, 8> DeadInstsInBB; +      for (Instruction &I : BB) { +        // The first time through the loop, ToSimplify is empty and we try to +        // simplify all instructions. On later iterations, ToSimplify is not          // empty and we only bother simplifying instructions that are in it. -        if (!ToSimplify->empty() && !ToSimplify->count(I)) +        if (!ToSimplify->empty() && !ToSimplify->count(&I))            continue; -        // Don't waste time simplifying unused instructions. -        if (!I->use_empty()) { -          if (Value *V = SimplifyInstruction(I, SQ, ORE)) { +        // Don't waste time simplifying dead/unused instructions. +        if (isInstructionTriviallyDead(&I)) { +          DeadInstsInBB.push_back(&I); +        } else if (!I.use_empty()) { +          if (Value *V = SimplifyInstruction(&I, SQ, ORE)) {              // Mark all uses for resimplification next time round the loop. -            for (User *U : I->users()) +            for (User *U : I.users())                Next->insert(cast<Instruction>(U)); -            I->replaceAllUsesWith(V); +            I.replaceAllUsesWith(V);              ++NumSimplified;              Changed = true; +            // A call can get simplified, but it may not be trivially dead. +            if (isInstructionTriviallyDead(&I)) +              DeadInstsInBB.push_back(&I);            }          } -        if (RecursivelyDeleteTriviallyDeadInstructions(I, SQ.TLI)) { -          // RecursivelyDeleteTriviallyDeadInstruction can remove more than one -          // instruction, so simply incrementing the iterator does not work. -          // When instructions get deleted re-iterate instead. -          BI = BB->begin(); -          BE = BB->end(); -          Changed = true; -        }        } +      RecursivelyDeleteTriviallyDeadInstructions(DeadInstsInBB, SQ.TLI);      }      // Place the list of instructions to simplify on the next loop iteration | 

