mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-20 10:24:12 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122869 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -66,6 +66,8 @@ bool LoopInstSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||||||
L->getUniqueExitBlocks(ExitBlocks);
|
L->getUniqueExitBlocks(ExitBlocks);
|
||||||
array_pod_sort(ExitBlocks.begin(), ExitBlocks.end());
|
array_pod_sort(ExitBlocks.begin(), ExitBlocks.end());
|
||||||
|
|
||||||
|
SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2;
|
||||||
|
|
||||||
SmallVector<BasicBlock*, 16> VisitStack;
|
SmallVector<BasicBlock*, 16> VisitStack;
|
||||||
SmallPtrSet<BasicBlock*, 32> Visited;
|
SmallPtrSet<BasicBlock*, 32> Visited;
|
||||||
|
|
||||||
@ -86,10 +88,22 @@ bool LoopInstSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||||||
// Simplify instructions in the current basic block.
|
// Simplify instructions in the current basic block.
|
||||||
for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) {
|
for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) {
|
||||||
Instruction *I = BI++;
|
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.
|
// Don't bother simplifying unused instructions.
|
||||||
if (!I->use_empty()) {
|
if (!I->use_empty()) {
|
||||||
Value *V = SimplifyInstruction(I, TD, DT);
|
Value *V = SimplifyInstruction(I, TD, DT);
|
||||||
if (V && LI->replacementPreservesLCSSAForm(I, V)) {
|
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);
|
I->replaceAllUsesWith(V);
|
||||||
LocalChanged = true;
|
LocalChanged = true;
|
||||||
++NumSimplified;
|
++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;
|
Changed |= LocalChanged;
|
||||||
} while (LocalChanged);
|
} while (LocalChanged);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user