xref: /llvm-project/llvm/test/CodeGen/ARM/unsafe-fneg-select-minnum-maxnum-combine.ll (revision 65420c8041f4ca44a3a14c5f7faf426ee6a7c6a4)
10ee04a1eSMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
20ee04a1eSMatt Arsenault; RUN: llc -mtriple=arm-- -mattr=+fullfp16 < %s | FileCheck %s
30ee04a1eSMatt Arsenault
40ee04a1eSMatt Arsenaultdefine float @select_fneg_a_or_8_cmp_olt_a_neg8_f32(float %a, float %b) #0 {
50ee04a1eSMatt Arsenault; CHECK-LABEL: select_fneg_a_or_8_cmp_olt_a_neg8_f32:
60ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
70ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s0, #-8.000000e+00
80ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov s2, r0
93b80d029SMatt Arsenault; CHECK-NEXT:    vminnm.f32 s0, s2, s0
100ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
113b80d029SMatt Arsenault; CHECK-NEXT:    eor r0, r0, #-2147483648
120ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
130ee04a1eSMatt Arsenault  %fneg.a = fneg nnan nsz float %a
140ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz olt float %a, -8.0
150ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, float %fneg.a, float 8.0
160ee04a1eSMatt Arsenault  ret float %min.a
170ee04a1eSMatt Arsenault}
180ee04a1eSMatt Arsenault
190ee04a1eSMatt Arsenaultdefine half @select_fneg_a_or_8_cmp_olt_a_neg8_f16(half %a, half %b) #0 {
200ee04a1eSMatt Arsenault; CHECK-LABEL: select_fneg_a_or_8_cmp_olt_a_neg8_f16:
210ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
220ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f16 s0, #-8.000000e+00
233b80d029SMatt Arsenault; CHECK-NEXT:    vmov.f16 s2, r0
243b80d029SMatt Arsenault; CHECK-NEXT:    vminnm.f16 s0, s2, s0
253b80d029SMatt Arsenault; CHECK-NEXT:    vneg.f16 s0, s0
260ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
270ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
280ee04a1eSMatt Arsenault  %fneg.a = fneg nnan nsz half %a
290ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz olt half %a, -8.0
300ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, half %fneg.a, half 8.0
310ee04a1eSMatt Arsenault  ret half %min.a
320ee04a1eSMatt Arsenault}
330ee04a1eSMatt Arsenault
340ee04a1eSMatt Arsenaultdefine float @select_fneg_a_or_8_cmp_ogt_a_neg8_f32(float %a, float %b) #0 {
350ee04a1eSMatt Arsenault; CHECK-LABEL: select_fneg_a_or_8_cmp_ogt_a_neg8_f32:
360ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
370ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s0, #-8.000000e+00
380ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov s2, r0
393b80d029SMatt Arsenault; CHECK-NEXT:    vmaxnm.f32 s0, s2, s0
400ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
413b80d029SMatt Arsenault; CHECK-NEXT:    eor r0, r0, #-2147483648
420ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
430ee04a1eSMatt Arsenault  %fneg.a = fneg nnan nsz float %a
440ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz ogt float %a, -8.0
450ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, float %fneg.a, float 8.0
460ee04a1eSMatt Arsenault  ret float %min.a
470ee04a1eSMatt Arsenault}
480ee04a1eSMatt Arsenault
490ee04a1eSMatt Arsenaultdefine half @select_fneg_a_or_8_cmp_ogt_a_neg8_f16(half %a, half %b) #0 {
500ee04a1eSMatt Arsenault; CHECK-LABEL: select_fneg_a_or_8_cmp_ogt_a_neg8_f16:
510ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
520ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f16 s0, #-8.000000e+00
533b80d029SMatt Arsenault; CHECK-NEXT:    vmov.f16 s2, r0
543b80d029SMatt Arsenault; CHECK-NEXT:    vmaxnm.f16 s0, s2, s0
553b80d029SMatt Arsenault; CHECK-NEXT:    vneg.f16 s0, s0
560ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
570ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
580ee04a1eSMatt Arsenault  %fneg.a = fneg nnan nsz half %a
590ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz ogt half %a, -8.0
600ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, half %fneg.a, half 8.0
610ee04a1eSMatt Arsenault  ret half %min.a
620ee04a1eSMatt Arsenault}
630ee04a1eSMatt Arsenault
640ee04a1eSMatt Arsenaultdefine float @select_fsub0_or_8_cmp_olt_fsub1_neg8_f32(float %a, float %b) #0 {
650ee04a1eSMatt Arsenault; CHECK-LABEL: select_fsub0_or_8_cmp_olt_fsub1_neg8_f32:
660ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
670ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s0, #4.000000e+00
680ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov s2, r0
690ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s4, #-8.000000e+00
70*65420c80SMatt Arsenault; CHECK-NEXT:    vsub.f32 s0, s0, s2
71*65420c80SMatt Arsenault; CHECK-NEXT:    vminnm.f32 s0, s0, s4
720ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
73*65420c80SMatt Arsenault; CHECK-NEXT:    eor r0, r0, #-2147483648
740ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
750ee04a1eSMatt Arsenault  %sub.0 = fsub nnan nsz float 4.0, %a
760ee04a1eSMatt Arsenault  %sub.1 = fsub nnan nsz float %a, 4.0
770ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz olt float %sub.0, -8.0
780ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, float %sub.1, float 8.0
790ee04a1eSMatt Arsenault  ret float %min.a
800ee04a1eSMatt Arsenault}
810ee04a1eSMatt Arsenault
820ee04a1eSMatt Arsenaultdefine float @select_fsub0_or_neg8_cmp_olt_fsub1_8_f32(float %a, float %b) #0 {
830ee04a1eSMatt Arsenault; CHECK-LABEL: select_fsub0_or_neg8_cmp_olt_fsub1_8_f32:
840ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
850ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s0, #4.000000e+00
860ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov s2, r0
870ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s4, #8.000000e+00
88*65420c80SMatt Arsenault; CHECK-NEXT:    vsub.f32 s0, s0, s2
89*65420c80SMatt Arsenault; CHECK-NEXT:    vminnm.f32 s0, s0, s4
900ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
91*65420c80SMatt Arsenault; CHECK-NEXT:    eor r0, r0, #-2147483648
920ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
930ee04a1eSMatt Arsenault  %sub.0 = fsub nnan nsz float 4.0, %a
940ee04a1eSMatt Arsenault  %sub.1 = fsub nnan nsz float %a, 4.0
950ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz olt float %sub.0, 8.0
960ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, float %sub.1, float -8.0
970ee04a1eSMatt Arsenault  ret float %min.a
980ee04a1eSMatt Arsenault}
990ee04a1eSMatt Arsenault
1000ee04a1eSMatt Arsenaultdefine float @select_mul4_or_neg8_cmp_olt_mulneg4_8_f32(float %a, float %b) #0 {
1010ee04a1eSMatt Arsenault; CHECK-LABEL: select_mul4_or_neg8_cmp_olt_mulneg4_8_f32:
1020ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
1030ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s0, #-4.000000e+00
1040ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov s2, r0
105*65420c80SMatt Arsenault; CHECK-NEXT:    vmov.f32 s4, #8.000000e+00
1060ee04a1eSMatt Arsenault; CHECK-NEXT:    vmul.f32 s0, s2, s0
107*65420c80SMatt Arsenault; CHECK-NEXT:    vminnm.f32 s0, s0, s4
1080ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
109*65420c80SMatt Arsenault; CHECK-NEXT:    eor r0, r0, #-2147483648
1100ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
1110ee04a1eSMatt Arsenault  %mul.0 = fmul nnan nsz float %a, 4.0
1120ee04a1eSMatt Arsenault  %mul.1 = fmul nnan nsz float %a, -4.0
1130ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz olt float %mul.1, 8.0
1140ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float -8.0
1150ee04a1eSMatt Arsenault  ret float %min.a
1160ee04a1eSMatt Arsenault}
1170ee04a1eSMatt Arsenault
1180ee04a1eSMatt Arsenaultdefine float @select_mul4_or_8_cmp_olt_mulneg4_neg8_f32(float %a, float %b) #0 {
1190ee04a1eSMatt Arsenault; CHECK-LABEL: select_mul4_or_8_cmp_olt_mulneg4_neg8_f32:
1200ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
1210ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s0, #-4.000000e+00
1220ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov s2, r0
123*65420c80SMatt Arsenault; CHECK-NEXT:    vmov.f32 s4, #-8.000000e+00
1240ee04a1eSMatt Arsenault; CHECK-NEXT:    vmul.f32 s0, s2, s0
125*65420c80SMatt Arsenault; CHECK-NEXT:    vminnm.f32 s0, s0, s4
1260ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
127*65420c80SMatt Arsenault; CHECK-NEXT:    eor r0, r0, #-2147483648
1280ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
1290ee04a1eSMatt Arsenault  %mul.0 = fmul nnan nsz float %a, 4.0
1300ee04a1eSMatt Arsenault  %mul.1 = fmul nnan nsz float %a, -4.0
1310ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz olt float %mul.1, -8.0
1320ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float 8.0
1330ee04a1eSMatt Arsenault  ret float %min.a
1340ee04a1eSMatt Arsenault}
1350ee04a1eSMatt Arsenault
1360ee04a1eSMatt Arsenaultdefine float @select_mul4_or_8_cmp_olt_mulneg4_8_f32(float %a, float %b) #0 {
1370ee04a1eSMatt Arsenault; CHECK-LABEL: select_mul4_or_8_cmp_olt_mulneg4_8_f32:
1380ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
1390ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s0, #-4.000000e+00
1400ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov s2, r0
1410ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s6, #8.000000e+00
1420ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s4, #4.000000e+00
1430ee04a1eSMatt Arsenault; CHECK-NEXT:    vmul.f32 s0, s2, s0
1440ee04a1eSMatt Arsenault; CHECK-NEXT:    vmul.f32 s2, s2, s4
1450ee04a1eSMatt Arsenault; CHECK-NEXT:    vcmp.f32 s6, s0
1460ee04a1eSMatt Arsenault; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
1470ee04a1eSMatt Arsenault; CHECK-NEXT:    vselgt.f32 s0, s2, s6
1480ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
1490ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
1500ee04a1eSMatt Arsenault  %mul.0 = fmul nnan nsz float %a, 4.0
1510ee04a1eSMatt Arsenault  %mul.1 = fmul nnan nsz float %a, -4.0
1520ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz olt float %mul.1, 8.0
1530ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float 8.0
1540ee04a1eSMatt Arsenault  ret float %min.a
1550ee04a1eSMatt Arsenault}
1560ee04a1eSMatt Arsenault
1570ee04a1eSMatt Arsenaultdefine float @select_mul4_or_neg8_cmp_olt_mulneg4_neg8_f32(float %a, float %b) #0 {
1580ee04a1eSMatt Arsenault; CHECK-LABEL: select_mul4_or_neg8_cmp_olt_mulneg4_neg8_f32:
1590ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
1600ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s0, #-4.000000e+00
1610ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov s2, r0
1620ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s6, #-8.000000e+00
1630ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s4, #4.000000e+00
1640ee04a1eSMatt Arsenault; CHECK-NEXT:    vmul.f32 s0, s2, s0
1650ee04a1eSMatt Arsenault; CHECK-NEXT:    vmul.f32 s2, s2, s4
1660ee04a1eSMatt Arsenault; CHECK-NEXT:    vcmp.f32 s6, s0
1670ee04a1eSMatt Arsenault; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
1680ee04a1eSMatt Arsenault; CHECK-NEXT:    vselgt.f32 s0, s2, s6
1690ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
1700ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
1710ee04a1eSMatt Arsenault  %mul.0 = fmul nnan nsz float %a, 4.0
1720ee04a1eSMatt Arsenault  %mul.1 = fmul nnan nsz float %a, -4.0
1730ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz olt float %mul.1, -8.0
1740ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float -8.0
1750ee04a1eSMatt Arsenault  ret float %min.a
1760ee04a1eSMatt Arsenault}
1770ee04a1eSMatt Arsenault
1780ee04a1eSMatt Arsenaultdefine float @select_mulneg4_or_neg8_cmp_olt_mul4_8_f32(float %a, float %b) #0 {
1790ee04a1eSMatt Arsenault; CHECK-LABEL: select_mulneg4_or_neg8_cmp_olt_mul4_8_f32:
1800ee04a1eSMatt Arsenault; CHECK:       @ %bb.0:
1810ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov.f32 s0, #4.000000e+00
1820ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov s2, r0
183*65420c80SMatt Arsenault; CHECK-NEXT:    vmov.f32 s4, #8.000000e+00
1840ee04a1eSMatt Arsenault; CHECK-NEXT:    vmul.f32 s0, s2, s0
185*65420c80SMatt Arsenault; CHECK-NEXT:    vminnm.f32 s0, s0, s4
1860ee04a1eSMatt Arsenault; CHECK-NEXT:    vmov r0, s0
187*65420c80SMatt Arsenault; CHECK-NEXT:    eor r0, r0, #-2147483648
1880ee04a1eSMatt Arsenault; CHECK-NEXT:    mov pc, lr
1890ee04a1eSMatt Arsenault  %mul.0 = fmul nnan nsz float %a, -4.0
1900ee04a1eSMatt Arsenault  %mul.1 = fmul nnan nsz float %a, 4.0
1910ee04a1eSMatt Arsenault  %cmp.a = fcmp nnan nsz olt float %mul.1, 8.0
1920ee04a1eSMatt Arsenault  %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float -8.0
1930ee04a1eSMatt Arsenault  ret float %min.a
1940ee04a1eSMatt Arsenault}
1950ee04a1eSMatt Arsenault
1960ee04a1eSMatt Arsenault; FIXME: Should be unnecessary
1970ee04a1eSMatt Arsenaultattributes #0 = { "no-signed-zeros-fp-math"="true" }
198