@@ -831,9 +831,8 @@ define i1 @icmp_sge(i32 %x, i32 %y) {
831
831
832
832
define i32 @narrow_bswap (i16 %x ) {
833
833
; CHECK-LABEL: @narrow_bswap(
834
- ; CHECK-NEXT: [[Z:%.*]] = zext i16 [[X:%.*]] to i32
835
- ; CHECK-NEXT: [[B:%.*]] = call i32 @llvm.bswap.i32(i32 [[Z]])
836
- ; CHECK-NEXT: [[S:%.*]] = lshr exact i32 [[B]], 16
834
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.bswap.i16(i16 [[X:%.*]])
835
+ ; CHECK-NEXT: [[S:%.*]] = zext i16 [[TMP1]] to i32
837
836
; CHECK-NEXT: ret i32 [[S]]
838
837
;
839
838
%z = zext i16 %x to i32
@@ -844,9 +843,8 @@ define i32 @narrow_bswap(i16 %x) {
844
843
845
844
define i128 @narrow_bswap_extra_wide (i16 %x ) {
846
845
; CHECK-LABEL: @narrow_bswap_extra_wide(
847
- ; CHECK-NEXT: [[Z:%.*]] = zext i16 [[X:%.*]] to i128
848
- ; CHECK-NEXT: [[B:%.*]] = call i128 @llvm.bswap.i128(i128 [[Z]])
849
- ; CHECK-NEXT: [[S:%.*]] = lshr exact i128 [[B]], 112
846
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.bswap.i16(i16 [[X:%.*]])
847
+ ; CHECK-NEXT: [[S:%.*]] = zext i16 [[TMP1]] to i128
850
848
; CHECK-NEXT: ret i128 [[S]]
851
849
;
852
850
%z = zext i16 %x to i128
@@ -855,6 +853,8 @@ define i128 @narrow_bswap_extra_wide(i16 %x) {
855
853
ret i128 %s
856
854
}
857
855
856
+ ; TODO: The bswap can be narrowed followed by shl.
857
+
858
858
define i32 @narrow_bswap_undershift (i16 %x ) {
859
859
; CHECK-LABEL: @narrow_bswap_undershift(
860
860
; CHECK-NEXT: [[Z:%.*]] = zext i16 [[X:%.*]] to i32
@@ -870,9 +870,8 @@ define i32 @narrow_bswap_undershift(i16 %x) {
870
870
871
871
define <2 x i64 > @narrow_bswap_splat (<2 x i16 > %x ) {
872
872
; CHECK-LABEL: @narrow_bswap_splat(
873
- ; CHECK-NEXT: [[Z:%.*]] = zext <2 x i16> [[X:%.*]] to <2 x i64>
874
- ; CHECK-NEXT: [[B:%.*]] = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> [[Z]])
875
- ; CHECK-NEXT: [[S:%.*]] = lshr exact <2 x i64> [[B]], <i64 48, i64 48>
873
+ ; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i16> @llvm.bswap.v2i16(<2 x i16> [[X:%.*]])
874
+ ; CHECK-NEXT: [[S:%.*]] = zext <2 x i16> [[TMP1]] to <2 x i64>
876
875
; CHECK-NEXT: ret <2 x i64> [[S]]
877
876
;
878
877
%z = zext <2 x i16 > %x to <2 x i64 >
@@ -881,6 +880,8 @@ define <2 x i64> @narrow_bswap_splat(<2 x i16> %x) {
881
880
ret <2 x i64 > %s
882
881
}
883
882
883
+ ; TODO: poison/undef in the shift amount is ok to propagate.
884
+
884
885
define <2 x i64 > @narrow_bswap_splat_poison_elt (<2 x i16 > %x ) {
885
886
; CHECK-LABEL: @narrow_bswap_splat_poison_elt(
886
887
; CHECK-NEXT: [[Z:%.*]] = zext <2 x i16> [[X:%.*]] to <2 x i64>
@@ -896,9 +897,9 @@ define <2 x i64> @narrow_bswap_splat_poison_elt(<2 x i16> %x) {
896
897
897
898
define <2 x i64 > @narrow_bswap_overshift (<2 x i32 > %x ) {
898
899
; CHECK-LABEL: @narrow_bswap_overshift(
899
- ; CHECK-NEXT: [[Z :%.*]] = zext <2 x i32> [[X:%.*]] to <2 x i64>
900
- ; CHECK-NEXT: [[B :%.*]] = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> [[Z]])
901
- ; CHECK-NEXT: [[S:%.*]] = lshr <2 x i64 > [[B]], <i64 48, i64 48 >
900
+ ; CHECK-NEXT: [[TMP1 :%.*]] = call <2 x i32> @llvm.bswap.v2i32(<2 x i32> [[X:%.*]])
901
+ ; CHECK-NEXT: [[TMP2 :%.*]] = lshr <2 x i32> [[TMP1]], <i32 16, i32 16>
902
+ ; CHECK-NEXT: [[S:%.*]] = zext <2 x i32 > [[TMP2]] to <2 x i64>
902
903
; CHECK-NEXT: ret <2 x i64> [[S]]
903
904
;
904
905
%z = zext <2 x i32 > %x to <2 x i64 >
@@ -909,9 +910,9 @@ define <2 x i64> @narrow_bswap_overshift(<2 x i32> %x) {
909
910
910
911
define i128 @narrow_bswap_overshift2 (i96 %x ) {
911
912
; CHECK-LABEL: @narrow_bswap_overshift2(
912
- ; CHECK-NEXT: [[Z :%.*]] = zext i96 [[X:%.*]] to i128
913
- ; CHECK-NEXT: [[B :%.*]] = call i128 @llvm.bswap.i128(i128 [[Z]])
914
- ; CHECK-NEXT: [[S:%.*]] = lshr i128 [[B]], 61
913
+ ; CHECK-NEXT: [[TMP1 :%.*]] = call i96 @llvm.bswap.i96(i96 [[X:%.*]])
914
+ ; CHECK-NEXT: [[TMP2 :%.*]] = lshr i96 [[TMP1]], 29
915
+ ; CHECK-NEXT: [[S:%.*]] = zext i96 [[TMP2]] to i128
915
916
; CHECK-NEXT: ret i128 [[S]]
916
917
;
917
918
%z = zext i96 %x to i128
@@ -920,6 +921,8 @@ define i128 @narrow_bswap_overshift2(i96 %x) {
920
921
ret i128 %s
921
922
}
922
923
924
+ ; negative test - can't make a bswap with an odd number of bytes
925
+
923
926
define i32 @not_narrow_bswap (i24 %x ) {
924
927
; CHECK-LABEL: @not_narrow_bswap(
925
928
; CHECK-NEXT: [[Z:%.*]] = zext i24 [[X:%.*]] to i32
0 commit comments