summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2017-01-26 00:10:26 +0000
committerJustin Lebar <jlebar@google.com>2017-01-26 00:10:26 +0000
commit7e3184c4122e90772e983e1fe16dccf3b32ad8b6 (patch)
tree8ea3bcb67b6cf60cb2d89bb4ad4b443b170369d5 /llvm/test/Transforms
parenta31f9dd69a944042059e4ddec2979669f9a70076 (diff)
downloadbcm5719-llvm-7e3184c4122e90772e983e1fe16dccf3b32ad8b6.tar.gz
bcm5719-llvm-7e3184c4122e90772e983e1fe16dccf3b32ad8b6.zip
[ValueTracking] Implement SignBitMustBeZero correctly for sqrt.
Summary: Previously we assumed that the result of sqrt(x) always had 0 as its sign bit. But sqrt(-0) == -0. Reviewers: hfinkel, efriedma, sanjoy Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D28928 llvm-svn: 293115
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll54
1 files changed, 54 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
index dfdb88dcc85..e635032e6b7 100644
--- a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
+++ b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll
@@ -104,6 +104,7 @@ define float @PR22688(float %x) {
}
declare float @llvm.fabs.f32(float)
+declare float @llvm.sqrt.f32(float)
; CHECK-LABEL: @fabs_select_positive_constants(
; CHECK: %select = select i1 %cmp, float 1.000000e+00, float 2.000000e+00
@@ -195,3 +196,56 @@ define float @fabs_select_negnan_zero(float addrspace(1)* %out, i32 %c) {
%fabs = call float @llvm.fabs.f32(float %select)
ret float %fabs
}
+
+; CHECK-LABEL: @fabs_sqrt
+; CHECK: call float @llvm.sqrt.f32
+; CHECK: call float @llvm.fabs.f32
+define float @fabs_sqrt(float %a) {
+; The fabs can't be eliminated because llvm.sqrt.f32 may return -0 or NaN with
+; an arbitrary sign bit.
+ %sqrt = call float @llvm.sqrt.f32(float %a)
+ %fabs = call float @llvm.fabs.f32(float %sqrt)
+ ret float %fabs
+}
+
+; CHECK-LABEL: @fabs_sqrt_nnan
+; CHECK: call nnan float @llvm.sqrt.f32
+; CHECK: call float @llvm.fabs.f32
+define float @fabs_sqrt_nnan(float %a) {
+; The fabs can't be eliminated because the nnan sqrt may still return -0.
+ %sqrt = call nnan float @llvm.sqrt.f32(float %a)
+ %fabs = call float @llvm.fabs.f32(float %sqrt)
+ ret float %fabs
+}
+
+; CHECK-LABEL: @fabs_sqrt_nsz
+; CHECK: call nsz float @llvm.sqrt.f32
+; CHECK: call float @llvm.fabs.f32
+define float @fabs_sqrt_nsz(float %a) {
+; The fabs can't be eliminated because the nsz sqrt may still return NaN.
+ %sqrt = call nsz float @llvm.sqrt.f32(float %a)
+ %fabs = call float @llvm.fabs.f32(float %sqrt)
+ ret float %fabs
+}
+
+; CHECK-LABEL: @fabs_sqrt_nnan_nsz
+; CHECK: call nnan nsz float @llvm.sqrt.f32
+; CHECK-NOT: call float @llvm.fabs.f32
+define float @fabs_sqrt_nnan_nsz(float %a) {
+; The fabs can be eliminated because we're nsz and nnan.
+ %sqrt = call nnan nsz float @llvm.sqrt.f32(float %a)
+ %fabs = call float @llvm.fabs.f32(float %sqrt)
+ ret float %fabs
+}
+
+; CHECK-LABEL: @fabs_sqrt_nnan_fabs
+; CHECK: call float @llvm.fabs.f32
+; CHECK: call nnan float @llvm.sqrt.f32
+; CHECK-NOT: call float @llvm.fabs.f32
+define float @fabs_sqrt_nnan_fabs(float %a) {
+; The second fabs can be eliminated because the operand to sqrt cannot be -0.
+ %b = call float @llvm.fabs.f32(float %a)
+ %sqrt = call nnan float @llvm.sqrt.f32(float %b)
+ %fabs = call float @llvm.fabs.f32(float %sqrt)
+ ret float %fabs
+}
OpenPOWER on IntegriCloud