blob: f21ba15b2d4997ed603c93b1630eecb9f8fbe490 [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
Andrew Kaylorf4660012017-05-25 21:31:00 +000098; Verify that sqrt(42.0) isn't simplified when the rounding mode is unknown.
99; CHECK-LABEL: f5
100; CHECK: call double @llvm.experimental.constrained.sqrt
101define double @f5() {
102entry:
103 %result = call double @llvm.experimental.constrained.sqrt.f64(double 42.0,
104 metadata !"round.dynamic",
105 metadata !"fpexcept.strict")
106 ret double %result
107}
108
109; Verify that pow(42.1, 3.0) isn't simplified when the rounding mode is unknown.
110; CHECK-LABEL: f6
111; CHECK: call double @llvm.experimental.constrained.pow
112define double @f6() {
113entry:
114 %result = call double @llvm.experimental.constrained.pow.f64(double 42.1,
115 double 3.0,
116 metadata !"round.dynamic",
117 metadata !"fpexcept.strict")
118 ret double %result
119}
120
121; Verify that powi(42.1, 3) isn't simplified when the rounding mode is unknown.
122; CHECK-LABEL: f7
123; CHECK: call double @llvm.experimental.constrained.powi
124define double @f7() {
125entry:
126 %result = call double @llvm.experimental.constrained.powi.f64(double 42.1,
127 i32 3,
128 metadata !"round.dynamic",
129 metadata !"fpexcept.strict")
130 ret double %result
131}
132
133; Verify that sin(42.0) isn't simplified when the rounding mode is unknown.
134; CHECK-LABEL: f8
135; CHECK: call double @llvm.experimental.constrained.sin
136define double @f8() {
137entry:
138 %result = call double @llvm.experimental.constrained.sin.f64(double 42.0,
139 metadata !"round.dynamic",
140 metadata !"fpexcept.strict")
141 ret double %result
142}
143
144; Verify that cos(42.0) isn't simplified when the rounding mode is unknown.
145; CHECK-LABEL: f9
146; CHECK: call double @llvm.experimental.constrained.cos
147define double @f9() {
148entry:
149 %result = call double @llvm.experimental.constrained.cos.f64(double 42.0,
150 metadata !"round.dynamic",
151 metadata !"fpexcept.strict")
152 ret double %result
153}
154
155; Verify that exp(42.0) isn't simplified when the rounding mode is unknown.
156; CHECK-LABEL: f10
157; CHECK: call double @llvm.experimental.constrained.exp
158define double @f10() {
159entry:
160 %result = call double @llvm.experimental.constrained.exp.f64(double 42.0,
161 metadata !"round.dynamic",
162 metadata !"fpexcept.strict")
163 ret double %result
164}
165
166; Verify that exp2(42.1) isn't simplified when the rounding mode is unknown.
167; CHECK-LABEL: f11
168; CHECK: call double @llvm.experimental.constrained.exp2
169define double @f11() {
170entry:
171 %result = call double @llvm.experimental.constrained.exp2.f64(double 42.1,
172 metadata !"round.dynamic",
173 metadata !"fpexcept.strict")
174 ret double %result
175}
176
177; Verify that log(42.0) isn't simplified when the rounding mode is unknown.
178; CHECK-LABEL: f12
179; CHECK: call double @llvm.experimental.constrained.log
180define double @f12() {
181entry:
182 %result = call double @llvm.experimental.constrained.log.f64(double 42.0,
183 metadata !"round.dynamic",
184 metadata !"fpexcept.strict")
185 ret double %result
186}
187
188; Verify that log10(42.0) isn't simplified when the rounding mode is unknown.
189; CHECK-LABEL: f13
190; CHECK: call double @llvm.experimental.constrained.log10
191define double @f13() {
192entry:
193 %result = call double @llvm.experimental.constrained.log10.f64(double 42.0,
194 metadata !"round.dynamic",
195 metadata !"fpexcept.strict")
196 ret double %result
197}
198
199; Verify that log2(42.0) isn't simplified when the rounding mode is unknown.
200; CHECK-LABEL: f14
201; CHECK: call double @llvm.experimental.constrained.log2
202define double @f14() {
203entry:
204 %result = call double @llvm.experimental.constrained.log2.f64(double 42.0,
205 metadata !"round.dynamic",
206 metadata !"fpexcept.strict")
207 ret double %result
208}
209
210; Verify that rint(42.1) isn't simplified when the rounding mode is unknown.
211; CHECK-LABEL: f15
212; CHECK: call double @llvm.experimental.constrained.rint
213define double @f15() {
214entry:
215 %result = call double @llvm.experimental.constrained.rint.f64(double 42.1,
216 metadata !"round.dynamic",
217 metadata !"fpexcept.strict")
218 ret double %result
219}
220
221; Verify that nearbyint(42.1) isn't simplified when the rounding mode is
222; unknown.
223; CHECK-LABEL: f16
224; CHECK: call double @llvm.experimental.constrained.nearbyint
225define double @f16() {
226entry:
227 %result = call double @llvm.experimental.constrained.nearbyint.f64(
228 double 42.1,
229 metadata !"round.dynamic",
230 metadata !"fpexcept.strict")
231 ret double %result
232}
233
Andrew Kaylora0a11642017-01-26 23:27:59 +0000234@llvm.fp.env = thread_local global i8 zeroinitializer, section "llvm.metadata"
235declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)
236declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)
237declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)
238declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)
Andrew Kaylorf4660012017-05-25 21:31:00 +0000239declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)
240declare double @llvm.experimental.constrained.pow.f64(double, double, metadata, metadata)
241declare double @llvm.experimental.constrained.powi.f64(double, i32, metadata, metadata)
242declare double @llvm.experimental.constrained.sin.f64(double, metadata, metadata)
243declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata)
244declare double @llvm.experimental.constrained.exp.f64(double, metadata, metadata)
245declare double @llvm.experimental.constrained.exp2.f64(double, metadata, metadata)
246declare double @llvm.experimental.constrained.log.f64(double, metadata, metadata)
247declare double @llvm.experimental.constrained.log10.f64(double, metadata, metadata)
248declare double @llvm.experimental.constrained.log2.f64(double, metadata, metadata)
249declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata)
250declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata)