blob: 960bfb5ca105effe9aa2cb76e8990b0192fefe41 [file] [log] [blame]
Andrew Kaylora0a11642017-01-26 23:27:59 +00001; RUN: opt -O3 -S < %s | FileCheck %s
2
3; Test to verify that constants aren't folded when the rounding mode is unknown.
4; CHECK-LABEL: @f1
5; CHECK: call double @llvm.experimental.constrained.fdiv.f64
6define double @f1() {
7entry:
8 %div = call double @llvm.experimental.constrained.fdiv.f64(
9 double 1.000000e+00,
10 double 1.000000e+01,
11 metadata !"round.dynamic",
12 metadata !"fpexcept.strict")
13 ret double %div
14}
15
16; Verify that 'a - 0' isn't simplified to 'a' when the rounding mode is unknown.
17;
18; double f2(double a) {
19; // Because the result of '0 - 0' is negative zero if rounding mode is
20; // downward, this shouldn't be simplified.
21; return a - 0.0;
22; }
23;
24; CHECK-LABEL: @f2
25; CHECK: call double @llvm.experimental.constrained.fsub.f64
26define double @f2(double %a) {
27entry:
28 %div = call double @llvm.experimental.constrained.fsub.f64(
29 double %a, double 0.000000e+00,
30 metadata !"round.dynamic",
31 metadata !"fpexcept.strict")
32 ret double %div
33}
34
35; Verify that '-((-a)*b)' isn't simplified to 'a*b' when the rounding mode is
36; unknown.
37;
38; double f3(double a, double b) {
39; // Because the intermediate value involved in this calculation may require
40; // rounding, this shouldn't be simplified.
41; return -((-a)*b);
42; }
43;
44; CHECK-LABEL: @f3
45; CHECK: call double @llvm.experimental.constrained.fsub.f64
46; CHECK: call double @llvm.experimental.constrained.fmul.f64
47; CHECK: call double @llvm.experimental.constrained.fsub.f64
48define double @f3(double %a, double %b) {
49entry:
50 %sub = call double @llvm.experimental.constrained.fsub.f64(
51 double -0.000000e+00, double %a,
52 metadata !"round.dynamic",
53 metadata !"fpexcept.strict")
54 %mul = call double @llvm.experimental.constrained.fmul.f64(
55 double %sub, double %b,
56 metadata !"round.dynamic",
57 metadata !"fpexcept.strict")
58 %ret = call double @llvm.experimental.constrained.fsub.f64(
59 double -0.000000e+00,
60 double %mul,
61 metadata !"round.dynamic",
62 metadata !"fpexcept.strict")
63 ret double %ret
64}
65
66; Verify that FP operations are not performed speculatively when FP exceptions
67; are not being ignored.
68;
69; double f4(int n, double a) {
70; // Because a + 1 may overflow, this should not be simplified.
71; if (n > 0)
72; return a + 1.0;
73; return a;
74; }
75;
76;
77; CHECK-LABEL: @f4
78; CHECK-NOT: select
79; CHECK: br i1 %cmp
80define double @f4(i32 %n, double %a) {
81entry:
82 %cmp = icmp sgt i32 %n, 0
83 br i1 %cmp, label %if.then, label %if.end
84
85if.then:
86 %add = call double @llvm.experimental.constrained.fadd.f64(
87 double 1.000000e+00, double %a,
88 metadata !"round.dynamic",
89 metadata !"fpexcept.strict")
90 br label %if.end
91
92if.end:
93 %a.0 = phi double [%add, %if.then], [ %a, %entry ]
94 ret double %a.0
95}
96
97
98@llvm.fp.env = thread_local global i8 zeroinitializer, section "llvm.metadata"
99declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)
100declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)
101declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)
102declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)