[llvm-commits] [llvm] r122343 - /llvm/trunk/lib/Transforms/Utils/SimplifyInstructions.cpp

Chris Lattner clattner at apple.com
Tue Dec 21 09:16:03 PST 2010


On Dec 21, 2010, at 9:08 AM, Duncan Sands wrote:

> Author: baldrick
> Date: Tue Dec 21 11:08:55 2010
> New Revision: 122343
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=122343&view=rev
> Log:
> Visit instructions deterministically.  Use a FIFO so as to approximately
> visit instructions before their uses, since InstructionSimplify does a
> better job in that case.  All this prompted by Frits van Bommel.

Ok.  If you're going to delay deleting instructions, it might be worthwhile to drop their operands so that "dead" instructions don't cause hasOneUse() checks to fail.

-Chris

> 
> Modified:
>    llvm/trunk/lib/Transforms/Utils/SimplifyInstructions.cpp
> 
> Modified: llvm/trunk/lib/Transforms/Utils/SimplifyInstructions.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyInstructions.cpp?rev=122343&r1=122342&r2=122343&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/SimplifyInstructions.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/SimplifyInstructions.cpp Tue Dec 21 11:08:55 2010
> @@ -24,6 +24,7 @@
> #include "llvm/Target/TargetData.h"
> #include "llvm/Transforms/Scalar.h"
> #include "llvm/Transforms/Utils/Local.h"
> +#include <queue>
> using namespace llvm;
> 
> STATISTIC(NumSimplified, "Number of redundant instructions removed");
> @@ -45,8 +46,9 @@
>       const DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
>       bool Changed = false;
> 
> -      // Add all interesting instructions to the worklist.
> -      std::set<Instruction*> Worklist;
> +      // Add all interesting instructions to the worklist.  These are processed
> +      // in FIFO order, so instructions are usually visited before their uses.
> +      std::queue<Instruction*> Worklist;
>       for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
>         for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) {
>           Instruction *I = BI++;
> @@ -57,30 +59,38 @@
>             continue;
>           }
>           // Add all others to the worklist.
> -          Worklist.insert(I);
> +          Worklist.push(I);
>         }
> 
>       // Simplify everything in the worklist until the cows come home.
>       while (!Worklist.empty()) {
> -        Instruction *I = *Worklist.begin();
> -        Worklist.erase(Worklist.begin());
> +        Instruction *I = Worklist.front();
> +        Worklist.pop();
> +        // Don't bother simplifying unused instructions.
> +        if (I->use_empty()) continue;
>         Value *V = SimplifyInstruction(I, TD, DT);
>         if (!V) continue;
> 
>         // This instruction simplifies!  Replace it with its simplification and
>         // add all uses to the worklist, since they may now simplify.
> +        ++NumSimplified;
>         I->replaceAllUsesWith(V);
>         for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
>              UI != UE; ++UI)
> -          // In unreachable code an instruction can use itself, in which case
> -          // don't add it to the worklist since we are about to erase it.
> -          if (*UI != I) Worklist.insert(cast<Instruction>(*UI));
> -        if (isInstructionTriviallyDead(I))
> -          I->eraseFromParent();
> -        ++NumSimplified;
> +          Worklist.push(cast<Instruction>(*UI));
>         Changed = true;
>       }
> 
> +      // Finally, run over the function zapping any dead instructions.
> +      for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
> +        for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) {
> +          Instruction *I = BI++;
> +          if (isInstructionTriviallyDead(I)) {
> +            I->eraseFromParent();
> +            Changed = true;
> +          }
> +        }
> +
>       return Changed;
>     }
>   };
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list