Skip to content

Commit cf1963a

Browse files
authored
[InstCombine] Fix FMF propagation in foldSelectIntoOp (#114356)
Closes #113423.
1 parent a1c6dc2 commit cf1963a

File tree

3 files changed

+19
-20
lines changed

3 files changed

+19
-20
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -529,9 +529,6 @@ Instruction *InstCombinerImpl::foldSelectIntoOp(SelectInst &SI, Value *TrueVal,
529529
if (!OpToFold)
530530
return nullptr;
531531

532-
// TODO: We probably ought to revisit cases where the select and FP
533-
// instructions have different flags and add tests to ensure the
534-
// behaviour is correct.
535532
FastMathFlags FMF;
536533
if (isa<FPMathOperator>(&SI))
537534
FMF = SI.getFastMathFlags();
@@ -564,6 +561,8 @@ Instruction *InstCombinerImpl::foldSelectIntoOp(SelectInst &SI, Value *TrueVal,
564561
BinaryOperator *BO =
565562
BinaryOperator::Create(TVI->getOpcode(), FalseVal, NewSel);
566563
BO->copyIRFlags(TVI);
564+
if (isa<FPMathOperator>(&SI))
565+
BO->andIRFlags(NewSel);
567566
return BO;
568567
};
569568

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_nsz_fmul(float %x, float %y) {
468468
; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_fmul(
469469
; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
470470
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
471-
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nsz float [[X]], [[SCALED_X]]
471+
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
472472
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
473473
;
474474
%x.is.zero = fcmp oeq float %x, 0.0
@@ -482,7 +482,7 @@ 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
484484
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
485-
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul ninf nsz float [[X]], [[SCALED_X]]
485+
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
486486
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
487487
;
488488
%x.is.zero = fcmp oeq float %x, 0.0
@@ -496,7 +496,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_fmul(float %x, float %y) {
496496
; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_fmul(
497497
; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
498498
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
499-
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan nsz float [[X]], [[SCALED_X]]
499+
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
500500
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
501501
;
502502
%x.is.zero = fcmp oeq float %x, 0.0
@@ -510,7 +510,7 @@ 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
512512
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
513-
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan ninf float [[X]], [[SCALED_X]]
513+
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
514514
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
515515
;
516516
%x.is.zero = fcmp oeq float %x, 0.0
@@ -559,7 +559,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x, float %
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
561561
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
562-
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan ninf nsz float [[X]], [[SCALED_X]]
562+
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
563563
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
564564
;
565565
%x.is.zero = fcmp oeq float %x, 0.0
@@ -572,7 +572,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted(float %x
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
574574
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
575-
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan ninf nsz float [[X]], [[SCALED_X]]
575+
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
576576
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
577577
;
578578
%x.is.zero = fcmp oeq float %x, 0.0
@@ -586,7 +586,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_ne
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
588588
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
589-
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan ninf float [[X]], [[SCALED_X]]
589+
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
590590
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
591591
;
592592
%x.is.zero = fcmp oeq float %x, 0.0
@@ -599,7 +599,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_ne
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
601601
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
602-
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan ninf float [[X]], [[SCALED_X]]
602+
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
603603
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
604604
;
605605
%x.is.zero = fcmp oeq float %x, 0.0
@@ -706,7 +706,7 @@ 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
708708
; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00
709-
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan ninf nsz float [[X]], [[SCALED_X]]
709+
; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
710710
; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]
711711
;
712712
%x.is.zero = fcmp oeq float %x, 0.0

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ define float @select_nnan_fadd_swapped(i1 %cond, float %A, float %B) {
4848
define float @select_nnan_fadd_fast_math(i1 %cond, float %A, float %B) {
4949
; CHECK-LABEL: @select_nnan_fadd_fast_math(
5050
; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+00
51-
; CHECK-NEXT: [[D:%.*]] = fadd fast float [[A:%.*]], [[C]]
51+
; CHECK-NEXT: [[D:%.*]] = fadd nnan float [[A:%.*]], [[C]]
5252
; CHECK-NEXT: ret float [[D]]
5353
;
5454
%C = fadd fast float %A, %B
@@ -59,7 +59,7 @@ define float @select_nnan_fadd_fast_math(i1 %cond, float %A, float %B) {
5959
define float @select_nnan_fadd_swapped_fast_math(i1 %cond, float %A, float %B) {
6060
; CHECK-LABEL: @select_nnan_fadd_swapped_fast_math(
6161
; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float -0.000000e+00, float [[B:%.*]]
62-
; CHECK-NEXT: [[D:%.*]] = fadd fast float [[A:%.*]], [[C]]
62+
; CHECK-NEXT: [[D:%.*]] = fadd nnan float [[A:%.*]], [[C]]
6363
; CHECK-NEXT: ret float [[D]]
6464
;
6565
%C = fadd fast float %A, %B
@@ -125,7 +125,7 @@ define float @select_nnan_fmul_swapped(i1 %cond, float %A, float %B) {
125125
define float @select_nnan_fmul_fast_math(i1 %cond, float %A, float %B) {
126126
; CHECK-LABEL: @select_nnan_fmul_fast_math(
127127
; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
128-
; CHECK-NEXT: [[D:%.*]] = fmul fast float [[A:%.*]], [[C]]
128+
; CHECK-NEXT: [[D:%.*]] = fmul nnan float [[A:%.*]], [[C]]
129129
; CHECK-NEXT: ret float [[D]]
130130
;
131131
%C = fmul fast float %A, %B
@@ -136,7 +136,7 @@ define float @select_nnan_fmul_fast_math(i1 %cond, float %A, float %B) {
136136
define float @select_nnan_fmul_swapped_fast_math(i1 %cond, float %A, float %B) {
137137
; CHECK-LABEL: @select_nnan_fmul_swapped_fast_math(
138138
; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
139-
; CHECK-NEXT: [[D:%.*]] = fmul fast float [[A:%.*]], [[C]]
139+
; CHECK-NEXT: [[D:%.*]] = fmul nnan float [[A:%.*]], [[C]]
140140
; CHECK-NEXT: ret float [[D]]
141141
;
142142
%C = fmul fast float %A, %B
@@ -169,7 +169,7 @@ define float @select_nnan_fsub_swapped(i1 %cond, float %A, float %B) {
169169
define float @select_nnan_fsub_fast_math(i1 %cond, float %A, float %B) {
170170
; CHECK-LABEL: @select_nnan_fsub_fast_math(
171171
; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00
172-
; CHECK-NEXT: [[D:%.*]] = fsub fast float [[A:%.*]], [[C]]
172+
; CHECK-NEXT: [[D:%.*]] = fsub nnan float [[A:%.*]], [[C]]
173173
; CHECK-NEXT: ret float [[D]]
174174
;
175175
%C = fsub fast float %A, %B
@@ -180,7 +180,7 @@ define float @select_nnan_fsub_fast_math(i1 %cond, float %A, float %B) {
180180
define float @select_nnan_fsub_swapped_fast_math(i1 %cond, float %A, float %B) {
181181
; CHECK-LABEL: @select_nnan_fsub_swapped_fast_math(
182182
; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float 0.000000e+00, float [[B:%.*]]
183-
; CHECK-NEXT: [[D:%.*]] = fsub fast float [[A:%.*]], [[C]]
183+
; CHECK-NEXT: [[D:%.*]] = fsub nnan float [[A:%.*]], [[C]]
184184
; CHECK-NEXT: ret float [[D]]
185185
;
186186
%C = fsub fast float %A, %B
@@ -247,7 +247,7 @@ define float @select_nnan_fdiv_swapped(i1 %cond, float %A, float %B) {
247247
define float @select_nnan_fdiv_fast_math(i1 %cond, float %A, float %B) {
248248
; CHECK-LABEL: @select_nnan_fdiv_fast_math(
249249
; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00
250-
; CHECK-NEXT: [[D:%.*]] = fdiv fast float [[A:%.*]], [[C]]
250+
; CHECK-NEXT: [[D:%.*]] = fdiv nnan float [[A:%.*]], [[C]]
251251
; CHECK-NEXT: ret float [[D]]
252252
;
253253
%C = fdiv fast float %A, %B
@@ -258,7 +258,7 @@ define float @select_nnan_fdiv_fast_math(i1 %cond, float %A, float %B) {
258258
define float @select_nnan_fdiv_swapped_fast_math(i1 %cond, float %A, float %B) {
259259
; CHECK-LABEL: @select_nnan_fdiv_swapped_fast_math(
260260
; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]
261-
; CHECK-NEXT: [[D:%.*]] = fdiv fast float [[A:%.*]], [[C]]
261+
; CHECK-NEXT: [[D:%.*]] = fdiv nnan float [[A:%.*]], [[C]]
262262
; CHECK-NEXT: ret float [[D]]
263263
;
264264
%C = fdiv fast float %A, %B

0 commit comments

Comments
 (0)