@@ -679,10 +679,9 @@ define float @test_pown_afn_nnan_ninf_f32(float %x, i32 %y) {
679
679
; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[Y]], 31
680
680
; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[X]] to i32
681
681
; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP0]]
682
- ; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[__EXP2]] to i32
683
- ; CHECK-NEXT: [[TMP2:%.*]] = or disjoint i32 [[__POW_SIGN]], [[TMP1]]
684
- ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[TMP2]] to float
685
- ; CHECK-NEXT: ret float [[TMP3]]
682
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32 [[__POW_SIGN]] to float
683
+ ; CHECK-NEXT: [[__POW_SIGN1:%.*]] = call nnan ninf afn float @llvm.copysign.f32(float [[__EXP2]], float [[TMP1]])
684
+ ; CHECK-NEXT: ret float [[__POW_SIGN1]]
686
685
;
687
686
entry:
688
687
%call = tail call nnan ninf afn float @_Z4pownfi (float %x , i32 %y )
@@ -701,10 +700,9 @@ define <2 x float> @test_pown_afn_nnan_ninf_v2f32(<2 x float> %x, <2 x i32> %y)
701
700
; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i32> [[Y]], <i32 31, i32 31>
702
701
; CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x float> [[X]] to <2 x i32>
703
702
; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i32> [[__YEVEN]], [[TMP0]]
704
- ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x float> [[__EXP2]] to <2 x i32>
705
- ; CHECK-NEXT: [[TMP2:%.*]] = or disjoint <2 x i32> [[__POW_SIGN]], [[TMP1]]
706
- ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i32> [[TMP2]] to <2 x float>
707
- ; CHECK-NEXT: ret <2 x float> [[TMP3]]
703
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[__POW_SIGN]] to <2 x float>
704
+ ; CHECK-NEXT: [[__POW_SIGN1:%.*]] = call nnan ninf afn <2 x float> @llvm.copysign.v2f32(<2 x float> [[__EXP2]], <2 x float> [[TMP1]])
705
+ ; CHECK-NEXT: ret <2 x float> [[__POW_SIGN1]]
708
706
;
709
707
entry:
710
708
%call = tail call nnan ninf afn <2 x float > @_Z4pownDv2_fDv2_i (<2 x float > %x , <2 x i32 > %y )
@@ -724,10 +722,9 @@ define double @test_pown_afn_nnan_ninf_f64(double %x, i32 %y) {
724
722
; CHECK-NEXT: [[__YEVEN:%.*]] = shl i64 [[__YTOU]], 63
725
723
; CHECK-NEXT: [[TMP0:%.*]] = bitcast double [[X]] to i64
726
724
; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i64 [[__YEVEN]], [[TMP0]]
727
- ; CHECK-NEXT: [[TMP1:%.*]] = bitcast double [[__EXP2]] to i64
728
- ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[__POW_SIGN]], [[TMP1]]
729
- ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i64 [[TMP2]] to double
730
- ; CHECK-NEXT: ret double [[TMP3]]
725
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i64 [[__POW_SIGN]] to double
726
+ ; CHECK-NEXT: [[__POW_SIGN1:%.*]] = call nnan ninf afn double @llvm.copysign.f64(double [[__EXP2]], double [[TMP1]])
727
+ ; CHECK-NEXT: ret double [[__POW_SIGN1]]
731
728
;
732
729
entry:
733
730
%call = tail call nnan ninf afn double @_Z4powndi (double %x , i32 %y )
@@ -747,10 +744,9 @@ define <2 x double> @test_pown_afn_nnan_ninf_v2f64(<2 x double> %x, <2 x i32> %y
747
744
; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i64> [[__YTOU]], <i64 63, i64 63>
748
745
; CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x double> [[X]] to <2 x i64>
749
746
; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i64> [[__YEVEN]], [[TMP0]]
750
- ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x double> [[__EXP2]] to <2 x i64>
751
- ; CHECK-NEXT: [[TMP2:%.*]] = or <2 x i64> [[__POW_SIGN]], [[TMP1]]
752
- ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i64> [[TMP2]] to <2 x double>
753
- ; CHECK-NEXT: ret <2 x double> [[TMP3]]
747
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[__POW_SIGN]] to <2 x double>
748
+ ; CHECK-NEXT: [[__POW_SIGN1:%.*]] = call nnan ninf afn <2 x double> @llvm.copysign.v2f64(<2 x double> [[__EXP2]], <2 x double> [[TMP1]])
749
+ ; CHECK-NEXT: ret <2 x double> [[__POW_SIGN1]]
754
750
;
755
751
entry:
756
752
%call = tail call nnan ninf afn <2 x double > @_Z4pownDv2_dDv2_i (<2 x double > %x , <2 x i32 > %y )
@@ -770,10 +766,9 @@ define half @test_pown_afn_nnan_ninf_f16(half %x, i32 %y) {
770
766
; CHECK-NEXT: [[__YEVEN:%.*]] = shl i16 [[__YTOU]], 15
771
767
; CHECK-NEXT: [[TMP0:%.*]] = bitcast half [[X]] to i16
772
768
; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i16 [[__YEVEN]], [[TMP0]]
773
- ; CHECK-NEXT: [[TMP1:%.*]] = bitcast half [[__EXP2]] to i16
774
- ; CHECK-NEXT: [[TMP2:%.*]] = or disjoint i16 [[__POW_SIGN]], [[TMP1]]
775
- ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i16 [[TMP2]] to half
776
- ; CHECK-NEXT: ret half [[TMP3]]
769
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i16 [[__POW_SIGN]] to half
770
+ ; CHECK-NEXT: [[__POW_SIGN1:%.*]] = call nnan ninf afn half @llvm.copysign.f16(half [[__EXP2]], half [[TMP1]])
771
+ ; CHECK-NEXT: ret half [[__POW_SIGN1]]
777
772
;
778
773
entry:
779
774
%call = tail call nnan ninf afn half @_Z4pownDhi (half %x , i32 %y )
@@ -793,10 +788,9 @@ define <2 x half> @test_pown_afn_nnan_ninf_v2f16(<2 x half> %x, <2 x i32> %y) {
793
788
; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i16> [[__YTOU]], <i16 15, i16 15>
794
789
; CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x half> [[X]] to <2 x i16>
795
790
; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i16> [[__YEVEN]], [[TMP0]]
796
- ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x half> [[__EXP2]] to <2 x i16>
797
- ; CHECK-NEXT: [[TMP2:%.*]] = or disjoint <2 x i16> [[__POW_SIGN]], [[TMP1]]
798
- ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i16> [[TMP2]] to <2 x half>
799
- ; CHECK-NEXT: ret <2 x half> [[TMP3]]
791
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i16> [[__POW_SIGN]] to <2 x half>
792
+ ; CHECK-NEXT: [[__POW_SIGN1:%.*]] = call nnan ninf afn <2 x half> @llvm.copysign.v2f16(<2 x half> [[__EXP2]], <2 x half> [[TMP1]])
793
+ ; CHECK-NEXT: ret <2 x half> [[__POW_SIGN1]]
800
794
;
801
795
entry:
802
796
%call = tail call nnan ninf afn <2 x half > @_Z4pownDv2_DhDv2_i (<2 x half > %x , <2 x i32 > %y )
@@ -827,10 +821,9 @@ define float @test_pown_fast_f32_strictfp(float %x, i32 %y) #1 {
827
821
; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[Y]], 31
828
822
; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[X]] to i32
829
823
; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP0]]
830
- ; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[__EXP2]] to i32
831
- ; CHECK-NEXT: [[TMP2:%.*]] = or disjoint i32 [[__POW_SIGN]], [[TMP1]]
832
- ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[TMP2]] to float
833
- ; CHECK-NEXT: ret float [[TMP3]]
824
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32 [[__POW_SIGN]] to float
825
+ ; CHECK-NEXT: [[__POW_SIGN1:%.*]] = call fast float @llvm.copysign.f32(float [[__EXP2]], float [[TMP1]]) #[[ATTR0]]
826
+ ; CHECK-NEXT: ret float [[__POW_SIGN1]]
834
827
;
835
828
entry:
836
829
%call = tail call fast float @_Z4pownfi (float %x , i32 %y ) #1
@@ -840,7 +833,8 @@ entry:
840
833
define float @test_pown_fast_f32__y_poison (float %x ) {
841
834
; CHECK-LABEL: define float @test_pown_fast_f32__y_poison
842
835
; CHECK-SAME: (float [[X:%.*]]) {
843
- ; CHECK-NEXT: ret float poison
836
+ ; CHECK-NEXT: [[__EXP2:%.*]] = call fast float @llvm.exp2.f32(float poison)
837
+ ; CHECK-NEXT: ret float [[__EXP2]]
844
838
;
845
839
%call = tail call fast float @_Z4pownfi (float %x , i32 poison)
846
840
ret float %call
@@ -1073,10 +1067,9 @@ define float @test_pown_afn_ninf_nnan_f32__x_known_positive(float nofpclass(ninf
1073
1067
; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[Y]], 31
1074
1068
; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[X]] to i32
1075
1069
; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP0]]
1076
- ; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[__EXP2]] to i32
1077
- ; CHECK-NEXT: [[TMP2:%.*]] = or disjoint i32 [[__POW_SIGN]], [[TMP1]]
1078
- ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[TMP2]] to float
1079
- ; CHECK-NEXT: ret float [[TMP3]]
1070
+ ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32 [[__POW_SIGN]] to float
1071
+ ; CHECK-NEXT: [[__POW_SIGN1:%.*]] = call nnan ninf afn float @llvm.copysign.f32(float [[__EXP2]], float [[TMP1]])
1072
+ ; CHECK-NEXT: ret float [[__POW_SIGN1]]
1080
1073
;
1081
1074
entry:
1082
1075
%call = tail call afn ninf nnan float @_Z4pownfi (float %x , i32 %y )
0 commit comments