diff options
author | Cameron Zwarich <zwarich@apple.com> | 2011-01-05 05:47:47 +0000 |
---|---|---|
committer | Cameron Zwarich <zwarich@apple.com> | 2011-01-05 05:47:47 +0000 |
commit | 5a2bb998ac41a85b5b6dfd04f2c116f2c6891ef8 (patch) | |
tree | 1116e299e506c4edabb64cad0548cb374f251164 /llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp | |
parent | 4c51d122d59145706e3033162d4686da20d9c97a (diff) | |
download | llvm-5a2bb998ac41a85b5b6dfd04f2c116f2c6891ef8.zip llvm-5a2bb998ac41a85b5b6dfd04f2c116f2c6891ef8.tar.gz llvm-5a2bb998ac41a85b5b6dfd04f2c116f2c6891ef8.tar.bz2 |
Use a worklist for later iterations just like ordinary instsimplify. The next
step is to only process instructions in subloops if they have been modified by
an earlier simplification.
llvm-svn: 122869
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp b/llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp index 848dc40..22ec48d 100644 --- a/llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp @@ -66,6 +66,8 @@ bool LoopInstSimplify::runOnLoop(Loop *L, LPPassManager &LPM) { L->getUniqueExitBlocks(ExitBlocks); array_pod_sort(ExitBlocks.begin(), ExitBlocks.end()); + SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2; + SmallVector<BasicBlock*, 16> VisitStack; SmallPtrSet<BasicBlock*, 32> Visited; @@ -86,10 +88,22 @@ bool LoopInstSimplify::runOnLoop(Loop *L, LPPassManager &LPM) { // Simplify instructions in the current basic block. 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 + // empty and we only bother simplifying instructions that are in it. + if (!ToSimplify->empty() && !ToSimplify->count(I)) + continue; + // Don't bother simplifying unused instructions. if (!I->use_empty()) { Value *V = SimplifyInstruction(I, TD, DT); if (V && LI->replacementPreservesLCSSAForm(I, V)) { + // Mark all uses for resimplification next time round the loop. + for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); + UI != UE; ++UI) + Next->insert(cast<Instruction>(*UI)); + I->replaceAllUsesWith(V); LocalChanged = true; ++NumSimplified; @@ -109,6 +123,11 @@ bool LoopInstSimplify::runOnLoop(Loop *L, LPPassManager &LPM) { } } + // Place the list of instructions to simplify on the next loop iteration + // into ToSimplify. + std::swap(ToSimplify, Next); + Next->clear(); + Changed |= LocalChanged; } while (LocalChanged); |