From: Cameron Zwarich Date: Wed, 5 Jan 2011 05:47:47 +0000 (+0000) Subject: Use a worklist for later iterations just like ordinary instsimplify. The next X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=08602ab1b4b90e26d406ffb886a685c66270698c;p=oota-llvm.git 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 --- diff --git a/lib/Transforms/Scalar/LoopInstSimplify.cpp b/lib/Transforms/Scalar/LoopInstSimplify.cpp index 848dc402cad..22ec48dde3f 100644 --- a/lib/Transforms/Scalar/LoopInstSimplify.cpp +++ b/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 S1, S2, *ToSimplify = &S1, *Next = &S2; + SmallVector VisitStack; SmallPtrSet 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(*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);