@@ -831,8 +831,9 @@ 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: [[TMP1:%.*]] = call i16 @llvm.bswap.i16(i16 [[X:%.*]])
835
- ; CHECK-NEXT: [[S:%.*]] = zext i16 [[TMP1]] to i32
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
836
837
; CHECK-NEXT: ret i32 [[S]]
837
838
;
838
839
%z = zext i16 %x to i32
@@ -843,8 +844,9 @@ define i32 @narrow_bswap(i16 %x) {
843
844
844
845
define i128 @narrow_bswap_extra_wide (i16 %x ) {
845
846
; CHECK-LABEL: @narrow_bswap_extra_wide(
846
- ; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.bswap.i16(i16 [[X:%.*]])
847
- ; CHECK-NEXT: [[S:%.*]] = zext i16 [[TMP1]] to i128
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
848
850
; CHECK-NEXT: ret i128 [[S]]
849
851
;
850
852
%z = zext i16 %x to i128
@@ -853,8 +855,6 @@ define i128 @narrow_bswap_extra_wide(i16 %x) {
853
855
ret i128 %s
854
856
}
855
857
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,8 +870,9 @@ 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: [[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>
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>
875
876
; CHECK-NEXT: ret <2 x i64> [[S]]
876
877
;
877
878
%z = zext <2 x i16 > %x to <2 x i64 >
@@ -880,8 +881,6 @@ define <2 x i64> @narrow_bswap_splat(<2 x i16> %x) {
880
881
ret <2 x i64 > %s
881
882
}
882
883
883
- ; TODO: poison/undef in the shift amount is ok to propagate.
884
-
885
884
define <2 x i64 > @narrow_bswap_splat_poison_elt (<2 x i16 > %x ) {
886
885
; CHECK-LABEL: @narrow_bswap_splat_poison_elt(
887
886
; CHECK-NEXT: [[Z:%.*]] = zext <2 x i16> [[X:%.*]] to <2 x i64>
@@ -897,9 +896,9 @@ define <2 x i64> @narrow_bswap_splat_poison_elt(<2 x i16> %x) {
897
896
898
897
define <2 x i64 > @narrow_bswap_overshift (<2 x i32 > %x ) {
899
898
; CHECK-LABEL: @narrow_bswap_overshift(
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>
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 >
903
902
; CHECK-NEXT: ret <2 x i64> [[S]]
904
903
;
905
904
%z = zext <2 x i32 > %x to <2 x i64 >
@@ -910,9 +909,9 @@ define <2 x i64> @narrow_bswap_overshift(<2 x i32> %x) {
910
909
911
910
define i128 @narrow_bswap_overshift2 (i96 %x ) {
912
911
; CHECK-LABEL: @narrow_bswap_overshift2(
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
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
916
915
; CHECK-NEXT: ret i128 [[S]]
917
916
;
918
917
%z = zext i96 %x to i128
0 commit comments