diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-08-24 18:10:21 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-08-24 18:10:21 +0000 |
commit | ff855b60209f3d4bd875abf23b60b12f87fa7280 (patch) | |
tree | 4a76461b96d956ab4b03cff5617e35e09380d654 /llvm/lib | |
parent | 941bd6bbae6ba1fbf3d46cfb365d1015703ef448 (diff) | |
download | bcm5719-llvm-ff855b60209f3d4bd875abf23b60b12f87fa7280.tar.gz bcm5719-llvm-ff855b60209f3d4bd875abf23b60b12f87fa7280.zip |
[SCCP] Don't delete side-effecting instructions
I'm not sure if the `!isa<CallInst>(Inst) &&
!isa<TerminatorInst>(Inst))` bit is correct either, but this fixes the
case we know is broken.
llvm-svn: 279647
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/SCCP.cpp | 23 |
1 files changed, 6 insertions, 17 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index 9025a04413e..eeb36bb56a1 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -1559,17 +1559,6 @@ static bool tryToReplaceWithConstant(SCCPSolver &Solver, Value *V) { return true; } -static bool tryToReplaceInstWithConstant(SCCPSolver &Solver, Instruction *Inst, - bool shouldEraseFromParent) { - if (!tryToReplaceWithConstant(Solver, Inst)) - return false; - - // Delete the instruction. - if (shouldEraseFromParent) - Inst->eraseFromParent(); - return true; -} - // runSCCP() - Run the Sparse Conditional Constant Propagation algorithm, // and return true if the function was modified. // @@ -1618,8 +1607,9 @@ static bool runSCCP(Function &F, const DataLayout &DL, if (Inst->getType()->isVoidTy() || isa<TerminatorInst>(Inst)) continue; - if (tryToReplaceInstWithConstant(Solver, Inst, - true /* shouldEraseFromParent */)) { + if (tryToReplaceWithConstant(Solver, Inst)) { + if (isInstructionTriviallyDead(Inst)) + Inst->eraseFromParent(); // Hey, we just changed something! MadeChanges = true; ++NumInstRemoved; @@ -1823,10 +1813,9 @@ static bool runIPSCCP(Module &M, const DataLayout &DL, Instruction *Inst = &*BI++; if (Inst->getType()->isVoidTy()) continue; - if (tryToReplaceInstWithConstant( - Solver, Inst, - !isa<CallInst>(Inst) && - !isa<TerminatorInst>(Inst) /* shouldEraseFromParent */)) { + if (tryToReplaceWithConstant(Solver, Inst)) { + if (!isa<CallInst>(Inst) && !isa<TerminatorInst>(Inst)) + Inst->eraseFromParent(); // Hey, we just changed something! MadeChanges = true; ++IPNumInstRemoved; |