Skip to content

Commit efc502d

Browse files
dtcxzywakadutta
authored andcommitted
[InstCombine] Fix flag propagation in foldSelectIntoOp (llvm#162003)
Consider the following transform: ``` C = binop float A, nnan OOp D = select ninf, i1 cond, float C, float A -> E = select ninf, i1 cond, float OOp, float Identity F = binop float A, E ``` We cannot propagate ninf from the original select, because OOp may be inf, and the flag only guarantees that FalseVal (op OOp) is never infinity. Examples: -inf + +inf = NaN, -inf - -inf = NaN, 0 * inf = NaN Specifically, if the original select has both ninf and nnan, we can safely propagate the flag. Alive2: + fadd: https://alive2.llvm.org/ce/z/TWfktv + fsub: https://alive2.llvm.org/ce/z/RAsjJb + fmul: https://alive2.llvm.org/ce/z/8eg4ND Closes llvm#161634.
1 parent 57efd0d commit efc502d

File tree

5 files changed

+172
-30
lines changed

5 files changed

+172
-30
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -544,8 +544,18 @@ Instruction *InstCombinerImpl::foldSelectIntoOp(SelectInst &SI, Value *TrueVal,
544544

545545
Value *NewSel = Builder.CreateSelect(SI.getCondition(), Swapped ? C : OOp,
546546
Swapped ? OOp : C, "", &SI);
547-
if (isa<FPMathOperator>(&SI))
548-
cast<Instruction>(NewSel)->setFastMathFlags(FMF);
547+
if (isa<FPMathOperator>(&SI)) {
548+
FastMathFlags NewSelFMF = FMF;
549+
// We cannot propagate ninf from the original select, because OOp may be
550+
// inf and the flag only guarantees that FalseVal (op OOp) is never
551+
// infinity.
552+
// Examples: -inf + +inf = NaN, -inf - -inf = NaN, 0 * inf = NaN
553+
// Specifically, if the original select has both ninf and nnan, we can
554+
// safely propagate the flag.
555+
NewSelFMF.setNoInfs(TVI->hasNoInfs() ||
556+
(NewSelFMF.noInfs() && NewSelFMF.noNaNs()));
557+
cast<Instruction>(NewSel)->setFastMathFlags(NewSelFMF);
558+
}
549559
NewSel->takeName(TVI);
550560
BinaryOperator *BO =
551561
BinaryOperator::Create(TVI->getOpcode(), FalseVal, NewSel);

llvm/test/Transforms/InstCombine/fold-select-fmul-if-zero.ll

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_nsz_fmul(float %x, float %y) {
481481
define float @fmul_by_var_if_0_oeq_zero_f32_nsz_ninf_fmul(float %x, float %y) {
482482
; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_ninf_fmul(
483483
; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
484-
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
484+
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
485485
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
486486
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
487487
;
@@ -509,7 +509,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_fmul(float %x, float %y) {
509509
define float @fmul_by_var_if_0_oeq_zero_f32_nnan_ninf_fmul(float %x, float %y) {
510510
; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nnan_ninf_fmul(
511511
; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
512-
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
512+
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
513513
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
514514
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
515515
;
@@ -558,7 +558,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz_inverted(f
558558
define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x, float %y) {
559559
; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(
560560
; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
561-
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
561+
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
562562
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
563563
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
564564
;
@@ -571,7 +571,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x, float %
571571
define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted(float %x, float %y) {
572572
; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted(
573573
; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
574-
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
574+
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
575575
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
576576
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
577577
;
@@ -585,7 +585,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted(float %x
585585
define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero(float %x, float nofpclass(nzero) %y) {
586586
; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero(
587587
; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
588-
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
588+
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
589589
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
590590
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
591591
;
@@ -598,7 +598,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_ne
598598
define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero_negsub(float %x, float nofpclass(nzero nsub) %y) {
599599
; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero_negsub(
600600
; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
601-
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
601+
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
602602
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
603603
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
604604
;
@@ -705,7 +705,7 @@ define float @fmul_by_self_if_0_oeq_zero_f32(float %x) {
705705
define float @fmul_by_self_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x) {
706706
; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(
707707
; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
708-
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00
708+
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00
709709
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
710710
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
711711
;

llvm/test/Transforms/InstCombine/select-binop-foldable-floating-point.ll

Lines changed: 140 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
2670
define 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

4892
define 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

59103
define 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

125169
define 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

136180
define 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+
147235
define 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

169257
define 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

180268
define 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+
191323
define <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

247379
define 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

258390
define 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
;

llvm/test/Transforms/LoopVectorize/ARM/mve-selectandorcost.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ define float @test(ptr nocapture readonly %pA, ptr nocapture readonly %pB, i32 %
4545
; CHECK-NEXT: [[TMP7:%.*]] = fsub fast <4 x float> [[WIDE_LOAD]], [[WIDE_LOAD7]]
4646
; CHECK-NEXT: [[TMP8:%.*]] = call fast <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP7]])
4747
; CHECK-NEXT: [[TMP9:%.*]] = fdiv fast <4 x float> [[TMP8]], [[TMP6]]
48-
; CHECK-NEXT: [[TMP10:%.*]] = select <4 x i1> [[TMP20]], <4 x float> [[TMP9]], <4 x float> splat (float -0.000000e+00)
48+
; CHECK-NEXT: [[TMP10:%.*]] = select ninf <4 x i1> [[TMP20]], <4 x float> [[TMP9]], <4 x float> splat (float -0.000000e+00)
4949
; CHECK-NEXT: [[PREDPHI]] = fadd reassoc arcp contract afn <4 x float> [[VEC_PHI]], [[TMP10]]
5050
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
5151
; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]

0 commit comments

Comments
 (0)