diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-08-27 11:37:22 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-08-27 11:37:22 +0000 | 
| commit | 60a9e02f5509f102642299ee408fab21b2ee30e4 (patch) | |
| tree | 02279e399656de08305f3bfeb17e51a2bc5f3ada | |
| parent | 887f197370e1d3969f8fe559d55b146f73f06a3e (diff) | |
Notes
| -rw-r--r-- | lib/Transforms/Scalar/SCCP.cpp | 23 | ||||
| -rw-r--r-- | test/Transforms/SCCP/calltest.ll | 20 | 
2 files changed, 21 insertions, 22 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index da700f18cdaf..f74f28abf85a 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/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/test/Transforms/SCCP/calltest.ll b/test/Transforms/SCCP/calltest.ll index 9dec22f4d1cd..a6c2606cb198 100644 --- a/test/Transforms/SCCP/calltest.ll +++ b/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 +}  | 
