xref: /llvm-project/llvm/test/Transforms/EarlyCSE/defaultfp-strictfp.ll (revision 819abe412dd554303cb932d6ec2200b9b9ebdd78)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -S -passes=early-cse -earlycse-debug-hash | FileCheck %s
3; RUN: opt < %s -S -passes='early-cse<memssa>' | FileCheck %s
4
5; Test use of constrained floating point intrinsics in the default
6; floating point environment.
7
8define double @multiple_fadd(double %a, double %b) #0 {
9; CHECK-LABEL: @multiple_fadd(
10; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0:[0-9]+]]
11; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
12; CHECK-NEXT:    ret double [[TMP1]]
13;
14  %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
15  %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
16  %3 = call double @foo.f64(double %1, double %2) #0
17  ret double %2
18}
19
20define double @multiple_fadd_split(double %a, double %b) #0 {
21; CHECK-LABEL: @multiple_fadd_split(
22; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
23; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
24; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
25; CHECK-NEXT:    ret double [[TMP1]]
26;
27  %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
28  call void @arbitraryfunc() #0
29  %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
30  %3 = call double @foo.f64(double %1, double %2) #0
31  ret double %2
32}
33
34define double @multiple_fsub(double %a, double %b) #0 {
35; CHECK-LABEL: @multiple_fsub(
36; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
37; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
38; CHECK-NEXT:    ret double [[TMP1]]
39;
40  %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
41  %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
42  %3 = call double @foo.f64(double %1, double %2) #0
43  ret double %2
44}
45
46define double @multiple_fsub_split(double %a, double %b) #0 {
47; CHECK-LABEL: @multiple_fsub_split(
48; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
49; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
50; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
51; CHECK-NEXT:    ret double [[TMP1]]
52;
53  %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
54  call void @arbitraryfunc() #0
55  %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
56  %3 = call double @foo.f64(double %1, double %2) #0
57  ret double %2
58}
59
60define double @multiple_fmul(double %a, double %b) #0 {
61; CHECK-LABEL: @multiple_fmul(
62; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
63; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
64; CHECK-NEXT:    ret double [[TMP1]]
65;
66  %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
67  %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
68  %3 = call double @foo.f64(double %1, double %2) #0
69  ret double %2
70}
71
72define double @multiple_fmul_split(double %a, double %b) #0 {
73; CHECK-LABEL: @multiple_fmul_split(
74; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
75; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
76; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
77; CHECK-NEXT:    ret double [[TMP1]]
78;
79  %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
80  call void @arbitraryfunc() #0
81  %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
82  %3 = call double @foo.f64(double %1, double %2) #0
83  ret double %2
84}
85
86define double @multiple_fdiv(double %a, double %b) #0 {
87; CHECK-LABEL: @multiple_fdiv(
88; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
89; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
90; CHECK-NEXT:    ret double [[TMP1]]
91;
92  %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
93  %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
94  %3 = call double @foo.f64(double %1, double %2) #0
95  ret double %2
96}
97
98define double @multiple_fdiv_split(double %a, double %b) #0 {
99; CHECK-LABEL: @multiple_fdiv_split(
100; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
101; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
102; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
103; CHECK-NEXT:    ret double [[TMP1]]
104;
105  %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
106  call void @arbitraryfunc() #0
107  %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
108  %3 = call double @foo.f64(double %1, double %2) #0
109  ret double %2
110}
111
112define double @multiple_frem(double %a, double %b) #0 {
113; CHECK-LABEL: @multiple_frem(
114; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
115; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
116; CHECK-NEXT:    ret double [[TMP1]]
117;
118  %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
119  %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
120  %3 = call double @foo.f64(double %1, double %2) #0
121  ret double %2
122}
123
124define double @multiple_frem_split(double %a, double %b) #0 {
125; CHECK-LABEL: @multiple_frem_split(
126; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
127; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
128; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
129; CHECK-NEXT:    ret double [[TMP1]]
130;
131  %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
132  call void @arbitraryfunc() #0
133  %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
134  %3 = call double @foo.f64(double %1, double %2) #0
135  ret double %2
136}
137
138define i32 @multiple_fptoui(double %a) #0 {
139; CHECK-LABEL: @multiple_fptoui(
140; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]
141; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]
142; CHECK-NEXT:    ret i32 [[TMP1]]
143;
144  %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0
145  %2 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0
146  %3 = call i32 @bar.i32(i32 %1, i32 %1) #0
147  ret i32 %2
148}
149
150define i32 @multiple_fptoui_split(double %a, double %b) #0 {
151; CHECK-LABEL: @multiple_fptoui_split(
152; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]
153; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
154; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]
155; CHECK-NEXT:    ret i32 [[TMP1]]
156;
157  %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0
158  call void @arbitraryfunc() #0
159  %2 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0
160  %3 = call i32 @bar.i32(i32 %1, i32 %1) #0
161  ret i32 %2
162}
163
164define double @multiple_uitofp(i32 %a) #0 {
165; CHECK-LABEL: @multiple_uitofp(
166; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
167; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
168; CHECK-NEXT:    ret double [[TMP1]]
169;
170  %1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
171  %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
172  %3 = call double @foo.f64(double %1, double %1) #0
173  ret double %2
174}
175
176define double @multiple_uitofp_split(i32 %a) #0 {
177; CHECK-LABEL: @multiple_uitofp_split(
178; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
179; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
180; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
181; CHECK-NEXT:    ret double [[TMP1]]
182;
183  %1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
184  call void @arbitraryfunc() #0
185  %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
186  %3 = call double @foo.f64(double %1, double %1) #0
187  ret double %2
188}
189
190define i32 @multiple_fptosi(double %a) #0 {
191; CHECK-LABEL: @multiple_fptosi(
192; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]
193; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]
194; CHECK-NEXT:    ret i32 [[TMP1]]
195;
196  %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0
197  %2 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0
198  %3 = call i32 @bar.i32(i32 %1, i32 %1) #0
199  ret i32 %2
200}
201
202define i32 @multiple_fptosi_split(double %a, double %b) #0 {
203; CHECK-LABEL: @multiple_fptosi_split(
204; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]]
205; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
206; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]
207; CHECK-NEXT:    ret i32 [[TMP1]]
208;
209  %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0
210  call void @arbitraryfunc() #0
211  %2 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0
212  %3 = call i32 @bar.i32(i32 %1, i32 %1) #0
213  ret i32 %2
214}
215
216define double @multiple_sitofp(i32 %a) #0 {
217; CHECK-LABEL: @multiple_sitofp(
218; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
219; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
220; CHECK-NEXT:    ret double [[TMP1]]
221;
222  %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
223  %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
224  %3 = call double @foo.f64(double %1, double %1) #0
225  ret double %2
226}
227
228define double @multiple_sitofp_split(i32 %a) #0 {
229; CHECK-LABEL: @multiple_sitofp_split(
230; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]]
231; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
232; CHECK-NEXT:    [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]
233; CHECK-NEXT:    ret double [[TMP1]]
234;
235  %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
236  call void @arbitraryfunc() #0
237  %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
238  %3 = call double @foo.f64(double %1, double %1) #0
239  ret double %2
240}
241
242define i1 @multiple_fcmp(double %a, double %b) #0 {
243; CHECK-LABEL: @multiple_fcmp(
244; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]
245; CHECK-NEXT:    [[TMP2:%.*]] = zext i1 [[TMP1]] to i32
246; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]
247; CHECK-NEXT:    ret i1 [[TMP1]]
248;
249  %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
250  %2 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
251  %3 = zext i1 %1 to i32
252  %4 = zext i1 %2 to i32
253  %5 = call i32 @bar.i32(i32 %3, i32 %4) #0
254  ret i1 %2
255}
256
257define i1 @multiple_fcmp_split(double %a, double %b) #0 {
258; CHECK-LABEL: @multiple_fcmp_split(
259; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]
260; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
261; CHECK-NEXT:    [[TMP2:%.*]] = zext i1 [[TMP1]] to i32
262; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]
263; CHECK-NEXT:    ret i1 [[TMP1]]
264;
265  %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
266  call void @arbitraryfunc() #0
267  %2 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
268  %3 = zext i1 %1 to i32
269  %4 = zext i1 %2 to i32
270  %5 = call i32 @bar.i32(i32 %3, i32 %4) #0
271  ret i1 %2
272}
273
274define i1 @multiple_fcmps(double %a, double %b) #0 {
275; CHECK-LABEL: @multiple_fcmps(
276; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]
277; CHECK-NEXT:    [[TMP2:%.*]] = zext i1 [[TMP1]] to i32
278; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]
279; CHECK-NEXT:    ret i1 [[TMP1]]
280;
281  %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
282  %2 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
283  %3 = zext i1 %1 to i32
284  %4 = zext i1 %2 to i32
285  %5 = call i32 @bar.i32(i32 %3, i32 %4) #0
286  ret i1 %2
287}
288
289define i1 @multiple_fcmps_split(double %a, double %b) #0 {
290; CHECK-LABEL: @multiple_fcmps_split(
291; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]]
292; CHECK-NEXT:    call void @arbitraryfunc() #[[ATTR0]]
293; CHECK-NEXT:    [[TMP2:%.*]] = zext i1 [[TMP1]] to i32
294; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]]
295; CHECK-NEXT:    ret i1 [[TMP1]]
296;
297  %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
298  call void @arbitraryfunc() #0
299  %2 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
300  %3 = zext i1 %1 to i32
301  %4 = zext i1 %2 to i32
302  %5 = call i32 @bar.i32(i32 %3, i32 %4) #0
303  ret i1 %2
304}
305
306attributes #0 = { strictfp }
307
308declare void @arbitraryfunc() #0
309declare double @foo.f64(double, double) #0
310declare i32 @bar.i32(i32, i32) #0
311
312declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)
313declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)
314declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)
315declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)
316declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata)
317declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)
318declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)
319declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata)
320declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)
321declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)
322declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)
323