@@ -678,12 +678,11 @@ define nofpclass(inf) float @ret_nofpclass_inf__copysign_negative_select_pinf_rh
678
678
ret float %copysign
679
679
}
680
680
681
- ; can fold to fneg(fabs(x))
681
+ ; can't fold to fneg(fabs(x))
682
682
define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_nopositives_copysign (float %x , float %unknown.sign ) {
683
683
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_nofpclass_nopositives_copysign
684
684
; CHECK-SAME: (float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
685
- ; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
686
- ; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg float [[TMP1]]
685
+ ; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.copysign.f32(float [[X]], float [[UNKNOWN_SIGN]])
687
686
; CHECK-NEXT: ret float [[COPYSIGN]]
688
687
;
689
688
%copysign = call float @llvm.copysign.f32 (float %x , float %unknown.sign )
@@ -703,6 +702,18 @@ define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_nopositives_copysig
703
702
}
704
703
705
704
; can fold to fneg(fabs(x))
705
+ define nofpclass(pnorm psub pzero) float @ret_nofpclass_nopositive_finites_copysign_nnan_ninf_flag (float %x , float %unknown.sign ) {
706
+ ; CHECK-LABEL: define nofpclass(pzero psub pnorm) float @ret_nofpclass_nopositive_finites_copysign_nnan_ninf_flag
707
+ ; CHECK-SAME: (float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
708
+ ; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf float @llvm.fabs.f32(float [[X]])
709
+ ; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg nnan ninf float [[TMP1]]
710
+ ; CHECK-NEXT: ret float [[COPYSIGN]]
711
+ ;
712
+ %copysign = call nnan ninf float @llvm.copysign.f32 (float %x , float %unknown.sign )
713
+ ret float %copysign
714
+ }
715
+
716
+ ; can't fold to fneg(fabs(x))
706
717
define nofpclass(nan pinf pnorm psub pzero) float @ret_nofpclass_nopositives_nonan_copysign (float %x , float %unknown.sign ) {
707
718
; CHECK-LABEL: define nofpclass(nan pinf pzero psub pnorm) float @ret_nofpclass_nopositives_nonan_copysign
708
719
; CHECK-SAME: (float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
@@ -714,11 +725,11 @@ define nofpclass(nan pinf pnorm psub pzero) float @ret_nofpclass_nopositives_non
714
725
ret float %copysign
715
726
}
716
727
717
- ; can fold to fabs(x)
728
+ ; can't fold to fabs(x)
718
729
define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_nonegatives_copysign (float %x , float %unknown.sign ) {
719
730
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_nofpclass_nonegatives_copysign
720
731
; CHECK-SAME: (float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
721
- ; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.fabs .f32(float [[X]])
732
+ ; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.copysign .f32(float [[X]], float [[UNKNOWN_SIGN ]])
722
733
; CHECK-NEXT: ret float [[COPYSIGN]]
723
734
;
724
735
%copysign = call float @llvm.copysign.f32 (float %x , float %unknown.sign )
@@ -763,7 +774,7 @@ define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_nopositives__copysi
763
774
define nofpclass(inf nnorm nsub nzero) float @ret_nofpclass_no_negatives_noinf__copysign_unknown_select_pinf_rhs (i1 %cond , float %x , float %unknown.sign ) {
764
775
; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_nofpclass_no_negatives_noinf__copysign_unknown_select_pinf_rhs
765
776
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
766
- ; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.fabs .f32(float [[X]])
777
+ ; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.copysign .f32(float [[X]], float [[UNKNOWN_SIGN ]])
767
778
; CHECK-NEXT: ret float [[COPYSIGN]]
768
779
;
769
780
%select = select i1 %cond , float %x , float 0x7FF0000000000000
@@ -775,8 +786,7 @@ define nofpclass(inf nnorm nsub nzero) float @ret_nofpclass_no_negatives_noinf__
775
786
define nofpclass(inf pnorm psub pzero) float @ret_nofpclass_no_positives_noinf__copysign_unknown_select_pinf_rhs (i1 %cond , float %x , float %unknown.sign ) {
776
787
; CHECK-LABEL: define nofpclass(inf pzero psub pnorm) float @ret_nofpclass_no_positives_noinf__copysign_unknown_select_pinf_rhs
777
788
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
778
- ; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
779
- ; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg float [[TMP1]]
789
+ ; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.copysign.f32(float [[X]], float [[UNKNOWN_SIGN]])
780
790
; CHECK-NEXT: ret float [[COPYSIGN]]
781
791
;
782
792
%select = select i1 %cond , float %x , float 0x7FF0000000000000
@@ -788,8 +798,8 @@ define nofpclass(inf pnorm psub pzero) float @ret_nofpclass_no_positives_noinf__
788
798
define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives__copysign_unknown_select_pinf_rhs (i1 %cond , float %x , float %unknown.sign ) {
789
799
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_nofpclass_no_negatives__copysign_unknown_select_pinf_rhs
790
800
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
791
- ; CHECK-NEXT: [[TMP1 :%.*]] = call float @llvm.fabs.f32( float [[X]])
792
- ; CHECK-NEXT: [[COPYSIGN:%.*]] = select i1 [[COND ]], float [[TMP1]], float 0x7FF0000000000000
801
+ ; CHECK-NEXT: [[SELECT :%.*]] = select i1 [[COND]], float [[X]], float 0x7FF0000000000000
802
+ ; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.copysign.f32(float [[SELECT ]], float [[UNKNOWN_SIGN]])
793
803
; CHECK-NEXT: ret float [[COPYSIGN]]
794
804
;
795
805
%select = select i1 %cond , float %x , float 0x7FF0000000000000
@@ -801,9 +811,8 @@ define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives__copys
801
811
define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_no_positives__copysign_unknown_select_pinf_rhs (i1 %cond , float %x , float %unknown.sign ) {
802
812
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_nofpclass_no_positives__copysign_unknown_select_pinf_rhs
803
813
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
804
- ; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
805
- ; CHECK-NEXT: [[DOTNEG:%.*]] = fneg float [[TMP1]]
806
- ; CHECK-NEXT: [[COPYSIGN:%.*]] = select i1 [[COND]], float [[DOTNEG]], float 0xFFF0000000000000
814
+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 0x7FF0000000000000
815
+ ; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.copysign.f32(float [[SELECT]], float [[UNKNOWN_SIGN]])
807
816
; CHECK-NEXT: ret float [[COPYSIGN]]
808
817
;
809
818
%select = select i1 %cond , float %x , float 0x7FF0000000000000
0 commit comments