diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp index 64cd1bd2789..cb9ba44600a 100644 --- a/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -13,6 +13,7 @@ #include "InstCombine.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/IR/DataLayout.h" #include "llvm/Support/CallSite.h" @@ -210,6 +211,11 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { return &CI; } + CallSite CS(&CI); + if (Value *V = SimplifyCall(CS.getCalledValue(), CS.arg_begin(), CS.arg_end(), + TD)) + return ReplaceInstUsesWith(CI, V); + IntrinsicInst *II = dyn_cast(&CI); if (!II) return visitCallSite(&CI); diff --git a/test/Transforms/InstCombine/intrinsics.ll b/test/Transforms/InstCombine/intrinsics.ll index f334b3b1e93..6bfea72f419 100644 --- a/test/Transforms/InstCombine/intrinsics.ll +++ b/test/Transforms/InstCombine/intrinsics.ll @@ -152,8 +152,8 @@ entry: ret void ; CHECK: @powi ; CHECK: %A = fdiv double 1.0{{.*}}, %V -; CHECK: store volatile double %A, -; CHECK: store volatile double 1.0 +; CHECK: store volatile double %A, +; CHECK: store volatile double 1.0 ; CHECK: store volatile double %V } @@ -256,3 +256,15 @@ define i32 @cttz_select(i32 %Value) nounwind { ; CHECK: @cttz_select ; CHECK: select i1 %tobool, i32 %cttz, i32 32 } + +; Test that SimplifyCall is getting invoked by InstCombine +declare float @llvm.fabs.f32(float) nounwind readnone +define float @simplify_idempotent(float %a) { +; CHECK: @simplify_idempotent +; CHECK: fabs +; CHECK-NOT: fabs + %a0 = call float @llvm.fabs.f32(float %a) + %a1 = call float @llvm.fabs.f32(float %a0) + + ret float %a1 +} \ No newline at end of file