summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2016-08-24 18:10:21 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2016-08-24 18:10:21 +0000
commitff855b60209f3d4bd875abf23b60b12f87fa7280 (patch)
tree4a76461b96d956ab4b03cff5617e35e09380d654 /llvm/lib
parent941bd6bbae6ba1fbf3d46cfb365d1015703ef448 (diff)
downloadbcm5719-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.cpp23
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;
OpenPOWER on IntegriCloud