@@ -870,7 +870,7 @@ define float @ldexp_2_flags(float %x) {
870
870
define float @ldexp_metadata (float %x ) {
871
871
; CHECK-LABEL: define float @ldexp_metadata
872
872
; CHECK-SAME: (float [[X:%.*]]) {
873
- ; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 2), !foo !2
873
+ ; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 2), !foo [[META2:![0-9]+]]
874
874
; CHECK-NEXT: ret float [[LDEXP]]
875
875
;
876
876
%ldexp = call float @llvm.ldexp.f32.i32 (float %x , i32 2 ), !foo !2
@@ -889,6 +889,132 @@ define float @ldexp_8_contractable(float %x, float %y) {
889
889
ret float %fadd
890
890
}
891
891
892
+ define float @ldexp_f32_mask_select_0 (i1 %cond , float %x , i32 %y ) {
893
+ ; CHECK-LABEL: define float @ldexp_f32_mask_select_0
894
+ ; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {
895
+ ; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])
896
+ ; CHECK-NEXT: [[LDEXP:%.*]] = select i1 [[COND]], float [[TMP1]], float [[X]]
897
+ ; CHECK-NEXT: ret float [[LDEXP]]
898
+ ;
899
+ %select = select i1 %cond , i32 %y , i32 0
900
+ %ldexp = call float @llvm.ldexp.f32.i32 (float %x , i32 %select )
901
+ ret float %ldexp
902
+ }
903
+
904
+ define float @ldexp_nnan_f32_mask_select_0 (i1 %cond , float %x , i32 %y ) {
905
+ ; CHECK-LABEL: define float @ldexp_nnan_f32_mask_select_0
906
+ ; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {
907
+ ; CHECK-NEXT: [[TMP1:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])
908
+ ; CHECK-NEXT: [[LDEXP:%.*]] = select i1 [[COND]], float [[TMP1]], float [[X]]
909
+ ; CHECK-NEXT: ret float [[LDEXP]]
910
+ ;
911
+ %select = select i1 %cond , i32 %y , i32 0
912
+ %ldexp = call nnan float @llvm.ldexp.f32.i32 (float %x , i32 %select )
913
+ ret float %ldexp
914
+ }
915
+
916
+ define float @ldexp_flags_f32_mask_select_0 (i1 %cond , float %x , i32 %y ) {
917
+ ; CHECK-LABEL: define float @ldexp_flags_f32_mask_select_0
918
+ ; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {
919
+ ; CHECK-NEXT: [[TMP1:%.*]] = call ninf nsz float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])
920
+ ; CHECK-NEXT: [[LDEXP:%.*]] = select i1 [[COND]], float [[TMP1]], float [[X]]
921
+ ; CHECK-NEXT: ret float [[LDEXP]]
922
+ ;
923
+ %select = select i1 %cond , i32 %y , i32 0
924
+ %ldexp = call nsz ninf float @llvm.ldexp.f32.i32 (float %x , i32 %select )
925
+ ret float %ldexp
926
+ }
927
+
928
+ define float @ldexp_f32_mask_select_0_swap (i1 %cond , float %x , i32 %y ) {
929
+ ; CHECK-LABEL: define float @ldexp_f32_mask_select_0_swap
930
+ ; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {
931
+ ; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])
932
+ ; CHECK-NEXT: [[LDEXP:%.*]] = select i1 [[COND]], float [[X]], float [[TMP1]]
933
+ ; CHECK-NEXT: ret float [[LDEXP]]
934
+ ;
935
+ %select = select i1 %cond , i32 0 , i32 %y
936
+ %ldexp = call float @llvm.ldexp.f32.i32 (float %x , i32 %select )
937
+ ret float %ldexp
938
+ }
939
+
940
+ define float @ldexp_f32_mask_select_1 (i1 %cond , float %x , i32 %y ) {
941
+ ; CHECK-LABEL: define float @ldexp_f32_mask_select_1
942
+ ; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {
943
+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i32 [[Y]], i32 1
944
+ ; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[SELECT]])
945
+ ; CHECK-NEXT: ret float [[LDEXP]]
946
+ ;
947
+ %select = select i1 %cond , i32 %y , i32 1
948
+ %ldexp = call float @llvm.ldexp.f32.i32 (float %x , i32 %select )
949
+ ret float %ldexp
950
+ }
951
+
952
+ define float @ldexp_f32_mask_select_0_multi_use (i1 %cond , float %x , i32 %y , ptr %ptr ) {
953
+ ; CHECK-LABEL: define float @ldexp_f32_mask_select_0_multi_use
954
+ ; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]], ptr [[PTR:%.*]]) {
955
+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i32 [[Y]], i32 0
956
+ ; CHECK-NEXT: store i32 [[SELECT]], ptr [[PTR]], align 4
957
+ ; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[SELECT]])
958
+ ; CHECK-NEXT: ret float [[LDEXP]]
959
+ ;
960
+ %select = select i1 %cond , i32 %y , i32 0
961
+ store i32 %select , ptr %ptr
962
+ %ldexp = call float @llvm.ldexp.f32.i32 (float %x , i32 %select )
963
+ ret float %ldexp
964
+ }
965
+
966
+ define float @ldexp_f32_mask_select_0_swap_multi_use (i1 %cond , float %x , i32 %y , ptr %ptr ) {
967
+ ; CHECK-LABEL: define float @ldexp_f32_mask_select_0_swap_multi_use
968
+ ; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]], ptr [[PTR:%.*]]) {
969
+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i32 0, i32 [[Y]]
970
+ ; CHECK-NEXT: store i32 [[SELECT]], ptr [[PTR]], align 4
971
+ ; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[SELECT]])
972
+ ; CHECK-NEXT: ret float [[LDEXP]]
973
+ ;
974
+ %select = select i1 %cond , i32 0 , i32 %y
975
+ store i32 %select , ptr %ptr
976
+ %ldexp = call float @llvm.ldexp.f32.i32 (float %x , i32 %select )
977
+ ret float %ldexp
978
+ }
979
+
980
+ define float @ldexp_f32_mask_select_0_strictfp (i1 %cond , float %x , i32 %y ) #0 {
981
+ ; CHECK-LABEL: define float @ldexp_f32_mask_select_0_strictfp
982
+ ; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR1:[0-9]+]] {
983
+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i32 [[Y]], i32 0
984
+ ; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.experimental.constrained.ldexp.f32.i32(float [[X]], i32 [[SELECT]], metadata !"round.dynamic", metadata !"fpexcept.strict")
985
+ ; CHECK-NEXT: ret float [[LDEXP]]
986
+ ;
987
+ %select = select i1 %cond , i32 %y , i32 0
988
+ %ldexp = call float @llvm.experimental.constrained.ldexp.f32.i32 (float %x , i32 %select , metadata !"round.dynamic" , metadata !"fpexcept.strict" )
989
+ ret float %ldexp
990
+ }
991
+
992
+ define <2 x float > @ldexp_v2f32_mask_select_0 (<2 x i1 > %cond , <2 x float > %x , <2 x i32 > %y ) {
993
+ ; CHECK-LABEL: define <2 x float> @ldexp_v2f32_mask_select_0
994
+ ; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
995
+ ; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> [[Y]])
996
+ ; CHECK-NEXT: [[LDEXP:%.*]] = select <2 x i1> [[COND]], <2 x float> [[TMP1]], <2 x float> [[X]]
997
+ ; CHECK-NEXT: ret <2 x float> [[LDEXP]]
998
+ ;
999
+ %select = select <2 x i1 > %cond , <2 x i32 > %y , <2 x i32 > zeroinitializer
1000
+ %ldexp = call nsz nnan <2 x float > @llvm.ldexp.f32.v2i32 (<2 x float > %x , <2 x i32 > %select )
1001
+ ret <2 x float > %ldexp
1002
+ }
1003
+
1004
+ define <2 x float > @ldexp_v2f32_mask_select_0_swap (<2 x i1 > %cond , <2 x float > %x , <2 x i32 > %y ) {
1005
+ ; CHECK-LABEL: define <2 x float> @ldexp_v2f32_mask_select_0_swap
1006
+ ; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) {
1007
+ ; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> [[Y]])
1008
+ ; CHECK-NEXT: [[LDEXP:%.*]] = select <2 x i1> [[COND]], <2 x float> [[X]], <2 x float> [[TMP1]]
1009
+ ; CHECK-NEXT: ret <2 x float> [[LDEXP]]
1010
+ ;
1011
+ %select = select <2 x i1 > %cond , <2 x i32 > zeroinitializer , <2 x i32 > %y
1012
+ %ldexp = call nsz nnan <2 x float > @llvm.ldexp.f32.v2i32 (<2 x float > %x , <2 x i32 > %select )
1013
+ ret <2 x float > %ldexp
1014
+ }
1015
+
1016
+ attributes #0 = { strictfp }
1017
+
892
1018
!0 = !{i32 -127 , i32 0 }
893
1019
!1 = !{i32 0 , i32 127 }
894
1020
!2 = !{}
0 commit comments