@@ -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