Commit ce25e1a7 authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r279647:

------------------------------------------------------------------------
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
parent 08064c20
Loading
Loading
Loading
Loading
+6 −17
Original line number Diff line number Diff line
@@ -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;
+15 −5
Original line number Diff line number Diff line
; 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
}