Skip to content

Commit 0ee6bad

Browse files
committed
[InstCombine] try to forward-propagate some FMF to select
This is intended to mitigate potential regressions that would result from restricting this fold for NANs as discussed in issue #59279. Ideally, we could do this more generally because we have known problems seeing/generating FMF on a select, but there are likely many corner cases that need to verified. For example, I thought this propagation would be valid without looking at the condition value and for 'nsz' too, but according to Alive2, it is not: https://alive2.llvm.org/ce/z/AnG6As
1 parent d153655 commit 0ee6bad

File tree

3 files changed

+57
-40
lines changed

3 files changed

+57
-40
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2540,6 +2540,7 @@ static Instruction *foldSelectWithFCmpToFabs(SelectInst &SI,
25402540
InstCombinerImpl &IC) {
25412541
Value *CondVal = SI.getCondition();
25422542

2543+
bool ChangedFMF = false;
25432544
for (bool Swap : {false, true}) {
25442545
Value *TrueVal = SI.getTrueValue();
25452546
Value *X = SI.getFalseValue();
@@ -2564,13 +2565,29 @@ static Instruction *foldSelectWithFCmpToFabs(SelectInst &SI,
25642565
}
25652566
}
25662567

2568+
if (!match(TrueVal, m_FNeg(m_Specific(X))))
2569+
return nullptr;
2570+
2571+
// Forward-propagate nnan and ninf from the fneg to the select.
2572+
// If all inputs are not those values, then the select is not either.
2573+
// Note: nsz is defined differently, so it may not be correct to propagate.
2574+
FastMathFlags FMF = cast<FPMathOperator>(TrueVal)->getFastMathFlags();
2575+
if (FMF.noNaNs() && !SI.hasNoNaNs()) {
2576+
SI.setHasNoNaNs(true);
2577+
ChangedFMF = true;
2578+
}
2579+
if (FMF.noInfs() && !SI.hasNoInfs()) {
2580+
SI.setHasNoInfs(true);
2581+
ChangedFMF = true;
2582+
}
2583+
25672584
// With nsz, when 'Swap' is false:
25682585
// fold (X < +/-0.0) ? -X : X or (X <= +/-0.0) ? -X : X to fabs(X)
25692586
// fold (X > +/-0.0) ? -X : X or (X >= +/-0.0) ? -X : X to -fabs(x)
25702587
// when 'Swap' is true:
25712588
// fold (X > +/-0.0) ? X : -X or (X >= +/-0.0) ? X : -X to fabs(X)
25722589
// fold (X < +/-0.0) ? X : -X or (X <= +/-0.0) ? X : -X to -fabs(X)
2573-
if (!match(TrueVal, m_FNeg(m_Specific(X))) || !SI.hasNoSignedZeros())
2590+
if (!SI.hasNoSignedZeros())
25742591
return nullptr;
25752592

25762593
if (Swap)
@@ -2593,7 +2610,7 @@ static Instruction *foldSelectWithFCmpToFabs(SelectInst &SI,
25932610
}
25942611
}
25952612

2596-
return nullptr;
2613+
return ChangedFMF ? &SI : nullptr;
25972614
}
25982615

25992616
// Match the following IR pattern:

llvm/test/Transforms/InstCombine/fabs.ll

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ define double @select_fcmp_nnan_nsz_olt_zero(double %x) {
473473
; CHECK-LABEL: @select_fcmp_nnan_nsz_olt_zero(
474474
; CHECK-NEXT: [[LTZERO:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
475475
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz double [[X]]
476-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LTZERO]], double [[NEGX]], double [[X]]
476+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[LTZERO]], double [[NEGX]], double [[X]]
477477
; CHECK-NEXT: ret double [[FABS]]
478478
;
479479
%ltzero = fcmp olt double %x, 0.0
@@ -499,7 +499,7 @@ define double @select_fcmp_nnan_nsz_ult_zero(double %x) {
499499
; CHECK-LABEL: @select_fcmp_nnan_nsz_ult_zero(
500500
; CHECK-NEXT: [[LTZERO:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
501501
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz double [[X]]
502-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LTZERO]], double [[NEGX]], double [[X]]
502+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[LTZERO]], double [[NEGX]], double [[X]]
503503
; CHECK-NEXT: ret double [[FABS]]
504504
;
505505
%ltzero = fcmp ult double %x, 0.0
@@ -512,7 +512,7 @@ define double @select_fcmp_nnan_nsz_olt_zero_unary_fneg(double %x) {
512512
; CHECK-LABEL: @select_fcmp_nnan_nsz_olt_zero_unary_fneg(
513513
; CHECK-NEXT: [[LTZERO:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
514514
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz double [[X]]
515-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LTZERO]], double [[NEGX]], double [[X]]
515+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[LTZERO]], double [[NEGX]], double [[X]]
516516
; CHECK-NEXT: ret double [[FABS]]
517517
;
518518
%ltzero = fcmp olt double %x, 0.0
@@ -527,7 +527,7 @@ define double @select_fcmp_nnan_nsz_ult_zero_unary_fneg(double %x) {
527527
; CHECK-LABEL: @select_fcmp_nnan_nsz_ult_zero_unary_fneg(
528528
; CHECK-NEXT: [[LTZERO:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
529529
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz double [[X]]
530-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LTZERO]], double [[NEGX]], double [[X]]
530+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[LTZERO]], double [[NEGX]], double [[X]]
531531
; CHECK-NEXT: ret double [[FABS]]
532532
;
533533
%ltzero = fcmp ult double %x, 0.0
@@ -542,7 +542,7 @@ define float @select_fcmp_nnan_nsz_olt_negzero(float %x) {
542542
; CHECK-LABEL: @select_fcmp_nnan_nsz_olt_negzero(
543543
; CHECK-NEXT: [[LTZERO:%.*]] = fcmp olt float [[X:%.*]], 0.000000e+00
544544
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan ninf nsz float [[X]]
545-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LTZERO]], float [[NEGX]], float [[X]]
545+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[LTZERO]], float [[NEGX]], float [[X]]
546546
; CHECK-NEXT: ret float [[FABS]]
547547
;
548548
%ltzero = fcmp olt float %x, -0.0
@@ -568,7 +568,7 @@ define float @select_fcmp_nnan_nsz_ult_negzero(float %x) {
568568
; CHECK-LABEL: @select_fcmp_nnan_nsz_ult_negzero(
569569
; CHECK-NEXT: [[LTZERO:%.*]] = fcmp ult float [[X:%.*]], 0.000000e+00
570570
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan ninf nsz float [[X]]
571-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LTZERO]], float [[NEGX]], float [[X]]
571+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[LTZERO]], float [[NEGX]], float [[X]]
572572
; CHECK-NEXT: ret float [[FABS]]
573573
;
574574
%ltzero = fcmp ult float %x, -0.0
@@ -581,7 +581,7 @@ define float @select_fcmp_nnan_nsz_olt_negzero_unary_fneg(float %x) {
581581
; CHECK-LABEL: @select_fcmp_nnan_nsz_olt_negzero_unary_fneg(
582582
; CHECK-NEXT: [[LTZERO:%.*]] = fcmp olt float [[X:%.*]], 0.000000e+00
583583
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan ninf nsz float [[X]]
584-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LTZERO]], float [[NEGX]], float [[X]]
584+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[LTZERO]], float [[NEGX]], float [[X]]
585585
; CHECK-NEXT: ret float [[FABS]]
586586
;
587587
%ltzero = fcmp olt float %x, -0.0
@@ -596,7 +596,7 @@ define float @select_fcmp_nnan_nsz_ult_negzero_unary_fneg(float %x) {
596596
; CHECK-LABEL: @select_fcmp_nnan_nsz_ult_negzero_unary_fneg(
597597
; CHECK-NEXT: [[LTZERO:%.*]] = fcmp ult float [[X:%.*]], 0.000000e+00
598598
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan ninf nsz float [[X]]
599-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LTZERO]], float [[NEGX]], float [[X]]
599+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[LTZERO]], float [[NEGX]], float [[X]]
600600
; CHECK-NEXT: ret float [[FABS]]
601601
;
602602
%ltzero = fcmp ult float %x, -0.0
@@ -611,7 +611,7 @@ define double @select_fcmp_nnan_nsz_ole_zero(double %x) {
611611
; CHECK-LABEL: @select_fcmp_nnan_nsz_ole_zero(
612612
; CHECK-NEXT: [[LEZERO:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
613613
; CHECK-NEXT: [[NEGX:%.*]] = fneg fast double [[X]]
614-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], double [[NEGX]], double [[X]]
614+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[LEZERO]], double [[NEGX]], double [[X]]
615615
; CHECK-NEXT: ret double [[FABS]]
616616
;
617617
%lezero = fcmp ole double %x, 0.0
@@ -637,7 +637,7 @@ define double @select_fcmp_nnan_nsz_ule_zero(double %x) {
637637
; CHECK-LABEL: @select_fcmp_nnan_nsz_ule_zero(
638638
; CHECK-NEXT: [[LEZERO:%.*]] = fcmp ule double [[X:%.*]], 0.000000e+00
639639
; CHECK-NEXT: [[NEGX:%.*]] = fneg fast double [[X]]
640-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], double [[NEGX]], double [[X]]
640+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[LEZERO]], double [[NEGX]], double [[X]]
641641
; CHECK-NEXT: ret double [[FABS]]
642642
;
643643
%lezero = fcmp ule double %x, 0.0
@@ -650,7 +650,7 @@ define double @select_fcmp_nnan_nsz_ole_zero_unary_fneg(double %x) {
650650
; CHECK-LABEL: @select_fcmp_nnan_nsz_ole_zero_unary_fneg(
651651
; CHECK-NEXT: [[LEZERO:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
652652
; CHECK-NEXT: [[NEGX:%.*]] = fneg fast double [[X]]
653-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], double [[NEGX]], double [[X]]
653+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[LEZERO]], double [[NEGX]], double [[X]]
654654
; CHECK-NEXT: ret double [[FABS]]
655655
;
656656
%lezero = fcmp ole double %x, 0.0
@@ -665,7 +665,7 @@ define double @select_fcmp_nnan_nsz_ule_zero_unary_fneg(double %x) {
665665
; CHECK-LABEL: @select_fcmp_nnan_nsz_ule_zero_unary_fneg(
666666
; CHECK-NEXT: [[LEZERO:%.*]] = fcmp ule double [[X:%.*]], 0.000000e+00
667667
; CHECK-NEXT: [[NEGX:%.*]] = fneg fast double [[X]]
668-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], double [[NEGX]], double [[X]]
668+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[LEZERO]], double [[NEGX]], double [[X]]
669669
; CHECK-NEXT: ret double [[FABS]]
670670
;
671671
%lezero = fcmp ule double %x, 0.0
@@ -680,7 +680,7 @@ define float @select_fcmp_nnan_nsz_ole_negzero(float %x) {
680680
; CHECK-LABEL: @select_fcmp_nnan_nsz_ole_negzero(
681681
; CHECK-NEXT: [[LEZERO:%.*]] = fcmp ole float [[X:%.*]], 0.000000e+00
682682
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz float [[X]]
683-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], float [[NEGX]], float [[X]]
683+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[LEZERO]], float [[NEGX]], float [[X]]
684684
; CHECK-NEXT: ret float [[FABS]]
685685
;
686686
%lezero = fcmp ole float %x, -0.0
@@ -706,7 +706,7 @@ define float @select_fcmp_nnan_nsz_ule_negzero(float %x) {
706706
; CHECK-LABEL: @select_fcmp_nnan_nsz_ule_negzero(
707707
; CHECK-NEXT: [[LEZERO:%.*]] = fcmp ule float [[X:%.*]], 0.000000e+00
708708
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz float [[X]]
709-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], float [[NEGX]], float [[X]]
709+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[LEZERO]], float [[NEGX]], float [[X]]
710710
; CHECK-NEXT: ret float [[FABS]]
711711
;
712712
%lezero = fcmp ule float %x, -0.0
@@ -719,7 +719,7 @@ define float @select_fcmp_nnan_nsz_ole_negzero_unary_fneg(float %x) {
719719
; CHECK-LABEL: @select_fcmp_nnan_nsz_ole_negzero_unary_fneg(
720720
; CHECK-NEXT: [[LEZERO:%.*]] = fcmp ole float [[X:%.*]], 0.000000e+00
721721
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz float [[X]]
722-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], float [[NEGX]], float [[X]]
722+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[LEZERO]], float [[NEGX]], float [[X]]
723723
; CHECK-NEXT: ret float [[FABS]]
724724
;
725725
%lezero = fcmp ole float %x, -0.0
@@ -734,7 +734,7 @@ define float @select_fcmp_nnan_nsz_ule_negzero_unary_fneg(float %x) {
734734
; CHECK-LABEL: @select_fcmp_nnan_nsz_ule_negzero_unary_fneg(
735735
; CHECK-NEXT: [[LEZERO:%.*]] = fcmp ule float [[X:%.*]], 0.000000e+00
736736
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz float [[X]]
737-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], float [[NEGX]], float [[X]]
737+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[LEZERO]], float [[NEGX]], float [[X]]
738738
; CHECK-NEXT: ret float [[FABS]]
739739
;
740740
%lezero = fcmp ule float %x, -0.0
@@ -771,7 +771,7 @@ define <2 x float> @select_fcmp_nnan_nsz_ogt_zero(<2 x float> %x) {
771771
; CHECK-LABEL: @select_fcmp_nnan_nsz_ogt_zero(
772772
; CHECK-NEXT: [[GTZERO:%.*]] = fcmp ogt <2 x float> [[X:%.*]], zeroinitializer
773773
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz arcp <2 x float> [[X]]
774-
; CHECK-NEXT: [[FABS:%.*]] = select <2 x i1> [[GTZERO]], <2 x float> [[X]], <2 x float> [[NEGX]]
774+
; CHECK-NEXT: [[FABS:%.*]] = select nnan <2 x i1> [[GTZERO]], <2 x float> [[X]], <2 x float> [[NEGX]]
775775
; CHECK-NEXT: ret <2 x float> [[FABS]]
776776
;
777777
%gtzero = fcmp ogt <2 x float> %x, zeroinitializer
@@ -786,7 +786,7 @@ define <2 x float> @select_fcmp_nnan_nsz_ugt_zero(<2 x float> %x) {
786786
; CHECK-LABEL: @select_fcmp_nnan_nsz_ugt_zero(
787787
; CHECK-NEXT: [[GTZERO:%.*]] = fcmp ugt <2 x float> [[X:%.*]], zeroinitializer
788788
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz arcp <2 x float> [[X]]
789-
; CHECK-NEXT: [[FABS:%.*]] = select <2 x i1> [[GTZERO]], <2 x float> [[X]], <2 x float> [[NEGX]]
789+
; CHECK-NEXT: [[FABS:%.*]] = select nnan <2 x i1> [[GTZERO]], <2 x float> [[X]], <2 x float> [[NEGX]]
790790
; CHECK-NEXT: ret <2 x float> [[FABS]]
791791
;
792792
%gtzero = fcmp ugt <2 x float> %x, zeroinitializer
@@ -799,7 +799,7 @@ define <2 x float> @select_fcmp_nnan_nsz_ogt_zero_unary_fneg(<2 x float> %x) {
799799
; CHECK-LABEL: @select_fcmp_nnan_nsz_ogt_zero_unary_fneg(
800800
; CHECK-NEXT: [[GTZERO:%.*]] = fcmp ogt <2 x float> [[X:%.*]], zeroinitializer
801801
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz arcp <2 x float> [[X]]
802-
; CHECK-NEXT: [[FABS:%.*]] = select <2 x i1> [[GTZERO]], <2 x float> [[X]], <2 x float> [[NEGX]]
802+
; CHECK-NEXT: [[FABS:%.*]] = select nnan <2 x i1> [[GTZERO]], <2 x float> [[X]], <2 x float> [[NEGX]]
803803
; CHECK-NEXT: ret <2 x float> [[FABS]]
804804
;
805805
%gtzero = fcmp ogt <2 x float> %x, zeroinitializer
@@ -814,7 +814,7 @@ define <2 x float> @select_fcmp_nnan_nsz_ugt_zero_unary_fneg(<2 x float> %x) {
814814
; CHECK-LABEL: @select_fcmp_nnan_nsz_ugt_zero_unary_fneg(
815815
; CHECK-NEXT: [[GTZERO:%.*]] = fcmp ugt <2 x float> [[X:%.*]], zeroinitializer
816816
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz arcp <2 x float> [[X]]
817-
; CHECK-NEXT: [[FABS:%.*]] = select <2 x i1> [[GTZERO]], <2 x float> [[X]], <2 x float> [[NEGX]]
817+
; CHECK-NEXT: [[FABS:%.*]] = select nnan <2 x i1> [[GTZERO]], <2 x float> [[X]], <2 x float> [[NEGX]]
818818
; CHECK-NEXT: ret <2 x float> [[FABS]]
819819
;
820820
%gtzero = fcmp ugt <2 x float> %x, zeroinitializer
@@ -829,7 +829,7 @@ define half @select_fcmp_nnan_nsz_ogt_negzero(half %x) {
829829
; CHECK-LABEL: @select_fcmp_nnan_nsz_ogt_negzero(
830830
; CHECK-NEXT: [[GTZERO:%.*]] = fcmp ogt half [[X:%.*]], 0xH0000
831831
; CHECK-NEXT: [[NEGX:%.*]] = fneg fast half [[X]]
832-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[GTZERO]], half [[X]], half [[NEGX]]
832+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[GTZERO]], half [[X]], half [[NEGX]]
833833
; CHECK-NEXT: ret half [[FABS]]
834834
;
835835
%gtzero = fcmp ogt half %x, -0.0
@@ -844,7 +844,7 @@ define half @select_fcmp_nnan_nsz_ugt_negzero(half %x) {
844844
; CHECK-LABEL: @select_fcmp_nnan_nsz_ugt_negzero(
845845
; CHECK-NEXT: [[GTZERO:%.*]] = fcmp ugt half [[X:%.*]], 0xH0000
846846
; CHECK-NEXT: [[NEGX:%.*]] = fneg fast half [[X]]
847-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[GTZERO]], half [[X]], half [[NEGX]]
847+
; CHECK-NEXT: [[FABS:%.*]] = select nnan ninf i1 [[GTZERO]], half [[X]], half [[NEGX]]
848848
; CHECK-NEXT: ret half [[FABS]]
849849
;
850850
%gtzero = fcmp ugt half %x, -0.0
@@ -859,7 +859,7 @@ define <2 x double> @select_fcmp_nnan_nsz_oge_zero(<2 x double> %x) {
859859
; CHECK-LABEL: @select_fcmp_nnan_nsz_oge_zero(
860860
; CHECK-NEXT: [[GEZERO:%.*]] = fcmp oge <2 x double> [[X:%.*]], zeroinitializer
861861
; CHECK-NEXT: [[NEGX:%.*]] = fneg reassoc nnan nsz <2 x double> [[X]]
862-
; CHECK-NEXT: [[FABS:%.*]] = select <2 x i1> [[GEZERO]], <2 x double> [[X]], <2 x double> [[NEGX]]
862+
; CHECK-NEXT: [[FABS:%.*]] = select nnan <2 x i1> [[GEZERO]], <2 x double> [[X]], <2 x double> [[NEGX]]
863863
; CHECK-NEXT: ret <2 x double> [[FABS]]
864864
;
865865
%gezero = fcmp oge <2 x double> %x, zeroinitializer
@@ -874,7 +874,7 @@ define <2 x double> @select_fcmp_nnan_nsz_uge_zero(<2 x double> %x) {
874874
; CHECK-LABEL: @select_fcmp_nnan_nsz_uge_zero(
875875
; CHECK-NEXT: [[GEZERO:%.*]] = fcmp uge <2 x double> [[X:%.*]], zeroinitializer
876876
; CHECK-NEXT: [[NEGX:%.*]] = fneg reassoc nnan nsz <2 x double> [[X]]
877-
; CHECK-NEXT: [[FABS:%.*]] = select <2 x i1> [[GEZERO]], <2 x double> [[X]], <2 x double> [[NEGX]]
877+
; CHECK-NEXT: [[FABS:%.*]] = select nnan <2 x i1> [[GEZERO]], <2 x double> [[X]], <2 x double> [[NEGX]]
878878
; CHECK-NEXT: ret <2 x double> [[FABS]]
879879
;
880880
%gezero = fcmp uge <2 x double> %x, zeroinitializer
@@ -887,7 +887,7 @@ define <2 x double> @select_fcmp_nnan_nsz_oge_zero_unary_fneg(<2 x double> %x) {
887887
; CHECK-LABEL: @select_fcmp_nnan_nsz_oge_zero_unary_fneg(
888888
; CHECK-NEXT: [[GEZERO:%.*]] = fcmp oge <2 x double> [[X:%.*]], zeroinitializer
889889
; CHECK-NEXT: [[NEGX:%.*]] = fneg reassoc nnan nsz <2 x double> [[X]]
890-
; CHECK-NEXT: [[FABS:%.*]] = select <2 x i1> [[GEZERO]], <2 x double> [[X]], <2 x double> [[NEGX]]
890+
; CHECK-NEXT: [[FABS:%.*]] = select nnan <2 x i1> [[GEZERO]], <2 x double> [[X]], <2 x double> [[NEGX]]
891891
; CHECK-NEXT: ret <2 x double> [[FABS]]
892892
;
893893
%gezero = fcmp oge <2 x double> %x, zeroinitializer
@@ -902,7 +902,7 @@ define <2 x double> @select_fcmp_nnan_nsz_uge_zero_unary_fneg(<2 x double> %x) {
902902
; CHECK-LABEL: @select_fcmp_nnan_nsz_uge_zero_unary_fneg(
903903
; CHECK-NEXT: [[GEZERO:%.*]] = fcmp uge <2 x double> [[X:%.*]], zeroinitializer
904904
; CHECK-NEXT: [[NEGX:%.*]] = fneg reassoc nnan nsz <2 x double> [[X]]
905-
; CHECK-NEXT: [[FABS:%.*]] = select <2 x i1> [[GEZERO]], <2 x double> [[X]], <2 x double> [[NEGX]]
905+
; CHECK-NEXT: [[FABS:%.*]] = select nnan <2 x i1> [[GEZERO]], <2 x double> [[X]], <2 x double> [[NEGX]]
906906
; CHECK-NEXT: ret <2 x double> [[FABS]]
907907
;
908908
%gezero = fcmp uge <2 x double> %x, zeroinitializer
@@ -917,7 +917,7 @@ define half @select_fcmp_nnan_nsz_oge_negzero(half %x) {
917917
; CHECK-LABEL: @select_fcmp_nnan_nsz_oge_negzero(
918918
; CHECK-NEXT: [[GEZERO:%.*]] = fcmp oge half [[X:%.*]], 0xH0000
919919
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz half [[X]]
920-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[GEZERO]], half [[X]], half [[NEGX]]
920+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[GEZERO]], half [[X]], half [[NEGX]]
921921
; CHECK-NEXT: ret half [[FABS]]
922922
;
923923
%gezero = fcmp oge half %x, -0.0
@@ -932,7 +932,7 @@ define half @select_fcmp_nnan_nsz_uge_negzero(half %x) {
932932
; CHECK-LABEL: @select_fcmp_nnan_nsz_uge_negzero(
933933
; CHECK-NEXT: [[GEZERO:%.*]] = fcmp uge half [[X:%.*]], 0xH0000
934934
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz half [[X]]
935-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[GEZERO]], half [[X]], half [[NEGX]]
935+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[GEZERO]], half [[X]], half [[NEGX]]
936936
; CHECK-NEXT: ret half [[FABS]]
937937
;
938938
%gezero = fcmp uge half %x, -0.0
@@ -945,7 +945,7 @@ define half @select_fcmp_nnan_nsz_oge_negzero_unary_fneg(half %x) {
945945
; CHECK-LABEL: @select_fcmp_nnan_nsz_oge_negzero_unary_fneg(
946946
; CHECK-NEXT: [[GEZERO:%.*]] = fcmp oge half [[X:%.*]], 0xH0000
947947
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz half [[X]]
948-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[GEZERO]], half [[X]], half [[NEGX]]
948+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[GEZERO]], half [[X]], half [[NEGX]]
949949
; CHECK-NEXT: ret half [[FABS]]
950950
;
951951
%gezero = fcmp oge half %x, -0.0
@@ -960,7 +960,7 @@ define half @select_fcmp_nnan_nsz_uge_negzero_unary_fneg(half %x) {
960960
; CHECK-LABEL: @select_fcmp_nnan_nsz_uge_negzero_unary_fneg(
961961
; CHECK-NEXT: [[GEZERO:%.*]] = fcmp uge half [[X:%.*]], 0xH0000
962962
; CHECK-NEXT: [[NEGX:%.*]] = fneg nnan nsz half [[X]]
963-
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[GEZERO]], half [[X]], half [[NEGX]]
963+
; CHECK-NEXT: [[FABS:%.*]] = select nnan i1 [[GEZERO]], half [[X]], half [[NEGX]]
964964
; CHECK-NEXT: ret half [[FABS]]
965965
;
966966
%gezero = fcmp uge half %x, -0.0

llvm/test/Transforms/InstCombine/fneg-fabs.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ define double @select_noFMF_nfabs_lt(double %x) {
2020
; One test where the neg has fmfs.
2121
define double @select_nsz_nfabs_lt_fmfProp(double %x) {
2222
; CHECK-LABEL: @select_nsz_nfabs_lt_fmfProp(
23-
; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
24-
; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
23+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]])
24+
; CHECK-NEXT: [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]]
2525
; CHECK-NEXT: ret double [[SEL]]
2626
;
2727
%cmp = fcmp olt double %x, 0.000000e+00
@@ -32,8 +32,8 @@ define double @select_nsz_nfabs_lt_fmfProp(double %x) {
3232

3333
define double @select_nsz_nnan_nfabs_lt_fmfProp(double %x) {
3434
; CHECK-LABEL: @select_nsz_nnan_nfabs_lt_fmfProp(
35-
; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
36-
; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
35+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]])
36+
; CHECK-NEXT: [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]]
3737
; CHECK-NEXT: ret double [[SEL]]
3838
;
3939
%cmp = fcmp olt double %x, 0.000000e+00
@@ -135,8 +135,8 @@ define double @select_noFMF_nfabs_gt(double %x) {
135135
; One test where the neg has fmfs.
136136
define double @select_nsz_nfabs_gt_fmfProp(double %x) {
137137
; CHECK-LABEL: @select_nsz_nfabs_gt_fmfProp(
138-
; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
139-
; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
138+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]])
139+
; CHECK-NEXT: [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]]
140140
; CHECK-NEXT: ret double [[SEL]]
141141
;
142142
%cmp = fcmp ogt double %x, 0.000000e+00
@@ -147,8 +147,8 @@ define double @select_nsz_nfabs_gt_fmfProp(double %x) {
147147

148148
define double @select_nsz_nnan_nfabs_gt_fmfProp(double %x) {
149149
; CHECK-LABEL: @select_nsz_nnan_nfabs_gt_fmfProp(
150-
; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
151-
; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
150+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]])
151+
; CHECK-NEXT: [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]]
152152
; CHECK-NEXT: ret double [[SEL]]
153153
;
154154
%cmp = fcmp ogt double %x, 0.000000e+00

0 commit comments

Comments
 (0)