aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2016-08-24 23:46:52 +0000
committerHans Wennborg <hans@hanshq.net>2016-08-24 23:46:52 +0000
commitce25e1a77e895c7ef32c156f6cff3012f6c5a946 (patch)
tree929c80cbae502b6dd1ff3dadbbbfab797ec354fd
parent08064c20dbafddd026113eb88b49848ed6ba513a (diff)
downloadllvm-llvmorg-3.9.0-rc3.zip
llvm-llvmorg-3.9.0-rc3.tar.gz
llvm-llvmorg-3.9.0-rc3.tar.bz2
------------------------------------------------------------------------ r279647 | sanjoy | 2016-08-24 11:10:21 -0700 (Wed, 24 Aug 2016) | 5 lines [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: 279689
-rw-r--r--llvm/lib/Transforms/Scalar/SCCP.cpp23
-rw-r--r--llvm/test/Transforms/SCCP/calltest.ll20
2 files changed, 21 insertions, 22 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp
index da700f1..f74f28a 100644
--- a/llvm/lib/Transforms/Scalar/SCCP.cpp
+++ b/llvm/lib/Transforms/Scalar/SCCP.cpp
@@ -1538,17 +1538,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.
//
@@ -1597,8 +1586,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;
@@ -1789,10 +1779,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;
diff --git a/llvm/test/Transforms/SCCP/calltest.ll b/llvm/test/Transforms/SCCP/calltest.ll
index 9dec22f..a6c2606 100644
--- a/llvm/test/Transforms/SCCP/calltest.ll
+++ b/llvm/test/Transforms/SCCP/calltest.ll
@@ -1,12 +1,16 @@
-; RUN: opt < %s -sccp -loop-deletion -simplifycfg -S | not grep br
+; RUN: opt < %s -sccp -loop-deletion -simplifycfg -S | FileCheck %s
+declare double @sqrt(double) readnone nounwind
+%empty = type {}
+declare %empty @has_side_effects()
+
+define double @test_0(i32 %param) {
+; CHECK-LABEL: @test_0(
+; CHECK-NOT: br
+entry:
; No matter how hard you try, sqrt(1.0) is always 1.0. This allows the
; optimizer to delete this loop.
-declare double @sqrt(double)
-
-define double @test(i32 %param) {
-entry:
br label %Loop
Loop: ; preds = %Loop, %entry
%I2 = phi i32 [ 0, %entry ], [ %I3, %Loop ] ; <i32> [#uses=1]
@@ -19,3 +23,9 @@ Exit: ; preds = %Loop
ret double %V
}
+define i32 @test_1() {
+; CHECK-LABEL: @test_1(
+; CHECK: call %empty @has_side_effects()
+ %1 = call %empty @has_side_effects()
+ ret i32 0
+}