[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / EarlyCSE / defaultfp-strictfp.ll
blobbdfad0d6e44e9c4c4100fe2f5bdb5c21f6aa2c12
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
5 ; Test use of constrained floating point intrinsics in the default
6 ; floating point environment.
8 define 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]]
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
20 define 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]]
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
34 define 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]]
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
46 define 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]]
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
60 define 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]]
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
72 define 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]]
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
86 define 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]]
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
98 define 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]]
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
112 define 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]]
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
124 define 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]]
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
138 define 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]]
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
150 define 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]]
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
164 define 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]]
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
176 define 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]]
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
190 define 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]]
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
202 define 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]]
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
216 define 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]]
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
228 define 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]]
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
242 define 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]]
249   %1 = call i1 @llvm.experimental.constrained.fcmp.i1.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
250   %2 = call i1 @llvm.experimental.constrained.fcmp.i1.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
257 define 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]]
265   %1 = call i1 @llvm.experimental.constrained.fcmp.i1.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
266   call void @arbitraryfunc() #0
267   %2 = call i1 @llvm.experimental.constrained.fcmp.i1.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
274 define 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]]
281   %1 = call i1 @llvm.experimental.constrained.fcmps.i1.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
282   %2 = call i1 @llvm.experimental.constrained.fcmps.i1.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
289 define 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]]
297   %1 = call i1 @llvm.experimental.constrained.fcmps.i1.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0
298   call void @arbitraryfunc() #0
299   %2 = call i1 @llvm.experimental.constrained.fcmps.i1.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
306 attributes #0 = { strictfp }
308 declare void @arbitraryfunc() #0
309 declare double @foo.f64(double, double) #0
310 declare i32 @bar.i32(i32, i32) #0
312 declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)
313 declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)
314 declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)
315 declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)
316 declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata)
317 declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)
318 declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)
319 declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata)
320 declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)
321 declare i1 @llvm.experimental.constrained.fcmp.i1.f64(double, double, metadata, metadata)
322 declare i1 @llvm.experimental.constrained.fcmps.i1.f64(double, double, metadata, metadata)