diff options
author | Justin Lebar <jlebar@google.com> | 2017-01-10 23:43:04 +0000 |
---|---|---|
committer | Justin Lebar <jlebar@google.com> | 2017-01-10 23:43:04 +0000 |
commit | 7d81813d76ded4b84456f18f01b43424c7e6d57d (patch) | |
tree | 4a365de86b6f19fec247f6ee2df178b7979a5962 /llvm/test | |
parent | c1e2d97a2cd8a58db1d064de7934f0212f3c9511 (diff) | |
download | bcm5719-llvm-7d81813d76ded4b84456f18f01b43424c7e6d57d.tar.gz bcm5719-llvm-7d81813d76ded4b84456f18f01b43424c7e6d57d.zip |
[TM] Restore default TargetOptions in TargetMachine::resetTargetOptions.
Summary:
Previously if you had
* a function with the fast-math-enabled attr, followed by
* a function without the fast-math attr,
the second function would inherit the first function's fast-math-ness.
This means that mixing fast-math and non-fast-math functions in a module
was completely broken unless you explicitly annotated every
non-fast-math function with "unsafe-fp-math"="false". This appears to
have been broken since r176986 (March 2013), when the resetTargetOptions
function was introduced.
This patch tests the correct behavior as best we can. I don't think I
can test FPDenormalMode and NoTrappingFPMath, because they aren't used
in any backends during function lowering. Surprisingly, I also can't
find any uses at all of LessPreciseFPMAD affecting generated code.
The NVPTX/fast-math.ll test changes are an expected result of fixing
this bug. When FMA is disabled, we emit add as "add.rn.f32", which
prevents fma combining. Before this patch, fast-math was enabled in all
functions following the one which explicitly enabled it on itself, so we
were emitting plain "add.f32" where we should have generated
"add.rn.f32".
Reviewers: mkuper
Subscribers: hfinkel, majnemer, jholewinski, nemanjai, llvm-commits
Differential Revision: https://reviews.llvm.org/D28507
llvm-svn: 291618
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/CodeGen/NVPTX/fast-math.ll | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/PowerPC/change-no-infs.ll | 67 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/change-unsafe-fp-math.ll | 56 |
3 files changed, 125 insertions, 2 deletions
diff --git a/llvm/test/CodeGen/NVPTX/fast-math.ll b/llvm/test/CodeGen/NVPTX/fast-math.ll index 20f012951b3..d0a333d369c 100644 --- a/llvm/test/CodeGen/NVPTX/fast-math.ll +++ b/llvm/test/CodeGen/NVPTX/fast-math.ll @@ -21,14 +21,14 @@ define float @sqrt_div_fast(float %a, float %b) #0 { } ; CHECK-LABEL: fadd -; CHECK: add.f32 +; CHECK: add.rn.f32 define float @fadd(float %a, float %b) { %t1 = fadd float %a, %b ret float %t1 } ; CHECK-LABEL: fadd_ftz -; CHECK: add.ftz.f32 +; CHECK: add.rn.ftz.f32 define float @fadd_ftz(float %a, float %b) #1 { %t1 = fadd float %a, %b ret float %t1 diff --git a/llvm/test/CodeGen/PowerPC/change-no-infs.ll b/llvm/test/CodeGen/PowerPC/change-no-infs.ll new file mode 100644 index 00000000000..0cd5eb5408e --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/change-no-infs.ll @@ -0,0 +1,67 @@ +; Check that we can enable/disable NoInfsFPMath and NoNaNsInFPMath via function +; attributes. An attribute on one function should not magically apply to the +; next one. + +; RUN: llc < %s -mtriple=powerpc64-unknown-unknown -mcpu=pwr7 -mattr=-vsx \ +; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=SAFE + +; RUN: llc < %s -mtriple=powerpc64-unknown-unknown -mcpu=pwr7 -mattr=-vsx \ +; RUN: -enable-no-infs-fp-math -enable-no-nans-fp-math \ +; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=UNSAFE + +; The fcmp+select in these functions should be converted to a fsel instruction +; when both NoInfsFPMath and NoNaNsInFPMath are enabled. + +; CHECK-LABEL: default0: +define double @default0(double %a, double %y, double %z) { +entry: +; SAFE-NOT: fsel +; UNSAFE: fsel + %cmp = fcmp ult double %a, 0.000000e+00 + %z.y = select i1 %cmp, double %z, double %y + ret double %z.y +} + +; CHECK-LABEL: unsafe_math_off: +define double @unsafe_math_off(double %a, double %y, double %z) #0 #2 { +entry: +; SAFE-NOT: fsel +; UNSAFE-NOT: fsel + %cmp = fcmp ult double %a, 0.000000e+00 + %z.y = select i1 %cmp, double %z, double %y + ret double %z.y +} + +; CHECK-LABEL: default1: +define double @default1(double %a, double %y, double %z) { +; SAFE-NOT: fsel +; UNSAFE: fsel + %cmp = fcmp ult double %a, 0.000000e+00 + %z.y = select i1 %cmp, double %z, double %y + ret double %z.y +} + +; CHECK-LABEL: unsafe_math_on: +define double @unsafe_math_on(double %a, double %y, double %z) #1 #3 { +entry: +; SAFE-NOT: fsel +; UNSAFE-NOT: fsel + %cmp = fcmp ult double %a, 0.000000e+00 + %z.y = select i1 %cmp, double %z, double %y + ret double %z.y +} + +; CHECK-LABEL: default2: +define double @default2(double %a, double %y, double %z) { +; SAFE-NOT: fsel +; UNSAFE: fsel + %cmp = fcmp ult double %a, 0.000000e+00 + %z.y = select i1 %cmp, double %z, double %y + ret double %z.y +} + +attributes #0 = { "no-infs-fp-math"="false" } +attributes #1 = { "no-nans-fp-math"="false" } + +attributes #2 = { "no-infs-fp-math"="false" } +attributes #3 = { "no-infs-fp-math"="true" } diff --git a/llvm/test/CodeGen/X86/change-unsafe-fp-math.ll b/llvm/test/CodeGen/X86/change-unsafe-fp-math.ll new file mode 100644 index 00000000000..33a7ec9bfc7 --- /dev/null +++ b/llvm/test/CodeGen/X86/change-unsafe-fp-math.ll @@ -0,0 +1,56 @@ +; Check that we can enable/disable UnsafeFPMath via function attributes. An +; attribute on one function should not magically apply to the next one. + +; RUN: llc < %s -mtriple=x86_64-unknown-unknown \ +; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=SAFE + +; RUN: llc < %s -mtriple=x86_64-unknown-unknown -enable-unsafe-fp-math \ +; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=UNSAFE + +; The div in these functions should be converted to a mul when unsafe-fp-math +; is enabled. + +; CHECK-LABEL: unsafe_fp_math_default0: +define double @unsafe_fp_math_default0(double %x) { +; SAFE: divsd +; UNSAFE: mulsd + %div = fdiv double %x, 2.0 + ret double %div +} + +; CHECK-LABEL: unsafe_fp_math_off: +define double @unsafe_fp_math_off(double %x) #0 { +; SAFE: divsd +; UNSAFE: divsd + %div = fdiv double %x, 2.0 + ret double %div +} + +; CHECK-LABEL: unsafe_fp_math_default1: +define double @unsafe_fp_math_default1(double %x) { +; With unsafe math enabled, can change this div to a mul. +; SAFE: divsd +; UNSAFE: mulsd + %div = fdiv double %x, 2.0 + ret double %div +} + +; CHECK-LABEL: unsafe_fp_math_on: +define double @unsafe_fp_math_on(double %x) #1 { +; SAFE: mulsd +; UNSAFE: mulsd + %div = fdiv double %x, 2.0 + ret double %div +} + +; CHECK-LABEL: unsafe_fp_math_default2: +define double @unsafe_fp_math_default2(double %x) { +; With unsafe math enabled, can change this div to a mul. +; SAFE: divsd +; UNSAFE: mulsd + %div = fdiv double %x, 2.0 + ret double %div +} + +attributes #0 = { "unsafe-fp-math"="false" } +attributes #1 = { "unsafe-fp-math"="true" } |