@@ -23,6 +23,50 @@ define float @select_fpclass_fadd(i1 %cond, float nofpclass(nan) %A, float %B) {
2323 ret float %D
2424}
2525
26+ define float @select_fpclass_fadd_ninf1 (i1 %cond , float nofpclass(nan) %A , float %B ) {
27+ ; CHECK-LABEL: @select_fpclass_fadd_ninf1(
28+ ; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
29+ ; CHECK-NEXT: [[D:%.*]] = fadd float [[A:%.*]], [[C]]
30+ ; CHECK-NEXT: ret float [[D]]
31+ ;
32+ %C = fadd ninf float %A , %B
33+ %D = select i1 %cond , float %C , float %A
34+ ret float %D
35+ }
36+
37+ define float @select_fpclass_fadd_ninf2 (i1 %cond , float nofpclass(nan) %A , float %B ) {
38+ ; CHECK-LABEL: @select_fpclass_fadd_ninf2(
39+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
40+ ; CHECK-NEXT: [[D:%.*]] = fadd float [[A:%.*]], [[C]]
41+ ; CHECK-NEXT: ret float [[D]]
42+ ;
43+ %C = fadd float %A , %B
44+ %D = select ninf i1 %cond , float %C , float %A
45+ ret float %D
46+ }
47+
48+ define float @select_fpclass_fadd_ninf3 (i1 %cond , float nofpclass(nan) %A , float %B ) {
49+ ; CHECK-LABEL: @select_fpclass_fadd_ninf3(
50+ ; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
51+ ; CHECK-NEXT: [[D:%.*]] = fadd ninf float [[A:%.*]], [[C]]
52+ ; CHECK-NEXT: ret float [[D]]
53+ ;
54+ %C = fadd ninf float %A , %B
55+ %D = select ninf i1 %cond , float %C , float %A
56+ ret float %D
57+ }
58+
59+ define float @select_fpclass_fadd_nnan_ninf (i1 %cond , float nofpclass(nan) %A , float %B ) {
60+ ; CHECK-LABEL: @select_fpclass_fadd_nnan_ninf(
61+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
62+ ; CHECK-NEXT: [[D:%.*]] = fadd float [[A:%.*]], [[C]]
63+ ; CHECK-NEXT: ret float [[D]]
64+ ;
65+ %C = fadd float %A , %B
66+ %D = select nnan ninf i1 %cond , float %C , float %A
67+ ret float %D
68+ }
69+
2670define float @select_nnan_fadd (i1 %cond , float %A , float %B ) {
2771; CHECK-LABEL: @select_nnan_fadd(
2872; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
@@ -47,7 +91,7 @@ define float @select_nnan_fadd_swapped(i1 %cond, float %A, float %B) {
4791
4892define float @select_nnan_fadd_fast_math (i1 %cond , float %A , float %B ) {
4993; CHECK-LABEL: @select_nnan_fadd_fast_math(
50- ; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
94+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
5195; CHECK-NEXT: [[D:%.*]] = fadd reassoc nnan arcp contract afn float [[A:%.*]], [[C]]
5296; CHECK-NEXT: ret float [[D]]
5397;
@@ -58,7 +102,7 @@ define float @select_nnan_fadd_fast_math(i1 %cond, float %A, float %B) {
58102
59103define float @select_nnan_fadd_swapped_fast_math (i1 %cond , float %A , float %B ) {
60104; CHECK-LABEL: @select_nnan_fadd_swapped_fast_math(
61- ; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float -0.000000e+00, float [[B:%.*]]
105+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float -0.000000e+00, float [[B:%.*]]
62106; CHECK-NEXT: [[D:%.*]] = fadd reassoc nnan arcp contract afn float [[A:%.*]], [[C]]
63107; CHECK-NEXT: ret float [[D]]
64108;
@@ -124,7 +168,7 @@ define float @select_nnan_fmul_swapped(i1 %cond, float %A, float %B) {
124168
125169define float @select_nnan_fmul_fast_math (i1 %cond , float %A , float %B ) {
126170; CHECK-LABEL: @select_nnan_fmul_fast_math(
127- ; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
171+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
128172; CHECK-NEXT: [[D:%.*]] = fmul reassoc nnan arcp contract afn float [[A:%.*]], [[C]]
129173; CHECK-NEXT: ret float [[D]]
130174;
@@ -135,7 +179,7 @@ define float @select_nnan_fmul_fast_math(i1 %cond, float %A, float %B) {
135179
136180define float @select_nnan_fmul_swapped_fast_math (i1 %cond , float %A , float %B ) {
137181; CHECK-LABEL: @select_nnan_fmul_swapped_fast_math(
138- ; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
182+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
139183; CHECK-NEXT: [[D:%.*]] = fmul reassoc nnan arcp contract afn float [[A:%.*]], [[C]]
140184; CHECK-NEXT: ret float [[D]]
141185;
@@ -144,6 +188,50 @@ define float @select_nnan_fmul_swapped_fast_math(i1 %cond, float %A, float %B) {
144188 ret float %D
145189}
146190
191+ define float @select_fpclass_fmul_ninf1 (i1 %cond , float nofpclass(nan) %A , float %B ) {
192+ ; CHECK-LABEL: @select_fpclass_fmul_ninf1(
193+ ; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
194+ ; CHECK-NEXT: [[D:%.*]] = fmul float [[A:%.*]], [[C]]
195+ ; CHECK-NEXT: ret float [[D]]
196+ ;
197+ %C = fmul ninf float %A , %B
198+ %D = select i1 %cond , float %C , float %A
199+ ret float %D
200+ }
201+
202+ define float @select_fpclass_fmul_ninf2 (i1 %cond , float nofpclass(nan) %A , float %B ) {
203+ ; CHECK-LABEL: @select_fpclass_fmul_ninf2(
204+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
205+ ; CHECK-NEXT: [[D:%.*]] = fmul float [[A:%.*]], [[C]]
206+ ; CHECK-NEXT: ret float [[D]]
207+ ;
208+ %C = fmul float %A , %B
209+ %D = select ninf i1 %cond , float %C , float %A
210+ ret float %D
211+ }
212+
213+ define float @select_fpclass_fmul_ninf3 (i1 %cond , float nofpclass(nan) %A , float %B ) {
214+ ; CHECK-LABEL: @select_fpclass_fmul_ninf3(
215+ ; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
216+ ; CHECK-NEXT: [[D:%.*]] = fmul ninf float [[A:%.*]], [[C]]
217+ ; CHECK-NEXT: ret float [[D]]
218+ ;
219+ %C = fmul ninf float %A , %B
220+ %D = select ninf i1 %cond , float %C , float %A
221+ ret float %D
222+ }
223+
224+ define float @select_fpclass_fmul_nnan_ninf (i1 %cond , float nofpclass(nan) %A , float %B ) {
225+ ; CHECK-LABEL: @select_fpclass_fmul_nnan_ninf(
226+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
227+ ; CHECK-NEXT: [[D:%.*]] = fmul float [[A:%.*]], [[C]]
228+ ; CHECK-NEXT: ret float [[D]]
229+ ;
230+ %C = fmul float %A , %B
231+ %D = select nnan ninf i1 %cond , float %C , float %A
232+ ret float %D
233+ }
234+
147235define float @select_nnan_fsub (i1 %cond , float %A , float %B ) {
148236; CHECK-LABEL: @select_nnan_fsub(
149237; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
@@ -168,7 +256,7 @@ define float @select_nnan_fsub_swapped(i1 %cond, float %A, float %B) {
168256
169257define float @select_nnan_fsub_fast_math (i1 %cond , float %A , float %B ) {
170258; CHECK-LABEL: @select_nnan_fsub_fast_math(
171- ; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
259+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
172260; CHECK-NEXT: [[D:%.*]] = fsub reassoc nnan arcp contract afn float [[A:%.*]], [[C]]
173261; CHECK-NEXT: ret float [[D]]
174262;
@@ -179,7 +267,7 @@ define float @select_nnan_fsub_fast_math(i1 %cond, float %A, float %B) {
179267
180268define float @select_nnan_fsub_swapped_fast_math (i1 %cond , float %A , float %B ) {
181269; CHECK-LABEL: @select_nnan_fsub_swapped_fast_math(
182- ; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float 0.000000e+00, float [[B:%.*]]
270+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float 0.000000e+00, float [[B:%.*]]
183271; CHECK-NEXT: [[D:%.*]] = fsub reassoc nnan arcp contract afn float [[A:%.*]], [[C]]
184272; CHECK-NEXT: ret float [[D]]
185273;
@@ -188,6 +276,50 @@ define float @select_nnan_fsub_swapped_fast_math(i1 %cond, float %A, float %B) {
188276 ret float %D
189277}
190278
279+ define float @select_fpclass_fsub_ninf1 (i1 %cond , float nofpclass(nan) %A , float %B ) {
280+ ; CHECK-LABEL: @select_fpclass_fsub_ninf1(
281+ ; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
282+ ; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]
283+ ; CHECK-NEXT: ret float [[D]]
284+ ;
285+ %C = fsub ninf float %A , %B
286+ %D = select i1 %cond , float %C , float %A
287+ ret float %D
288+ }
289+
290+ define float @select_fpclass_fsub_ninf2 (i1 %cond , float nofpclass(nan) %A , float %B ) {
291+ ; CHECK-LABEL: @select_fpclass_fsub_ninf2(
292+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
293+ ; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]
294+ ; CHECK-NEXT: ret float [[D]]
295+ ;
296+ %C = fsub float %A , %B
297+ %D = select ninf i1 %cond , float %C , float %A
298+ ret float %D
299+ }
300+
301+ define float @select_fpclass_fsub_ninf3 (i1 %cond , float nofpclass(nan) %A , float %B ) {
302+ ; CHECK-LABEL: @select_fpclass_fsub_ninf3(
303+ ; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
304+ ; CHECK-NEXT: [[D:%.*]] = fsub ninf float [[A:%.*]], [[C]]
305+ ; CHECK-NEXT: ret float [[D]]
306+ ;
307+ %C = fsub ninf float %A , %B
308+ %D = select ninf i1 %cond , float %C , float %A
309+ ret float %D
310+ }
311+
312+ define float @select_fpclass_fsub_nnan_ninf (i1 %cond , float nofpclass(nan) %A , float %B ) {
313+ ; CHECK-LABEL: @select_fpclass_fsub_nnan_ninf(
314+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
315+ ; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]
316+ ; CHECK-NEXT: ret float [[D]]
317+ ;
318+ %C = fsub float %A , %B
319+ %D = select nnan ninf i1 %cond , float %C , float %A
320+ ret float %D
321+ }
322+
191323define <4 x float > @select_nnan_nsz_fsub_v4f32 (<4 x i1 > %cond , <4 x float > %A , <4 x float > %B ) {
192324; CHECK-LABEL: @select_nnan_nsz_fsub_v4f32(
193325; CHECK-NEXT: [[C:%.*]] = select nnan nsz <4 x i1> [[COND:%.*]], <4 x float> [[B:%.*]], <4 x float> zeroinitializer
@@ -246,7 +378,7 @@ define float @select_nnan_fdiv_swapped(i1 %cond, float %A, float %B) {
246378
247379define float @select_nnan_fdiv_fast_math (i1 %cond , float %A , float %B ) {
248380; CHECK-LABEL: @select_nnan_fdiv_fast_math(
249- ; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
381+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
250382; CHECK-NEXT: [[D:%.*]] = fdiv reassoc nnan arcp contract afn float [[A:%.*]], [[C]]
251383; CHECK-NEXT: ret float [[D]]
252384;
@@ -257,7 +389,7 @@ define float @select_nnan_fdiv_fast_math(i1 %cond, float %A, float %B) {
257389
258390define float @select_nnan_fdiv_swapped_fast_math (i1 %cond , float %A , float %B ) {
259391; CHECK-LABEL: @select_nnan_fdiv_swapped_fast_math(
260- ; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
392+ ; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
261393; CHECK-NEXT: [[D:%.*]] = fdiv reassoc nnan arcp contract afn float [[A:%.*]], [[C]]
262394; CHECK-NEXT: ret float [[D]]
263395;
0 commit comments