[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
This commit is contained in:
Sanjoy Das 2016-08-24 18:10:21 +00:00
parent 17526c99b1
commit 08f56c4db3
2 changed files with 21 additions and 22 deletions

View File

@ -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;

View File

@ -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
}