summaryrefslogtreecommitdiff
path: root/test/Transforms/GVN/edge.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/Transforms/GVN/edge.ll')
-rw-r--r--test/Transforms/GVN/edge.ll48
1 files changed, 42 insertions, 6 deletions
diff --git a/test/Transforms/GVN/edge.ll b/test/Transforms/GVN/edge.ll
index 1dc285ec3d7cc..f28a76bb42d6c 100644
--- a/test/Transforms/GVN/edge.ll
+++ b/test/Transforms/GVN/edge.ll
@@ -69,11 +69,11 @@ if:
br label %return
return:
- %retval.0 = phi double [ %div, %if ], [ %x, %entry ]
- ret double %retval.0
+ %retval = phi double [ %div, %if ], [ %x, %entry ]
+ ret double %retval
; CHECK-LABEL: define double @fcmp_oeq(
-; CHECK: %div = fdiv double %x, 2.000000e+00
+; CHECK: %div = fdiv double %x, 2.0
}
define double @fcmp_une(double %x, double %y) {
@@ -86,10 +86,46 @@ else:
br label %return
return:
- %retval.0 = phi double [ %div, %else ], [ %x, %entry ]
- ret double %retval.0
+ %retval = phi double [ %div, %else ], [ %x, %entry ]
+ ret double %retval
; CHECK-LABEL: define double @fcmp_une(
-; CHECK: %div = fdiv double %x, 2.000000e+00
+; CHECK: %div = fdiv double %x, 2.0
}
+; PR22376 - We can't propagate zero constants because -0.0
+; compares equal to 0.0. If %y is -0.0 in this test case,
+; we would produce the wrong sign on the infinity return value.
+define double @fcmp_oeq_zero(double %x, double %y) {
+entry:
+ %cmp = fcmp oeq double %y, 0.0
+ br i1 %cmp, label %if, label %return
+
+if:
+ %div = fdiv double %x, %y
+ br label %return
+
+return:
+ %retval = phi double [ %div, %if ], [ %x, %entry ]
+ ret double %retval
+
+; CHECK-LABEL: define double @fcmp_oeq_zero(
+; CHECK: %div = fdiv double %x, %y
+}
+
+define double @fcmp_une_zero(double %x, double %y) {
+entry:
+ %cmp = fcmp une double %y, -0.0
+ br i1 %cmp, label %return, label %else
+
+else:
+ %div = fdiv double %x, %y
+ br label %return
+
+return:
+ %retval = phi double [ %div, %else ], [ %x, %entry ]
+ ret double %retval
+
+; CHECK-LABEL: define double @fcmp_une_zero(
+; CHECK: %div = fdiv double %x, %y
+}