diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2015-12-14 21:59:03 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2015-12-14 21:59:03 +0000 |
| commit | fa54acedd1fd1183143c0a7f4b77554fd8cdb1ec (patch) | |
| tree | 6e7cbff67fd8ec8795d8a0cb7a4e3f1d00a92302 /llvm/test/Transforms/InstCombine | |
| parent | 46642ffeebde1743980735e96303140f5f1a7b8b (diff) | |
| download | bcm5719-llvm-fa54acedd1fd1183143c0a7f4b77554fd8cdb1ec.tar.gz bcm5719-llvm-fa54acedd1fd1183143c0a7f4b77554fd8cdb1ec.zip | |
add fast-math-flags to 'call' instructions (PR21290)
This patch adds optional fast-math-flags (the same that apply to fmul/fadd/fsub/fdiv/frem/fcmp)
to call instructions in IR. Follow-up patches would use these flags in LibCallSimplifier, add
support to clang, and extend FMF to the DAG for calls.
Motivating example:
%y = fmul fast float %x, %x
%z = tail call float @sqrtf(float %y)
We'd like to be able to optimize sqrt(x*x) into fabs(x). We do this today using a function-wide
attribute for unsafe-math, but we really want to trigger on the instructions themselves:
%z = tail call fast float @sqrtf(float %y)
because in an LTO build it's possible that calls with fast semantics have been inlined into a
function with non-fast semantics.
The code changes and tests are based on the recent commits that added "notail":
http://reviews.llvm.org/rL252368
and added FMF to fcmp:
http://reviews.llvm.org/rL241901
Differential Revision: http://reviews.llvm.org/D14707
llvm-svn: 255555
Diffstat (limited to 'llvm/test/Transforms/InstCombine')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/fast-math.ll | 34 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/inline-intrinsic-assert.ll | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/log-pow.ll | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/no_cgscc_assert.ll | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/pow-exp.ll | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/pow-exp2.ll | 2 |
6 files changed, 22 insertions, 22 deletions
diff --git a/llvm/test/Transforms/InstCombine/fast-math.ll b/llvm/test/Transforms/InstCombine/fast-math.ll index 06852497564..fd563481b3e 100644 --- a/llvm/test/Transforms/InstCombine/fast-math.ll +++ b/llvm/test/Transforms/InstCombine/fast-math.ll @@ -570,7 +570,7 @@ define double @sqrt_intrinsic_arg_squared(double %x) #0 { ret double %sqrt ; CHECK-LABEL: sqrt_intrinsic_arg_squared( -; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) +; CHECK-NEXT: %fabs = call fast double @llvm.fabs.f64(double %x) ; CHECK-NEXT: ret double %fabs } @@ -584,8 +584,8 @@ define double @sqrt_intrinsic_three_args1(double %x, double %y) #0 { ret double %sqrt ; CHECK-LABEL: sqrt_intrinsic_three_args1( -; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) -; CHECK-NEXT: %sqrt1 = call double @llvm.sqrt.f64(double %y) +; CHECK-NEXT: %fabs = call fast double @llvm.fabs.f64(double %x) +; CHECK-NEXT: %sqrt1 = call fast double @llvm.sqrt.f64(double %y) ; CHECK-NEXT: %1 = fmul fast double %fabs, %sqrt1 ; CHECK-NEXT: ret double %1 } @@ -597,8 +597,8 @@ define double @sqrt_intrinsic_three_args2(double %x, double %y) #0 { ret double %sqrt ; CHECK-LABEL: sqrt_intrinsic_three_args2( -; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) -; CHECK-NEXT: %sqrt1 = call double @llvm.sqrt.f64(double %y) +; CHECK-NEXT: %fabs = call fast double @llvm.fabs.f64(double %x) +; CHECK-NEXT: %sqrt1 = call fast double @llvm.sqrt.f64(double %y) ; CHECK-NEXT: %1 = fmul fast double %fabs, %sqrt1 ; CHECK-NEXT: ret double %1 } @@ -610,8 +610,8 @@ define double @sqrt_intrinsic_three_args3(double %x, double %y) #0 { ret double %sqrt ; CHECK-LABEL: sqrt_intrinsic_three_args3( -; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) -; CHECK-NEXT: %sqrt1 = call double @llvm.sqrt.f64(double %y) +; CHECK-NEXT: %fabs = call fast double @llvm.fabs.f64(double %x) +; CHECK-NEXT: %sqrt1 = call fast double @llvm.sqrt.f64(double %y) ; CHECK-NEXT: %1 = fmul fast double %fabs, %sqrt1 ; CHECK-NEXT: ret double %1 } @@ -623,8 +623,8 @@ define double @sqrt_intrinsic_three_args4(double %x, double %y) #0 { ret double %sqrt ; CHECK-LABEL: sqrt_intrinsic_three_args4( -; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) -; CHECK-NEXT: %sqrt1 = call double @llvm.sqrt.f64(double %y) +; CHECK-NEXT: %fabs = call fast double @llvm.fabs.f64(double %x) +; CHECK-NEXT: %sqrt1 = call fast double @llvm.sqrt.f64(double %y) ; CHECK-NEXT: %1 = fmul fast double %fabs, %sqrt1 ; CHECK-NEXT: ret double %1 } @@ -636,8 +636,8 @@ define double @sqrt_intrinsic_three_args5(double %x, double %y) #0 { ret double %sqrt ; CHECK-LABEL: sqrt_intrinsic_three_args5( -; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) -; CHECK-NEXT: %sqrt1 = call double @llvm.sqrt.f64(double %y) +; CHECK-NEXT: %fabs = call fast double @llvm.fabs.f64(double %x) +; CHECK-NEXT: %sqrt1 = call fast double @llvm.sqrt.f64(double %y) ; CHECK-NEXT: %1 = fmul fast double %fabs, %sqrt1 ; CHECK-NEXT: ret double %1 } @@ -649,8 +649,8 @@ define double @sqrt_intrinsic_three_args6(double %x, double %y) #0 { ret double %sqrt ; CHECK-LABEL: sqrt_intrinsic_three_args6( -; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) -; CHECK-NEXT: %sqrt1 = call double @llvm.sqrt.f64(double %y) +; CHECK-NEXT: %fabs = call fast double @llvm.fabs.f64(double %x) +; CHECK-NEXT: %sqrt1 = call fast double @llvm.sqrt.f64(double %y) ; CHECK-NEXT: %1 = fmul fast double %fabs, %sqrt1 ; CHECK-NEXT: ret double %1 } @@ -675,7 +675,7 @@ define double @sqrt_intrinsic_arg_5th(double %x) #0 { ; CHECK-LABEL: sqrt_intrinsic_arg_5th( ; CHECK-NEXT: %mul = fmul fast double %x, %x -; CHECK-NEXT: %sqrt1 = call double @llvm.sqrt.f64(double %x) +; CHECK-NEXT: %sqrt1 = call fast double @llvm.sqrt.f64(double %x) ; CHECK-NEXT: %1 = fmul fast double %mul, %sqrt1 ; CHECK-NEXT: ret double %1 } @@ -692,7 +692,7 @@ define float @sqrt_call_squared_f32(float %x) #0 { ret float %sqrt ; CHECK-LABEL: sqrt_call_squared_f32( -; CHECK-NEXT: %fabs = call float @llvm.fabs.f32(float %x) +; CHECK-NEXT: %fabs = call fast float @llvm.fabs.f32(float %x) ; CHECK-NEXT: ret float %fabs } @@ -702,7 +702,7 @@ define double @sqrt_call_squared_f64(double %x) #0 { ret double %sqrt ; CHECK-LABEL: sqrt_call_squared_f64( -; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) +; CHECK-NEXT: %fabs = call fast double @llvm.fabs.f64(double %x) ; CHECK-NEXT: ret double %fabs } @@ -712,7 +712,7 @@ define fp128 @sqrt_call_squared_f128(fp128 %x) #0 { ret fp128 %sqrt ; CHECK-LABEL: sqrt_call_squared_f128( -; CHECK-NEXT: %fabs = call fp128 @llvm.fabs.f128(fp128 %x) +; CHECK-NEXT: %fabs = call fast fp128 @llvm.fabs.f128(fp128 %x) ; CHECK-NEXT: ret fp128 %fabs } diff --git a/llvm/test/Transforms/InstCombine/inline-intrinsic-assert.ll b/llvm/test/Transforms/InstCombine/inline-intrinsic-assert.ll index af34277563e..c6446d43cff 100644 --- a/llvm/test/Transforms/InstCombine/inline-intrinsic-assert.ll +++ b/llvm/test/Transforms/InstCombine/inline-intrinsic-assert.ll @@ -9,7 +9,7 @@ define float @foo(float %f1) #0 { ret float %call ; CHECK-LABEL: @foo( -; CHECK-NEXT: call float @llvm.fabs.f32 +; CHECK-NEXT: call fast float @llvm.fabs.f32 ; CHECK-NEXT: ret float } diff --git a/llvm/test/Transforms/InstCombine/log-pow.ll b/llvm/test/Transforms/InstCombine/log-pow.ll index 1acd0354431..c5ca1688d34 100644 --- a/llvm/test/Transforms/InstCombine/log-pow.ll +++ b/llvm/test/Transforms/InstCombine/log-pow.ll @@ -8,7 +8,7 @@ entry: } ; CHECK-LABEL: define double @mylog( -; CHECK: %log = call double @log(double %x) #0 +; CHECK: %log = call fast double @log(double %x) #0 ; CHECK: %mul = fmul fast double %log, %y ; CHECK: ret double %mul ; CHECK: } diff --git a/llvm/test/Transforms/InstCombine/no_cgscc_assert.ll b/llvm/test/Transforms/InstCombine/no_cgscc_assert.ll index cec5297695b..3df04d2c890 100644 --- a/llvm/test/Transforms/InstCombine/no_cgscc_assert.ll +++ b/llvm/test/Transforms/InstCombine/no_cgscc_assert.ll @@ -10,7 +10,7 @@ define float @bar(float %f) #0 { ret float %call1 ; CHECK-LABEL: @bar( -; CHECK-NEXT: call float @llvm.fabs.f32 +; CHECK-NEXT: call fast float @llvm.fabs.f32 ; CHECK-NEXT: ret float } diff --git a/llvm/test/Transforms/InstCombine/pow-exp.ll b/llvm/test/Transforms/InstCombine/pow-exp.ll index 7ac6fe4f8fd..acc512734ec 100644 --- a/llvm/test/Transforms/InstCombine/pow-exp.ll +++ b/llvm/test/Transforms/InstCombine/pow-exp.ll @@ -9,7 +9,7 @@ entry: ; CHECK-LABEL: define double @mypow( ; CHECK: %mul = fmul fast double %x, %y -; CHECK: %exp = call double @exp(double %mul) #0 +; CHECK: %exp = call fast double @exp(double %mul) #0 ; CHECK: ret double %exp ; CHECK: } diff --git a/llvm/test/Transforms/InstCombine/pow-exp2.ll b/llvm/test/Transforms/InstCombine/pow-exp2.ll index ad7931c07a6..c42cab391e6 100644 --- a/llvm/test/Transforms/InstCombine/pow-exp2.ll +++ b/llvm/test/Transforms/InstCombine/pow-exp2.ll @@ -9,7 +9,7 @@ entry: ; CHECK-LABEL: define double @mypow( ; CHECK: %mul = fmul fast double %x, %y -; CHECK: %exp2 = call double @exp2(double %mul) #0 +; CHECK: %exp2 = call fast double @exp2(double %mul) #0 ; CHECK: ret double %exp2 ; CHECK: } |

