Skip to content

Commit cbb0477

Browse files
authored
[InstCombine] Fold fneg over select (#89947)
As we folds fabs over select in #86390, this patch folds fneg over select to make sure nabs idioms are generated. Addresses #86390 (comment). Alive2 for FMF propagation: https://alive2.llvm.org/ce/z/-h6Vuo
1 parent d285e54 commit cbb0477

File tree

3 files changed

+164
-33
lines changed

3 files changed

+164
-33
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2781,6 +2781,16 @@ Instruction *InstCombinerImpl::visitFNeg(UnaryOperator &I) {
27812781
propagateSelectFMF(NewSel, P == X);
27822782
return NewSel;
27832783
}
2784+
2785+
// -(Cond ? X : C) --> Cond ? -X : -C
2786+
// -(Cond ? C : Y) --> Cond ? -C : -Y
2787+
if (match(X, m_ImmConstant()) || match(Y, m_ImmConstant())) {
2788+
Value *NegX = Builder.CreateFNegFMF(X, &I, X->getName() + ".neg");
2789+
Value *NegY = Builder.CreateFNegFMF(Y, &I, Y->getName() + ".neg");
2790+
SelectInst *NewSel = SelectInst::Create(Cond, NegX, NegY);
2791+
propagateSelectFMF(NewSel, /*CommonOperand=*/true);
2792+
return NewSel;
2793+
}
27842794
}
27852795

27862796
// fneg (copysign x, y) -> copysign x, (fneg y)

llvm/test/Transforms/InstCombine/fneg.ll

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -980,12 +980,133 @@ define float @fneg_ldexp_contract(float %x, i32 %n) {
980980
define float @fneg_ldexp_metadata(float %x, i32 %n) {
981981
; CHECK-LABEL: @fneg_ldexp_metadata(
982982
; CHECK-NEXT: [[TMP1:%.*]] = fneg float [[X:%.*]]
983-
; CHECK-NEXT: [[NEG:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[N:%.*]]), !arst !0
983+
; CHECK-NEXT: [[NEG:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[N:%.*]]), !arst [[META0:![0-9]+]]
984984
; CHECK-NEXT: ret float [[NEG]]
985985
;
986986
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %n), !arst !0
987987
%neg = fneg float %ldexp
988988
ret float %neg
989989
}
990990

991+
define float @test_fneg_select_constants(i1 %cond) {
992+
; CHECK-LABEL: @test_fneg_select_constants(
993+
; CHECK-NEXT: [[NEG:%.*]] = select i1 [[COND:%.*]], float -0.000000e+00, float 0.000000e+00
994+
; CHECK-NEXT: ret float [[NEG]]
995+
;
996+
%sel1 = select i1 %cond, float 0.0, float -0.0
997+
%neg = fneg float %sel1
998+
ret float %neg
999+
}
1000+
1001+
define <2 x float> @test_fneg_vec(<2 x i1> %cond) {
1002+
; CHECK-LABEL: @test_fneg_vec(
1003+
; CHECK-NEXT: [[NEG:%.*]] = select <2 x i1> [[COND:%.*]], <2 x float> <float -0.000000e+00, float 0.000000e+00>, <2 x float> <float 0.000000e+00, float -0.000000e+00>
1004+
; CHECK-NEXT: ret <2 x float> [[NEG]]
1005+
;
1006+
%sel1 = select <2 x i1> %cond, <2 x float> <float 0.0, float -0.0>, <2 x float> <float -0.0, float 0.0>
1007+
%neg = fneg <2 x float> %sel1
1008+
ret <2 x float> %neg
1009+
}
1010+
1011+
define float @test_fneg_select_var_constant(i1 %cond, float %x) {
1012+
; CHECK-LABEL: @test_fneg_select_var_constant(
1013+
; CHECK-NEXT: [[X_NEG:%.*]] = fneg float [[X:%.*]]
1014+
; CHECK-NEXT: [[NEG:%.*]] = select i1 [[COND:%.*]], float [[X_NEG]], float 0.000000e+00
1015+
; CHECK-NEXT: ret float [[NEG]]
1016+
;
1017+
%sel1 = select i1 %cond, float %x, float -0.0
1018+
%neg = fneg float %sel1
1019+
ret float %neg
1020+
}
1021+
1022+
; nsz can be preserved.
1023+
1024+
define float @test_fneg_select_var_constant_fmf1(i1 %cond, float %x) {
1025+
; CHECK-LABEL: @test_fneg_select_var_constant_fmf1(
1026+
; CHECK-NEXT: [[X_NEG:%.*]] = fneg float [[X:%.*]]
1027+
; CHECK-NEXT: [[NEG:%.*]] = select nnan ninf nsz i1 [[COND:%.*]], float [[X_NEG]], float -1.000000e+00
1028+
; CHECK-NEXT: ret float [[NEG]]
1029+
;
1030+
%sel1 = select nnan ninf nsz i1 %cond, float %x, float 1.0
1031+
%neg = fneg float %sel1
1032+
ret float %neg
1033+
}
1034+
1035+
define float @test_fneg_select_var_constant_fmf2(i1 %cond, float %x) {
1036+
; CHECK-LABEL: @test_fneg_select_var_constant_fmf2(
1037+
; CHECK-NEXT: [[X_NEG:%.*]] = fneg nnan ninf nsz float [[X:%.*]]
1038+
; CHECK-NEXT: [[NEG:%.*]] = select nnan ninf nsz i1 [[COND:%.*]], float [[X_NEG]], float -1.000000e+00
1039+
; CHECK-NEXT: ret float [[NEG]]
1040+
;
1041+
%sel1 = select i1 %cond, float %x, float 1.0
1042+
%neg = fneg nnan ninf nsz float %sel1
1043+
ret float %neg
1044+
}
1045+
1046+
define float @test_fneg_select_constant_var(i1 %cond, float %x) {
1047+
; CHECK-LABEL: @test_fneg_select_constant_var(
1048+
; CHECK-NEXT: [[X_NEG:%.*]] = fneg float [[X:%.*]]
1049+
; CHECK-NEXT: [[NEG:%.*]] = select i1 [[COND:%.*]], float -0.000000e+00, float [[X_NEG]]
1050+
; CHECK-NEXT: ret float [[NEG]]
1051+
;
1052+
%sel1 = select i1 %cond, float 0.0, float %x
1053+
%neg = fneg float %sel1
1054+
ret float %neg
1055+
}
1056+
1057+
; Make sure nabs is generated.
1058+
1059+
define float @test_fneg_select_abs(i1 %cond, float %x) {
1060+
; CHECK-LABEL: @test_fneg_select_abs(
1061+
; CHECK-NEXT: [[ABSX:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]])
1062+
; CHECK-NEXT: [[ABSX_NEG:%.*]] = fneg float [[ABSX]]
1063+
; CHECK-NEXT: [[NEG:%.*]] = select i1 [[COND:%.*]], float -0.000000e+00, float [[ABSX_NEG]]
1064+
; CHECK-NEXT: ret float [[NEG]]
1065+
;
1066+
%absx = call float @llvm.fabs.f32(float %x)
1067+
%sel1 = select i1 %cond, float 0.0, float %absx
1068+
%neg = fneg float %sel1
1069+
ret float %neg
1070+
}
1071+
1072+
define float @test_fneg_fabs_select(i1 %cond, float %x) {
1073+
; CHECK-LABEL: @test_fneg_fabs_select(
1074+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]])
1075+
; CHECK-NEXT: [[DOTNEG:%.*]] = fneg float [[TMP1]]
1076+
; CHECK-NEXT: [[NEG:%.*]] = select i1 [[COND:%.*]], float -0.000000e+00, float [[DOTNEG]]
1077+
; CHECK-NEXT: ret float [[NEG]]
1078+
;
1079+
%sel1 = select i1 %cond, float 0.0, float %x
1080+
%abs = call float @llvm.fabs.f32(float %sel1)
1081+
%neg = fneg float %abs
1082+
ret float %neg
1083+
}
1084+
1085+
define float @test_fneg_select_constant_var_multiuse(i1 %cond, float %x) {
1086+
; CHECK-LABEL: @test_fneg_select_constant_var_multiuse(
1087+
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[COND:%.*]], float 0.000000e+00, float [[X:%.*]]
1088+
; CHECK-NEXT: call void @use(float [[SEL1]])
1089+
; CHECK-NEXT: [[NEG:%.*]] = fneg float [[SEL1]]
1090+
; CHECK-NEXT: ret float [[NEG]]
1091+
;
1092+
%sel1 = select i1 %cond, float 0.0, float %x
1093+
call void @use(float %sel1)
1094+
%neg = fneg float %sel1
1095+
ret float %neg
1096+
}
1097+
1098+
; Don't break fmax idioms.
1099+
1100+
define float @test_fneg_select_maxnum(float %x) {
1101+
; CHECK-LABEL: @test_fneg_select_maxnum(
1102+
; CHECK-NEXT: [[SEL1:%.*]] = call nnan nsz float @llvm.maxnum.f32(float [[X:%.*]], float 1.000000e+00)
1103+
; CHECK-NEXT: [[NEG:%.*]] = fneg float [[SEL1]]
1104+
; CHECK-NEXT: ret float [[NEG]]
1105+
;
1106+
%cmp1 = fcmp ogt float %x, 1.0
1107+
%sel1 = select nnan nsz i1 %cmp1, float %x, float 1.0
1108+
%neg = fneg float %sel1
1109+
ret float %neg
1110+
}
1111+
9911112
!0 = !{}

llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,8 @@ define nofpclass(inf) float @ret_nofpclass_inf__select_chain_inf_nan_1(i1 %cond,
364364
define nofpclass(inf) float @ret_nofpclass_inf__fabs_select_ninf_rhs(i1 %cond, float %x) {
365365
; CHECK-LABEL: define nofpclass(inf) float @ret_nofpclass_inf__fabs_select_ninf_rhs
366366
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
367-
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[X]])
368-
; CHECK-NEXT: ret float [[FABS]]
367+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
368+
; CHECK-NEXT: ret float [[TMP1]]
369369
;
370370
%select = select i1 %cond, float %x, float 0xFFF0000000000000
371371
%fabs = call float @llvm.fabs.f32(float %select)
@@ -376,8 +376,8 @@ define nofpclass(inf) float @ret_nofpclass_inf__fabs_select_ninf_rhs(i1 %cond, f
376376
define nofpclass(inf) float @ret_nofpclass_inf__fabs_select_pinf_rhs(i1 %cond, float %x) {
377377
; CHECK-LABEL: define nofpclass(inf) float @ret_nofpclass_inf__fabs_select_pinf_rhs
378378
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
379-
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[X]])
380-
; CHECK-NEXT: ret float [[FABS]]
379+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
380+
; CHECK-NEXT: ret float [[TMP1]]
381381
;
382382
%select = select i1 %cond, float %x, float 0x7FF0000000000000
383383
%fabs = call float @llvm.fabs.f32(float %select)
@@ -400,8 +400,8 @@ define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives__fabs_
400400
define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_no_positives__fabs_select_pinf_rhs(i1 %cond, float %x) {
401401
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_nofpclass_no_positives__fabs_select_pinf_rhs
402402
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
403-
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[X]])
404-
; CHECK-NEXT: ret float [[FABS]]
403+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
404+
; CHECK-NEXT: ret float [[TMP1]]
405405
;
406406
%select = select i1 %cond, float %x, float 0x7FF0000000000000
407407
%fabs = call float @llvm.fabs.f32(float %select)
@@ -435,8 +435,8 @@ define nofpclass(nan pinf pnorm psub pzero) float @ret_nofpclass_no_positives_na
435435
define nofpclass(inf) float @ret_nofpclass_inf__fneg_select_ninf_rhs(i1 %cond, float %x) {
436436
; CHECK-LABEL: define nofpclass(inf) float @ret_nofpclass_inf__fneg_select_ninf_rhs
437437
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
438-
; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]]
439-
; CHECK-NEXT: ret float [[FNEG]]
438+
; CHECK-NEXT: [[X_NEG:%.*]] = fneg float [[X]]
439+
; CHECK-NEXT: ret float [[X_NEG]]
440440
;
441441
%select = select i1 %cond, float %x, float 0xFFF0000000000000
442442
%fneg = fneg float %select
@@ -447,8 +447,8 @@ define nofpclass(inf) float @ret_nofpclass_inf__fneg_select_ninf_rhs(i1 %cond, f
447447
define nofpclass(inf nnorm nsub nzero) float @ret_nofpclass_nonegatives_noinf___fneg_select_pinf_rhs(i1 %cond, float %x) {
448448
; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_nofpclass_nonegatives_noinf___fneg_select_pinf_rhs
449449
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
450-
; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]]
451-
; CHECK-NEXT: ret float [[FNEG]]
450+
; CHECK-NEXT: [[X_NEG:%.*]] = fneg float [[X]]
451+
; CHECK-NEXT: ret float [[X_NEG]]
452452
;
453453
%select = select i1 %cond, float %x, float 0x7FF0000000000000
454454
%fneg = fneg float %select
@@ -459,8 +459,8 @@ define nofpclass(inf nnorm nsub nzero) float @ret_nofpclass_nonegatives_noinf___
459459
define nofpclass(inf nnorm nsub nzero) float @ret_nofpclass_nonegatives_noinf___fneg_select_ninf_lhs(i1 %cond, float %x) {
460460
; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_nofpclass_nonegatives_noinf___fneg_select_ninf_lhs
461461
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
462-
; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]]
463-
; CHECK-NEXT: ret float [[FNEG]]
462+
; CHECK-NEXT: [[X_NEG:%.*]] = fneg float [[X]]
463+
; CHECK-NEXT: ret float [[X_NEG]]
464464
;
465465
%select = select i1 %cond, float 0xFFF0000000000000, float %x
466466
%fneg = fneg float %select
@@ -470,8 +470,8 @@ define nofpclass(inf nnorm nsub nzero) float @ret_nofpclass_nonegatives_noinf___
470470
define nofpclass(pzero psub pnorm pinf) float @ret_nofpclass_nopositives___fneg_select_pinf_rhs(i1 %cond, float %x) {
471471
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_nofpclass_nopositives___fneg_select_pinf_rhs
472472
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
473-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 0x7FF0000000000000
474-
; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[SELECT]]
473+
; CHECK-NEXT: [[X_NEG:%.*]] = fneg float [[X]]
474+
; CHECK-NEXT: [[FNEG:%.*]] = select i1 [[COND]], float [[X_NEG]], float 0xFFF0000000000000
475475
; CHECK-NEXT: ret float [[FNEG]]
476476
;
477477
%select = select i1 %cond, float %x, float 0x7FF0000000000000
@@ -483,9 +483,9 @@ define nofpclass(pzero psub pnorm pinf) float @ret_nofpclass_nopositives___fneg_
483483
define nofpclass(inf) float @ret_nofpclass_inf__fneg_fabs_select_pinf_rhs(i1 %cond, float %x) {
484484
; CHECK-LABEL: define nofpclass(inf) float @ret_nofpclass_inf__fneg_fabs_select_pinf_rhs
485485
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
486-
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[X]])
487-
; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[FABS]]
488-
; CHECK-NEXT: ret float [[FNEG]]
486+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
487+
; CHECK-NEXT: [[DOTNEG:%.*]] = fneg float [[TMP1]]
488+
; CHECK-NEXT: ret float [[DOTNEG]]
489489
;
490490
%select = select i1 %cond, float %x, float 0x7FF0000000000000
491491
%fabs = call float @llvm.fabs.f32(float %select)
@@ -497,9 +497,9 @@ define nofpclass(inf) float @ret_nofpclass_inf__fneg_fabs_select_pinf_rhs(i1 %co
497497
define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_nonegatives__fneg_fabs_select_pinf_rhs(i1 %cond, float %x) {
498498
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_nofpclass_nonegatives__fneg_fabs_select_pinf_rhs
499499
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
500-
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[X]])
501-
; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[FABS]]
502-
; CHECK-NEXT: ret float [[FNEG]]
500+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
501+
; CHECK-NEXT: [[DOTNEG:%.*]] = fneg float [[TMP1]]
502+
; CHECK-NEXT: ret float [[DOTNEG]]
503503
;
504504
%select = select i1 %cond, float %x, float 0x7FF0000000000000
505505
%fabs = call float @llvm.fabs.f32(float %select)
@@ -535,8 +535,8 @@ define nofpclass(inf) float @ret_nofpclass_inf__copysign_unknown_select_pinf_rhs
535535
define nofpclass(inf) float @ret_nofpclass_inf__copysign_positive_select_pinf_rhs(i1 %cond, float %x) {
536536
; CHECK-LABEL: define nofpclass(inf) float @ret_nofpclass_inf__copysign_positive_select_pinf_rhs
537537
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
538-
; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.fabs.f32(float [[X]])
539-
; CHECK-NEXT: ret float [[COPYSIGN]]
538+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
539+
; CHECK-NEXT: ret float [[TMP1]]
540540
;
541541
%select = select i1 %cond, float %x, float 0x7FF0000000000000
542542
%copysign = call float @llvm.copysign.f32(float %select, float 1.0)
@@ -547,8 +547,8 @@ define nofpclass(inf) float @ret_nofpclass_inf__copysign_negative_select_pinf_rh
547547
; CHECK-LABEL: define nofpclass(inf) float @ret_nofpclass_inf__copysign_negative_select_pinf_rhs
548548
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
549549
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
550-
; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg float [[TMP1]]
551-
; CHECK-NEXT: ret float [[COPYSIGN]]
550+
; CHECK-NEXT: [[DOTNEG:%.*]] = fneg float [[TMP1]]
551+
; CHECK-NEXT: ret float [[DOTNEG]]
552552
;
553553
%select = select i1 %cond, float %x, float 0x7FF0000000000000
554554
%copysign = call float @llvm.copysign.f32(float %select, float -1.0)
@@ -627,8 +627,8 @@ define nofpclass(nan ninf nnorm nsub nzero) float @ret_nofpclass_nonegatives_non
627627
define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_nopositives__copysign_fabs_select_pinf_rhs(i1 %cond, float %x, float %sign) {
628628
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_nofpclass_nopositives__copysign_fabs_select_pinf_rhs
629629
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[SIGN:%.*]]) {
630-
; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.fabs.f32(float [[X]])
631-
; CHECK-NEXT: ret float [[COPYSIGN]]
630+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
631+
; CHECK-NEXT: ret float [[TMP1]]
632632
;
633633
%select = select i1 %cond, float %x, float 0x7FF0000000000000
634634
%fabs.sign = call float @llvm.fabs.f32(float %sign)
@@ -678,9 +678,9 @@ define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives__copys
678678
define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_no_positives__copysign_unknown_select_pinf_rhs(i1 %cond, float %x, float %unknown.sign) {
679679
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_nofpclass_no_positives__copysign_unknown_select_pinf_rhs
680680
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
681-
; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.fabs.f32(float [[X]])
682-
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[COND]], float [[TMP2]], float 0x7FF0000000000000
683-
; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg float [[TMP1]]
681+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
682+
; CHECK-NEXT: [[DOTNEG:%.*]] = fneg float [[TMP1]]
683+
; CHECK-NEXT: [[COPYSIGN:%.*]] = select i1 [[COND]], float [[DOTNEG]], float 0xFFF0000000000000
684684
; CHECK-NEXT: ret float [[COPYSIGN]]
685685
;
686686
%select = select i1 %cond, float %x, float 0x7FF0000000000000
@@ -705,9 +705,9 @@ define nofpclass(nan ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives_no
705705
define nofpclass(nan pinf pnorm psub pzero) float @ret_nofpclass_no_positives_nonan__copysign_unknown_select_pinf_rhs(i1 %cond, float %x, float %unknown.sign) {
706706
; CHECK-LABEL: define nofpclass(nan pinf pzero psub pnorm) float @ret_nofpclass_no_positives_nonan__copysign_unknown_select_pinf_rhs
707707
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
708-
; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.fabs.f32(float [[X]])
709-
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[COND]], float [[TMP2]], float 0x7FF0000000000000
710-
; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg float [[TMP1]]
708+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
709+
; CHECK-NEXT: [[DOTNEG:%.*]] = fneg float [[TMP1]]
710+
; CHECK-NEXT: [[COPYSIGN:%.*]] = select i1 [[COND]], float [[DOTNEG]], float 0xFFF0000000000000
711711
; CHECK-NEXT: ret float [[COPYSIGN]]
712712
;
713713
%select = select i1 %cond, float %x, float 0x7FF0000000000000

0 commit comments

Comments
 (0)