diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2015-06-14 18:53:58 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2015-06-14 18:53:58 +0000 |
| commit | 4f0524614e664c56cc4a516439022af87c543247 (patch) | |
| tree | 6807f172ea6ce1cf895be79114b14b0d46643470 /llvm/test/Transforms | |
| parent | 5e49697138f0015d80939318cfe2b46bebeeccf0 (diff) | |
| download | bcm5719-llvm-4f0524614e664c56cc4a516439022af87c543247.tar.gz bcm5719-llvm-4f0524614e664c56cc4a516439022af87c543247.zip | |
[InstSimplify] Add self-fdiv identities for -ffinite-math-only.
When NaNs and Infs are ignored we can fold
X / X -> 1.0
-X / X -> -1.0
X / -X -> -1.0
llvm-svn: 239701
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/InstSimplify/fast-math.ll | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstSimplify/fast-math.ll b/llvm/test/Transforms/InstSimplify/fast-math.ll index e7fb14d7e78..0336301c354 100644 --- a/llvm/test/Transforms/InstSimplify/fast-math.ll +++ b/llvm/test/Transforms/InstSimplify/fast-math.ll @@ -114,3 +114,80 @@ define double @fdiv_zero_by_x(double %X) { ret double %r ; CHECK: ret double 0 } + +define float @fdiv_self(float %f) { + %div = fdiv nnan ninf float %f, %f + ret float %div +; CHECK-LABEL: fdiv_self +; CHECK: ret float 1.000000e+00 +} + +define float @fdiv_self_invalid1(float %f) { + %div = fdiv ninf float %f, %f + ret float %div +; CHECK-LABEL: fdiv_self_invalid1 +; CHECK: %div = fdiv ninf float %f, %f +; CHECK-NEXT: ret float %div +} + +define float @fdiv_self_invalid2(float %f) { + %div = fdiv nnan float %f, %f + ret float %div +; CHECK-LABEL: fdiv_self_invalid2 +; CHECK: %div = fdiv nnan float %f, %f +; CHECK-NEXT: ret float %div +} + +define float @fdiv_self_invalid3(float %f) { + %div = fdiv float %f, %f + ret float %div +; CHECK-LABEL: fdiv_self_invalid3 +; CHECK: %div = fdiv float %f, %f +; CHECK-NEXT: ret float %div +} + +define float @fdiv_neg(float %f) { + %neg = fsub fast float -0.000000e+00, %f + %div = fdiv nnan ninf float %neg, %f + ret float %div +; CHECK-LABEL: fdiv_neg +; CHECK: ret float -1.000000e+00 +} + +define float @fdiv_neg_invalid1(float %f) { + %neg = fsub fast float -0.000000e+00, %f + %div = fdiv ninf float %neg, %f + ret float %div +; CHECK-LABEL: fdiv_neg_invalid1 +; CHECK: %neg = fsub fast float -0.000000e+00, %f +; CHECK-NEXT: %div = fdiv ninf float %neg, %f +; CHECK-NEXT: ret float %div +} + +define float @fdiv_neg_invalid2(float %f) { + %neg = fsub fast float -0.000000e+00, %f + %div = fdiv nnan float %neg, %f + ret float %div +; CHECK-LABEL: fdiv_neg_invalid2 +; CHECK: %neg = fsub fast float -0.000000e+00, %f +; CHECK-NEXT: %div = fdiv nnan float %neg, %f +; CHECK-NEXT: ret float %div +} + +define float @fdiv_neg_invalid3(float %f) { + %neg = fsub fast float -0.000000e+00, %f + %div = fdiv float %neg, %f + ret float %div +; CHECK-LABEL: fdiv_neg_invalid3 +; CHECK: %neg = fsub fast float -0.000000e+00, %f +; CHECK-NEXT: %div = fdiv float %neg, %f +; CHECK-NEXT: ret float %div +} + +define float @fdiv_neg_swapped(float %f) { + %neg = fsub float 0.000000e+00, %f + %div = fdiv nnan ninf float %f, %neg + ret float %div +; CHECK-LABEL: fdiv_neg_swapped +; CHECK: ret float -1.000000e+00 +} |

