diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-08-29 18:22:25 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-08-29 18:22:25 +0000 | 
| commit | 263f804699810dba5457e37a92db69afe3986601 (patch) | |
| tree | 83e8f45a2b66e9da93f4ed06aa5e23413418a7c5 /llvm/lib/Transforms | |
| parent | 6ac0659a1c989b6408387baa742f4fad5c69a40c (diff) | |
| download | bcm5719-llvm-263f804699810dba5457e37a92db69afe3986601.tar.gz bcm5719-llvm-263f804699810dba5457e37a92db69afe3986601.zip | |
LICM does get dead instructions input to it. Instead of sinking them
out of loops, just delete them.
llvm-svn: 112451
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LICM.cpp | 13 | 
1 files changed, 12 insertions, 1 deletions
| diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp index 5f156dba725..aa842e3183b 100644 --- a/llvm/lib/Transforms/Scalar/LICM.cpp +++ b/llvm/lib/Transforms/Scalar/LICM.cpp @@ -43,6 +43,7 @@  #include "llvm/Analysis/AliasSetTracker.h"  #include "llvm/Analysis/Dominators.h"  #include "llvm/Analysis/ScalarEvolution.h" +#include "llvm/Transforms/Utils/Local.h"  #include "llvm/Transforms/Utils/SSAUpdater.h"  #include "llvm/Support/CFG.h"  #include "llvm/Support/CommandLine.h" @@ -299,7 +300,7 @@ void LICM::SinkRegion(DomTreeNode *N) {    // If this subregion is not in the top level loop at all, exit.    if (!CurLoop->contains(BB)) return; -  // We are processing blocks in reverse dfo, so process children first... +  // We are processing blocks in reverse dfo, so process children first.    const std::vector<DomTreeNode*> &Children = N->getChildren();    for (unsigned i = 0, e = Children.size(); i != e; ++i)      SinkRegion(Children[i]); @@ -310,6 +311,16 @@ void LICM::SinkRegion(DomTreeNode *N) {    for (BasicBlock::iterator II = BB->end(); II != BB->begin(); ) {      Instruction &I = *--II; +     +    // If the instruction is dead, we would try to sink it because it isn't used +    // in the loop, instead, just delete it. +    if (isInstructionTriviallyDead(&I)) { +      ++II; +      CurAST->deleteValue(&I); +      I.eraseFromParent(); +      Changed = true; +      continue; +    }      // Check to see if we can sink this instruction to the exit blocks      // of the loop.  We can do this if the all users of the instruction are | 

