[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / CodeGen / RISCV / float-br-fcmp.ll
blobf9901e6fc9dc59de2f0437e7c278ad50f92161cf
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \
3 ; RUN:   -target-abi=ilp32f | FileCheck -check-prefix=RV32IF %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \
5 ; RUN:   -target-abi=lp64f | FileCheck -check-prefix=RV64IF %s
7 declare void @abort()
8 declare void @exit(i32)
9 declare float @dummy(float)
11 define void @br_fcmp_false(float %a, float %b) nounwind {
12 ; RV32IF-LABEL: br_fcmp_false:
13 ; RV32IF:       # %bb.0:
14 ; RV32IF-NEXT:    li a0, 1
15 ; RV32IF-NEXT:    bnez a0, .LBB0_2
16 ; RV32IF-NEXT:  # %bb.1: # %if.then
17 ; RV32IF-NEXT:    ret
18 ; RV32IF-NEXT:  .LBB0_2: # %if.else
19 ; RV32IF-NEXT:    addi sp, sp, -16
20 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
21 ; RV32IF-NEXT:    call abort@plt
23 ; RV64IF-LABEL: br_fcmp_false:
24 ; RV64IF:       # %bb.0:
25 ; RV64IF-NEXT:    li a0, 1
26 ; RV64IF-NEXT:    bnez a0, .LBB0_2
27 ; RV64IF-NEXT:  # %bb.1: # %if.then
28 ; RV64IF-NEXT:    ret
29 ; RV64IF-NEXT:  .LBB0_2: # %if.else
30 ; RV64IF-NEXT:    addi sp, sp, -16
31 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
32 ; RV64IF-NEXT:    call abort@plt
33   %1 = fcmp false float %a, %b
34   br i1 %1, label %if.then, label %if.else
35 if.then:
36   ret void
37 if.else:
38   tail call void @abort()
39   unreachable
42 define void @br_fcmp_oeq(float %a, float %b) nounwind {
43 ; RV32IF-LABEL: br_fcmp_oeq:
44 ; RV32IF:       # %bb.0:
45 ; RV32IF-NEXT:    feq.s a0, fa0, fa1
46 ; RV32IF-NEXT:    bnez a0, .LBB1_2
47 ; RV32IF-NEXT:  # %bb.1: # %if.else
48 ; RV32IF-NEXT:    ret
49 ; RV32IF-NEXT:  .LBB1_2: # %if.then
50 ; RV32IF-NEXT:    addi sp, sp, -16
51 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
52 ; RV32IF-NEXT:    call abort@plt
54 ; RV64IF-LABEL: br_fcmp_oeq:
55 ; RV64IF:       # %bb.0:
56 ; RV64IF-NEXT:    feq.s a0, fa0, fa1
57 ; RV64IF-NEXT:    bnez a0, .LBB1_2
58 ; RV64IF-NEXT:  # %bb.1: # %if.else
59 ; RV64IF-NEXT:    ret
60 ; RV64IF-NEXT:  .LBB1_2: # %if.then
61 ; RV64IF-NEXT:    addi sp, sp, -16
62 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
63 ; RV64IF-NEXT:    call abort@plt
64   %1 = fcmp oeq float %a, %b
65   br i1 %1, label %if.then, label %if.else
66 if.else:
67   ret void
68 if.then:
69   tail call void @abort()
70   unreachable
73 ; TODO: generated code quality for this is very poor due to
74 ; DAGCombiner::visitXOR converting the legal setoeq to setune, which requires
75 ; expansion.
76 define void @br_fcmp_oeq_alt(float %a, float %b) nounwind {
77 ; RV32IF-LABEL: br_fcmp_oeq_alt:
78 ; RV32IF:       # %bb.0:
79 ; RV32IF-NEXT:    feq.s a0, fa0, fa1
80 ; RV32IF-NEXT:    bnez a0, .LBB2_2
81 ; RV32IF-NEXT:  # %bb.1: # %if.else
82 ; RV32IF-NEXT:    ret
83 ; RV32IF-NEXT:  .LBB2_2: # %if.then
84 ; RV32IF-NEXT:    addi sp, sp, -16
85 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
86 ; RV32IF-NEXT:    call abort@plt
88 ; RV64IF-LABEL: br_fcmp_oeq_alt:
89 ; RV64IF:       # %bb.0:
90 ; RV64IF-NEXT:    feq.s a0, fa0, fa1
91 ; RV64IF-NEXT:    bnez a0, .LBB2_2
92 ; RV64IF-NEXT:  # %bb.1: # %if.else
93 ; RV64IF-NEXT:    ret
94 ; RV64IF-NEXT:  .LBB2_2: # %if.then
95 ; RV64IF-NEXT:    addi sp, sp, -16
96 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
97 ; RV64IF-NEXT:    call abort@plt
98   %1 = fcmp oeq float %a, %b
99   br i1 %1, label %if.then, label %if.else
100 if.then:
101   tail call void @abort()
102   unreachable
103 if.else:
104   ret void
107 define void @br_fcmp_ogt(float %a, float %b) nounwind {
108 ; RV32IF-LABEL: br_fcmp_ogt:
109 ; RV32IF:       # %bb.0:
110 ; RV32IF-NEXT:    flt.s a0, fa1, fa0
111 ; RV32IF-NEXT:    bnez a0, .LBB3_2
112 ; RV32IF-NEXT:  # %bb.1: # %if.else
113 ; RV32IF-NEXT:    ret
114 ; RV32IF-NEXT:  .LBB3_2: # %if.then
115 ; RV32IF-NEXT:    addi sp, sp, -16
116 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
117 ; RV32IF-NEXT:    call abort@plt
119 ; RV64IF-LABEL: br_fcmp_ogt:
120 ; RV64IF:       # %bb.0:
121 ; RV64IF-NEXT:    flt.s a0, fa1, fa0
122 ; RV64IF-NEXT:    bnez a0, .LBB3_2
123 ; RV64IF-NEXT:  # %bb.1: # %if.else
124 ; RV64IF-NEXT:    ret
125 ; RV64IF-NEXT:  .LBB3_2: # %if.then
126 ; RV64IF-NEXT:    addi sp, sp, -16
127 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
128 ; RV64IF-NEXT:    call abort@plt
129   %1 = fcmp ogt float %a, %b
130   br i1 %1, label %if.then, label %if.else
131 if.else:
132   ret void
133 if.then:
134   tail call void @abort()
135   unreachable
138 define void @br_fcmp_oge(float %a, float %b) nounwind {
139 ; RV32IF-LABEL: br_fcmp_oge:
140 ; RV32IF:       # %bb.0:
141 ; RV32IF-NEXT:    fle.s a0, fa1, fa0
142 ; RV32IF-NEXT:    bnez a0, .LBB4_2
143 ; RV32IF-NEXT:  # %bb.1: # %if.else
144 ; RV32IF-NEXT:    ret
145 ; RV32IF-NEXT:  .LBB4_2: # %if.then
146 ; RV32IF-NEXT:    addi sp, sp, -16
147 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
148 ; RV32IF-NEXT:    call abort@plt
150 ; RV64IF-LABEL: br_fcmp_oge:
151 ; RV64IF:       # %bb.0:
152 ; RV64IF-NEXT:    fle.s a0, fa1, fa0
153 ; RV64IF-NEXT:    bnez a0, .LBB4_2
154 ; RV64IF-NEXT:  # %bb.1: # %if.else
155 ; RV64IF-NEXT:    ret
156 ; RV64IF-NEXT:  .LBB4_2: # %if.then
157 ; RV64IF-NEXT:    addi sp, sp, -16
158 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
159 ; RV64IF-NEXT:    call abort@plt
160   %1 = fcmp oge float %a, %b
161   br i1 %1, label %if.then, label %if.else
162 if.else:
163   ret void
164 if.then:
165   tail call void @abort()
166   unreachable
169 define void @br_fcmp_olt(float %a, float %b) nounwind {
170 ; RV32IF-LABEL: br_fcmp_olt:
171 ; RV32IF:       # %bb.0:
172 ; RV32IF-NEXT:    flt.s a0, fa0, fa1
173 ; RV32IF-NEXT:    bnez a0, .LBB5_2
174 ; RV32IF-NEXT:  # %bb.1: # %if.else
175 ; RV32IF-NEXT:    ret
176 ; RV32IF-NEXT:  .LBB5_2: # %if.then
177 ; RV32IF-NEXT:    addi sp, sp, -16
178 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
179 ; RV32IF-NEXT:    call abort@plt
181 ; RV64IF-LABEL: br_fcmp_olt:
182 ; RV64IF:       # %bb.0:
183 ; RV64IF-NEXT:    flt.s a0, fa0, fa1
184 ; RV64IF-NEXT:    bnez a0, .LBB5_2
185 ; RV64IF-NEXT:  # %bb.1: # %if.else
186 ; RV64IF-NEXT:    ret
187 ; RV64IF-NEXT:  .LBB5_2: # %if.then
188 ; RV64IF-NEXT:    addi sp, sp, -16
189 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
190 ; RV64IF-NEXT:    call abort@plt
191   %1 = fcmp olt float %a, %b
192   br i1 %1, label %if.then, label %if.else
193 if.else:
194   ret void
195 if.then:
196   tail call void @abort()
197   unreachable
200 define void @br_fcmp_ole(float %a, float %b) nounwind {
201 ; RV32IF-LABEL: br_fcmp_ole:
202 ; RV32IF:       # %bb.0:
203 ; RV32IF-NEXT:    fle.s a0, fa0, fa1
204 ; RV32IF-NEXT:    bnez a0, .LBB6_2
205 ; RV32IF-NEXT:  # %bb.1: # %if.else
206 ; RV32IF-NEXT:    ret
207 ; RV32IF-NEXT:  .LBB6_2: # %if.then
208 ; RV32IF-NEXT:    addi sp, sp, -16
209 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
210 ; RV32IF-NEXT:    call abort@plt
212 ; RV64IF-LABEL: br_fcmp_ole:
213 ; RV64IF:       # %bb.0:
214 ; RV64IF-NEXT:    fle.s a0, fa0, fa1
215 ; RV64IF-NEXT:    bnez a0, .LBB6_2
216 ; RV64IF-NEXT:  # %bb.1: # %if.else
217 ; RV64IF-NEXT:    ret
218 ; RV64IF-NEXT:  .LBB6_2: # %if.then
219 ; RV64IF-NEXT:    addi sp, sp, -16
220 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
221 ; RV64IF-NEXT:    call abort@plt
222   %1 = fcmp ole float %a, %b
223   br i1 %1, label %if.then, label %if.else
224 if.else:
225   ret void
226 if.then:
227   tail call void @abort()
228   unreachable
231 define void @br_fcmp_one(float %a, float %b) nounwind {
232 ; RV32IF-LABEL: br_fcmp_one:
233 ; RV32IF:       # %bb.0:
234 ; RV32IF-NEXT:    flt.s a0, fa0, fa1
235 ; RV32IF-NEXT:    flt.s a1, fa1, fa0
236 ; RV32IF-NEXT:    or a0, a1, a0
237 ; RV32IF-NEXT:    bnez a0, .LBB7_2
238 ; RV32IF-NEXT:  # %bb.1: # %if.else
239 ; RV32IF-NEXT:    ret
240 ; RV32IF-NEXT:  .LBB7_2: # %if.then
241 ; RV32IF-NEXT:    addi sp, sp, -16
242 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
243 ; RV32IF-NEXT:    call abort@plt
245 ; RV64IF-LABEL: br_fcmp_one:
246 ; RV64IF:       # %bb.0:
247 ; RV64IF-NEXT:    flt.s a0, fa0, fa1
248 ; RV64IF-NEXT:    flt.s a1, fa1, fa0
249 ; RV64IF-NEXT:    or a0, a1, a0
250 ; RV64IF-NEXT:    bnez a0, .LBB7_2
251 ; RV64IF-NEXT:  # %bb.1: # %if.else
252 ; RV64IF-NEXT:    ret
253 ; RV64IF-NEXT:  .LBB7_2: # %if.then
254 ; RV64IF-NEXT:    addi sp, sp, -16
255 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
256 ; RV64IF-NEXT:    call abort@plt
257   %1 = fcmp one float %a, %b
258   br i1 %1, label %if.then, label %if.else
259 if.else:
260   ret void
261 if.then:
262   tail call void @abort()
263   unreachable
266 define void @br_fcmp_ord(float %a, float %b) nounwind {
267 ; RV32IF-LABEL: br_fcmp_ord:
268 ; RV32IF:       # %bb.0:
269 ; RV32IF-NEXT:    feq.s a0, fa1, fa1
270 ; RV32IF-NEXT:    feq.s a1, fa0, fa0
271 ; RV32IF-NEXT:    and a0, a1, a0
272 ; RV32IF-NEXT:    bnez a0, .LBB8_2
273 ; RV32IF-NEXT:  # %bb.1: # %if.else
274 ; RV32IF-NEXT:    ret
275 ; RV32IF-NEXT:  .LBB8_2: # %if.then
276 ; RV32IF-NEXT:    addi sp, sp, -16
277 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
278 ; RV32IF-NEXT:    call abort@plt
280 ; RV64IF-LABEL: br_fcmp_ord:
281 ; RV64IF:       # %bb.0:
282 ; RV64IF-NEXT:    feq.s a0, fa1, fa1
283 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
284 ; RV64IF-NEXT:    and a0, a1, a0
285 ; RV64IF-NEXT:    bnez a0, .LBB8_2
286 ; RV64IF-NEXT:  # %bb.1: # %if.else
287 ; RV64IF-NEXT:    ret
288 ; RV64IF-NEXT:  .LBB8_2: # %if.then
289 ; RV64IF-NEXT:    addi sp, sp, -16
290 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
291 ; RV64IF-NEXT:    call abort@plt
292   %1 = fcmp ord float %a, %b
293   br i1 %1, label %if.then, label %if.else
294 if.else:
295   ret void
296 if.then:
297   tail call void @abort()
298   unreachable
301 define void @br_fcmp_ueq(float %a, float %b) nounwind {
302 ; RV32IF-LABEL: br_fcmp_ueq:
303 ; RV32IF:       # %bb.0:
304 ; RV32IF-NEXT:    flt.s a0, fa0, fa1
305 ; RV32IF-NEXT:    flt.s a1, fa1, fa0
306 ; RV32IF-NEXT:    or a0, a1, a0
307 ; RV32IF-NEXT:    beqz a0, .LBB9_2
308 ; RV32IF-NEXT:  # %bb.1: # %if.else
309 ; RV32IF-NEXT:    ret
310 ; RV32IF-NEXT:  .LBB9_2: # %if.then
311 ; RV32IF-NEXT:    addi sp, sp, -16
312 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
313 ; RV32IF-NEXT:    call abort@plt
315 ; RV64IF-LABEL: br_fcmp_ueq:
316 ; RV64IF:       # %bb.0:
317 ; RV64IF-NEXT:    flt.s a0, fa0, fa1
318 ; RV64IF-NEXT:    flt.s a1, fa1, fa0
319 ; RV64IF-NEXT:    or a0, a1, a0
320 ; RV64IF-NEXT:    beqz a0, .LBB9_2
321 ; RV64IF-NEXT:  # %bb.1: # %if.else
322 ; RV64IF-NEXT:    ret
323 ; RV64IF-NEXT:  .LBB9_2: # %if.then
324 ; RV64IF-NEXT:    addi sp, sp, -16
325 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
326 ; RV64IF-NEXT:    call abort@plt
327   %1 = fcmp ueq float %a, %b
328   br i1 %1, label %if.then, label %if.else
329 if.else:
330   ret void
331 if.then:
332   tail call void @abort()
333   unreachable
336 define void @br_fcmp_ugt(float %a, float %b) nounwind {
337 ; RV32IF-LABEL: br_fcmp_ugt:
338 ; RV32IF:       # %bb.0:
339 ; RV32IF-NEXT:    fle.s a0, fa0, fa1
340 ; RV32IF-NEXT:    beqz a0, .LBB10_2
341 ; RV32IF-NEXT:  # %bb.1: # %if.else
342 ; RV32IF-NEXT:    ret
343 ; RV32IF-NEXT:  .LBB10_2: # %if.then
344 ; RV32IF-NEXT:    addi sp, sp, -16
345 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
346 ; RV32IF-NEXT:    call abort@plt
348 ; RV64IF-LABEL: br_fcmp_ugt:
349 ; RV64IF:       # %bb.0:
350 ; RV64IF-NEXT:    fle.s a0, fa0, fa1
351 ; RV64IF-NEXT:    beqz a0, .LBB10_2
352 ; RV64IF-NEXT:  # %bb.1: # %if.else
353 ; RV64IF-NEXT:    ret
354 ; RV64IF-NEXT:  .LBB10_2: # %if.then
355 ; RV64IF-NEXT:    addi sp, sp, -16
356 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
357 ; RV64IF-NEXT:    call abort@plt
358   %1 = fcmp ugt float %a, %b
359   br i1 %1, label %if.then, label %if.else
360 if.else:
361   ret void
362 if.then:
363   tail call void @abort()
364   unreachable
367 define void @br_fcmp_uge(float %a, float %b) nounwind {
368 ; RV32IF-LABEL: br_fcmp_uge:
369 ; RV32IF:       # %bb.0:
370 ; RV32IF-NEXT:    flt.s a0, fa0, fa1
371 ; RV32IF-NEXT:    beqz a0, .LBB11_2
372 ; RV32IF-NEXT:  # %bb.1: # %if.else
373 ; RV32IF-NEXT:    ret
374 ; RV32IF-NEXT:  .LBB11_2: # %if.then
375 ; RV32IF-NEXT:    addi sp, sp, -16
376 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
377 ; RV32IF-NEXT:    call abort@plt
379 ; RV64IF-LABEL: br_fcmp_uge:
380 ; RV64IF:       # %bb.0:
381 ; RV64IF-NEXT:    flt.s a0, fa0, fa1
382 ; RV64IF-NEXT:    beqz a0, .LBB11_2
383 ; RV64IF-NEXT:  # %bb.1: # %if.else
384 ; RV64IF-NEXT:    ret
385 ; RV64IF-NEXT:  .LBB11_2: # %if.then
386 ; RV64IF-NEXT:    addi sp, sp, -16
387 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
388 ; RV64IF-NEXT:    call abort@plt
389   %1 = fcmp uge float %a, %b
390   br i1 %1, label %if.then, label %if.else
391 if.else:
392   ret void
393 if.then:
394   tail call void @abort()
395   unreachable
398 define void @br_fcmp_ult(float %a, float %b) nounwind {
399 ; RV32IF-LABEL: br_fcmp_ult:
400 ; RV32IF:       # %bb.0:
401 ; RV32IF-NEXT:    fle.s a0, fa1, fa0
402 ; RV32IF-NEXT:    beqz a0, .LBB12_2
403 ; RV32IF-NEXT:  # %bb.1: # %if.else
404 ; RV32IF-NEXT:    ret
405 ; RV32IF-NEXT:  .LBB12_2: # %if.then
406 ; RV32IF-NEXT:    addi sp, sp, -16
407 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
408 ; RV32IF-NEXT:    call abort@plt
410 ; RV64IF-LABEL: br_fcmp_ult:
411 ; RV64IF:       # %bb.0:
412 ; RV64IF-NEXT:    fle.s a0, fa1, fa0
413 ; RV64IF-NEXT:    beqz a0, .LBB12_2
414 ; RV64IF-NEXT:  # %bb.1: # %if.else
415 ; RV64IF-NEXT:    ret
416 ; RV64IF-NEXT:  .LBB12_2: # %if.then
417 ; RV64IF-NEXT:    addi sp, sp, -16
418 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
419 ; RV64IF-NEXT:    call abort@plt
420   %1 = fcmp ult float %a, %b
421   br i1 %1, label %if.then, label %if.else
422 if.else:
423   ret void
424 if.then:
425   tail call void @abort()
426   unreachable
429 define void @br_fcmp_ule(float %a, float %b) nounwind {
430 ; RV32IF-LABEL: br_fcmp_ule:
431 ; RV32IF:       # %bb.0:
432 ; RV32IF-NEXT:    flt.s a0, fa1, fa0
433 ; RV32IF-NEXT:    beqz a0, .LBB13_2
434 ; RV32IF-NEXT:  # %bb.1: # %if.else
435 ; RV32IF-NEXT:    ret
436 ; RV32IF-NEXT:  .LBB13_2: # %if.then
437 ; RV32IF-NEXT:    addi sp, sp, -16
438 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
439 ; RV32IF-NEXT:    call abort@plt
441 ; RV64IF-LABEL: br_fcmp_ule:
442 ; RV64IF:       # %bb.0:
443 ; RV64IF-NEXT:    flt.s a0, fa1, fa0
444 ; RV64IF-NEXT:    beqz a0, .LBB13_2
445 ; RV64IF-NEXT:  # %bb.1: # %if.else
446 ; RV64IF-NEXT:    ret
447 ; RV64IF-NEXT:  .LBB13_2: # %if.then
448 ; RV64IF-NEXT:    addi sp, sp, -16
449 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
450 ; RV64IF-NEXT:    call abort@plt
451   %1 = fcmp ule float %a, %b
452   br i1 %1, label %if.then, label %if.else
453 if.else:
454   ret void
455 if.then:
456   tail call void @abort()
457   unreachable
460 define void @br_fcmp_une(float %a, float %b) nounwind {
461 ; RV32IF-LABEL: br_fcmp_une:
462 ; RV32IF:       # %bb.0:
463 ; RV32IF-NEXT:    feq.s a0, fa0, fa1
464 ; RV32IF-NEXT:    beqz a0, .LBB14_2
465 ; RV32IF-NEXT:  # %bb.1: # %if.else
466 ; RV32IF-NEXT:    ret
467 ; RV32IF-NEXT:  .LBB14_2: # %if.then
468 ; RV32IF-NEXT:    addi sp, sp, -16
469 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
470 ; RV32IF-NEXT:    call abort@plt
472 ; RV64IF-LABEL: br_fcmp_une:
473 ; RV64IF:       # %bb.0:
474 ; RV64IF-NEXT:    feq.s a0, fa0, fa1
475 ; RV64IF-NEXT:    beqz a0, .LBB14_2
476 ; RV64IF-NEXT:  # %bb.1: # %if.else
477 ; RV64IF-NEXT:    ret
478 ; RV64IF-NEXT:  .LBB14_2: # %if.then
479 ; RV64IF-NEXT:    addi sp, sp, -16
480 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
481 ; RV64IF-NEXT:    call abort@plt
482   %1 = fcmp une float %a, %b
483   br i1 %1, label %if.then, label %if.else
484 if.else:
485   ret void
486 if.then:
487   tail call void @abort()
488   unreachable
491 define void @br_fcmp_uno(float %a, float %b) nounwind {
492 ; RV32IF-LABEL: br_fcmp_uno:
493 ; RV32IF:       # %bb.0:
494 ; RV32IF-NEXT:    feq.s a0, fa1, fa1
495 ; RV32IF-NEXT:    feq.s a1, fa0, fa0
496 ; RV32IF-NEXT:    and a0, a1, a0
497 ; RV32IF-NEXT:    beqz a0, .LBB15_2
498 ; RV32IF-NEXT:  # %bb.1: # %if.else
499 ; RV32IF-NEXT:    ret
500 ; RV32IF-NEXT:  .LBB15_2: # %if.then
501 ; RV32IF-NEXT:    addi sp, sp, -16
502 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
503 ; RV32IF-NEXT:    call abort@plt
505 ; RV64IF-LABEL: br_fcmp_uno:
506 ; RV64IF:       # %bb.0:
507 ; RV64IF-NEXT:    feq.s a0, fa1, fa1
508 ; RV64IF-NEXT:    feq.s a1, fa0, fa0
509 ; RV64IF-NEXT:    and a0, a1, a0
510 ; RV64IF-NEXT:    beqz a0, .LBB15_2
511 ; RV64IF-NEXT:  # %bb.1: # %if.else
512 ; RV64IF-NEXT:    ret
513 ; RV64IF-NEXT:  .LBB15_2: # %if.then
514 ; RV64IF-NEXT:    addi sp, sp, -16
515 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
516 ; RV64IF-NEXT:    call abort@plt
517   %1 = fcmp uno float %a, %b
518   br i1 %1, label %if.then, label %if.else
519 if.else:
520   ret void
521 if.then:
522   tail call void @abort()
523   unreachable
526 define void @br_fcmp_true(float %a, float %b) nounwind {
527 ; RV32IF-LABEL: br_fcmp_true:
528 ; RV32IF:       # %bb.0:
529 ; RV32IF-NEXT:    li a0, 1
530 ; RV32IF-NEXT:    bnez a0, .LBB16_2
531 ; RV32IF-NEXT:  # %bb.1: # %if.else
532 ; RV32IF-NEXT:    ret
533 ; RV32IF-NEXT:  .LBB16_2: # %if.then
534 ; RV32IF-NEXT:    addi sp, sp, -16
535 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
536 ; RV32IF-NEXT:    call abort@plt
538 ; RV64IF-LABEL: br_fcmp_true:
539 ; RV64IF:       # %bb.0:
540 ; RV64IF-NEXT:    li a0, 1
541 ; RV64IF-NEXT:    bnez a0, .LBB16_2
542 ; RV64IF-NEXT:  # %bb.1: # %if.else
543 ; RV64IF-NEXT:    ret
544 ; RV64IF-NEXT:  .LBB16_2: # %if.then
545 ; RV64IF-NEXT:    addi sp, sp, -16
546 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
547 ; RV64IF-NEXT:    call abort@plt
548   %1 = fcmp true float %a, %b
549   br i1 %1, label %if.then, label %if.else
550 if.else:
551   ret void
552 if.then:
553   tail call void @abort()
554   unreachable
557 ; This test exists primarily to trigger RISCVInstrInfo::storeRegToStackSlot
558 ; and RISCVInstrInfo::loadRegFromStackSlot
559 define i32 @br_fcmp_store_load_stack_slot(float %a, float %b) nounwind {
560 ; RV32IF-LABEL: br_fcmp_store_load_stack_slot:
561 ; RV32IF:       # %bb.0: # %entry
562 ; RV32IF-NEXT:    addi sp, sp, -16
563 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
564 ; RV32IF-NEXT:    fsw fs0, 8(sp) # 4-byte Folded Spill
565 ; RV32IF-NEXT:    fmv.w.x fs0, zero
566 ; RV32IF-NEXT:    fmv.s fa0, fs0
567 ; RV32IF-NEXT:    call dummy@plt
568 ; RV32IF-NEXT:    feq.s a0, fa0, fs0
569 ; RV32IF-NEXT:    beqz a0, .LBB17_3
570 ; RV32IF-NEXT:  # %bb.1: # %if.end
571 ; RV32IF-NEXT:    fmv.s fa0, fs0
572 ; RV32IF-NEXT:    call dummy@plt
573 ; RV32IF-NEXT:    feq.s a0, fa0, fs0
574 ; RV32IF-NEXT:    beqz a0, .LBB17_3
575 ; RV32IF-NEXT:  # %bb.2: # %if.end4
576 ; RV32IF-NEXT:    li a0, 0
577 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
578 ; RV32IF-NEXT:    flw fs0, 8(sp) # 4-byte Folded Reload
579 ; RV32IF-NEXT:    addi sp, sp, 16
580 ; RV32IF-NEXT:    ret
581 ; RV32IF-NEXT:  .LBB17_3: # %if.then
582 ; RV32IF-NEXT:    call abort@plt
584 ; RV64IF-LABEL: br_fcmp_store_load_stack_slot:
585 ; RV64IF:       # %bb.0: # %entry
586 ; RV64IF-NEXT:    addi sp, sp, -16
587 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
588 ; RV64IF-NEXT:    fsw fs0, 4(sp) # 4-byte Folded Spill
589 ; RV64IF-NEXT:    fmv.w.x fs0, zero
590 ; RV64IF-NEXT:    fmv.s fa0, fs0
591 ; RV64IF-NEXT:    call dummy@plt
592 ; RV64IF-NEXT:    feq.s a0, fa0, fs0
593 ; RV64IF-NEXT:    beqz a0, .LBB17_3
594 ; RV64IF-NEXT:  # %bb.1: # %if.end
595 ; RV64IF-NEXT:    fmv.s fa0, fs0
596 ; RV64IF-NEXT:    call dummy@plt
597 ; RV64IF-NEXT:    feq.s a0, fa0, fs0
598 ; RV64IF-NEXT:    beqz a0, .LBB17_3
599 ; RV64IF-NEXT:  # %bb.2: # %if.end4
600 ; RV64IF-NEXT:    li a0, 0
601 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
602 ; RV64IF-NEXT:    flw fs0, 4(sp) # 4-byte Folded Reload
603 ; RV64IF-NEXT:    addi sp, sp, 16
604 ; RV64IF-NEXT:    ret
605 ; RV64IF-NEXT:  .LBB17_3: # %if.then
606 ; RV64IF-NEXT:    call abort@plt
607 entry:
608   %call = call float @dummy(float 0.000000e+00)
609   %cmp = fcmp une float %call, 0.000000e+00
610   br i1 %cmp, label %if.then, label %if.end
612 if.then:
613   call void @abort()
614   unreachable
616 if.end:
617   %call1 = call float @dummy(float 0.000000e+00)
618   %cmp2 = fcmp une float %call1, 0.000000e+00
619   br i1 %cmp2, label %if.then3, label %if.end4
621 if.then3:
622   call void @abort()
623   unreachable
625 if.end4:
626   ret i32 0