diff options
| author | Owen Anderson <resistor@mac.com> | 2010-12-23 20:57:35 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2010-12-23 20:57:35 +0000 |
| commit | 5d690d4168ae24e22723330be10fa006b2ff072e (patch) | |
| tree | 515ad00a5d3cf36c3132be52bf052c57fb1bd11f /llvm/lib/Transforms | |
| parent | 31c39dac6db4423546e3018ad75b409870f07ea8 (diff) | |
| download | bcm5719-llvm-5d690d4168ae24e22723330be10fa006b2ff072e.tar.gz bcm5719-llvm-5d690d4168ae24e22723330be10fa006b2ff072e.zip | |
It is possible for SimplifyCFG to cause PHI nodes to become redundant too late in the optimization
pipeline to be caught by instcombine, and it's not feasible to catch them in SimplifyCFG because the
use-lists are in an inconsistent state at the point where it could know that it need to simplify them.
Instead, have CodeGenPrepare look for trivially redundant PHIs as part of its general cleanup effort.
llvm-svn: 122516
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp index 60c7f7565eb..1f0930df06c 100644 --- a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -22,6 +22,7 @@ #include "llvm/Instructions.h" #include "llvm/IntrinsicInst.h" #include "llvm/Pass.h" +#include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/ProfileInfo.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetLowering.h" @@ -959,7 +960,15 @@ bool CodeGenPrepare::OptimizeBlock(BasicBlock &BB) { for (BasicBlock::iterator BBI = BB.begin(), E = BB.end(); BBI != E; ) { Instruction *I = BBI++; - if (CastInst *CI = dyn_cast<CastInst>(I)) { + if (PHINode *P = dyn_cast<PHINode>(I)) { + // It is possible for very late stage optimizations (such as SimplifyCFG) + // to introduce PHI nodes too late to be cleaned up. If we detect such a + // trivial PHI, go ahead and zap it here. + if (Value *V = SimplifyInstruction(P)) { + P->replaceAllUsesWith(V); + P->eraseFromParent(); + } + } else if (CastInst *CI = dyn_cast<CastInst>(I)) { // If the source of the cast is a constant, then this should have // already been constant folded. The only reason NOT to constant fold // it is if something (e.g. LSR) was careful to place the constant |

