Skip to content

Commit c4f31d1

Browse files
committed
[InstCombine] add tests for shift-of-bswap; NFC
1 parent c56dd20 commit c4f31d1

File tree

1 file changed

+94
-0
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+94
-0
lines changed

llvm/test/Transforms/InstCombine/lshr.ll

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33

44
target datalayout = "e-m:e-i64:64-n8:16:32:64"
55

6+
declare i32 @llvm.bswap.i32(i32)
7+
declare i128 @llvm.bswap.i128(i128)
8+
declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)
69
declare i32 @llvm.cttz.i32(i32, i1) nounwind readnone
710
declare i32 @llvm.ctlz.i32(i32, i1) nounwind readnone
811
declare i32 @llvm.ctpop.i32(i32) nounwind readnone
@@ -825,3 +828,94 @@ define i1 @icmp_sge(i32 %x, i32 %y) {
825828
%cmp = icmp sge i32 %x.shifted, %x
826829
ret i1 %cmp
827830
}
831+
832+
define i32 @narrow_bswap(i16 %x) {
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
837+
; CHECK-NEXT: ret i32 [[S]]
838+
;
839+
%z = zext i16 %x to i32
840+
%b = call i32 @llvm.bswap.i32(i32 %z)
841+
%s = lshr i32 %b, 16
842+
ret i32 %s
843+
}
844+
845+
define i128 @narrow_bswap_extra_wide(i16 %x) {
846+
; 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
850+
; CHECK-NEXT: ret i128 [[S]]
851+
;
852+
%z = zext i16 %x to i128
853+
%b = call i128 @llvm.bswap.i128(i128 %z)
854+
%s = lshr i128 %b, 112
855+
ret i128 %s
856+
}
857+
858+
define i32 @narrow_bswap_undershift(i16 %x) {
859+
; CHECK-LABEL: @narrow_bswap_undershift(
860+
; CHECK-NEXT: [[Z:%.*]] = zext i16 [[X:%.*]] to i32
861+
; CHECK-NEXT: [[B:%.*]] = call i32 @llvm.bswap.i32(i32 [[Z]])
862+
; CHECK-NEXT: [[S:%.*]] = lshr exact i32 [[B]], 8
863+
; CHECK-NEXT: ret i32 [[S]]
864+
;
865+
%z = zext i16 %x to i32
866+
%b = call i32 @llvm.bswap.i32(i32 %z)
867+
%s = lshr i32 %b, 8
868+
ret i32 %s
869+
}
870+
871+
define <2 x i64> @narrow_bswap_splat(<2 x i16> %x) {
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>
876+
; CHECK-NEXT: ret <2 x i64> [[S]]
877+
;
878+
%z = zext <2 x i16> %x to <2 x i64>
879+
%b = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %z)
880+
%s = lshr <2 x i64> %b, <i64 48, i64 48>
881+
ret <2 x i64> %s
882+
}
883+
884+
define <2 x i64> @narrow_bswap_splat_poison_elt(<2 x i16> %x) {
885+
; CHECK-LABEL: @narrow_bswap_splat_poison_elt(
886+
; CHECK-NEXT: [[Z:%.*]] = zext <2 x i16> [[X:%.*]] to <2 x i64>
887+
; CHECK-NEXT: [[B:%.*]] = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> [[Z]])
888+
; CHECK-NEXT: [[S:%.*]] = lshr <2 x i64> [[B]], <i64 48, i64 poison>
889+
; CHECK-NEXT: ret <2 x i64> [[S]]
890+
;
891+
%z = zext <2 x i16> %x to <2 x i64>
892+
%b = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %z)
893+
%s = lshr <2 x i64> %b, <i64 48, i64 poison>
894+
ret <2 x i64> %s
895+
}
896+
897+
define <2 x i64> @narrow_bswap_overshift(<2 x i32> %x) {
898+
; 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>
902+
; CHECK-NEXT: ret <2 x i64> [[S]]
903+
;
904+
%z = zext <2 x i32> %x to <2 x i64>
905+
%b = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %z)
906+
%s = lshr <2 x i64> %b, <i64 48, i64 48>
907+
ret <2 x i64> %s
908+
}
909+
910+
define i128 @narrow_bswap_overshift2(i96 %x) {
911+
; 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
915+
; CHECK-NEXT: ret i128 [[S]]
916+
;
917+
%z = zext i96 %x to i128
918+
%b = call i128 @llvm.bswap.i128(i128 %z)
919+
%s = lshr i128 %b, 61
920+
ret i128 %s
921+
}

0 commit comments

Comments
 (0)