@@ -39,8 +39,8 @@ define i16 @selective_shift_16.commute(i32 %mask, i16 %upper, i16 %lower) {
3939 ret i16 %trunc
4040}
4141
42- define i16 @selective_shift_16_range (i32 %mask , i32 %upper , i32 range(i32 0 , 65536 ) %lower ) {
43- ; CHECK-LABEL: define i16 @selective_shift_16_range (
42+ define i16 @selective_shift_16.range (i32 %mask , i32 %upper , i32 range(i32 0 , 65536 ) %lower ) {
43+ ; CHECK-LABEL: define i16 @selective_shift_16.range (
4444; CHECK-SAME: i32 [[MASK:%.*]], i32 [[UPPER:%.*]], i32 range(i32 0, 65536) [[LOWER:%.*]]) {
4545; CHECK-NEXT: [[MASK_BIT:%.*]] = and i32 [[MASK]], 16
4646; CHECK-NEXT: [[MASK_BIT_Z:%.*]] = icmp eq i32 [[MASK_BIT]], 0
@@ -56,8 +56,27 @@ define i16 @selective_shift_16_range(i32 %mask, i32 %upper, i32 range(i32 0, 655
5656 ret i16 %trunc
5757}
5858
59- define <2 x i16 > @selective_shift_v16 (<2 x i32 > %mask , <2 x i16 > %upper , <2 x i16 > %lower ) {
60- ; CHECK-LABEL: define <2 x i16> @selective_shift_v16(
59+ define i32 @selective_shift_16.masked (i32 %mask , i16 %upper , i16 %lower ) {
60+ ; CHECK-LABEL: define i32 @selective_shift_16.masked(
61+ ; CHECK-SAME: i32 [[MASK:%.*]], i16 [[UPPER:%.*]], i16 [[LOWER:%.*]]) {
62+ ; CHECK-NEXT: [[MASK_BIT:%.*]] = and i32 [[MASK]], 16
63+ ; CHECK-NEXT: [[MASK_BIT_Z:%.*]] = icmp eq i32 [[MASK_BIT]], 0
64+ ; CHECK-NEXT: [[SEL_V:%.*]] = select i1 [[MASK_BIT_Z]], i16 [[LOWER]], i16 [[UPPER]]
65+ ; CHECK-NEXT: [[SEL:%.*]] = zext i16 [[SEL_V]] to i32
66+ ; CHECK-NEXT: ret i32 [[SEL]]
67+ ;
68+ %upper.zext = zext i16 %upper to i32
69+ %upper.shl = shl nuw i32 %upper.zext , 16
70+ %lower.zext = zext i16 %lower to i32
71+ %pack = or disjoint i32 %lower.zext , %upper.shl
72+ %mask.bit = and i32 %mask , 16
73+ %sel = lshr i32 %pack , %mask.bit
74+ %sel.masked = and i32 %sel , 65535
75+ ret i32 %sel.masked
76+ }
77+
78+ define <2 x i16 > @selective_shift.v16 (<2 x i32 > %mask , <2 x i16 > %upper , <2 x i16 > %lower ) {
79+ ; CHECK-LABEL: define <2 x i16> @selective_shift.v16(
6180; CHECK-SAME: <2 x i32> [[MASK:%.*]], <2 x i16> [[UPPER:%.*]], <2 x i16> [[LOWER:%.*]]) {
6281; CHECK-NEXT: [[MASK_BIT:%.*]] = and <2 x i32> [[MASK]], splat (i32 16)
6382; CHECK-NEXT: [[MASK_BIT_Z:%.*]] = icmp eq <2 x i32> [[MASK_BIT]], zeroinitializer
@@ -183,7 +202,7 @@ define i16 @selective_shift_16.mu.1(i32 %mask, i16 %upper, i16 %lower) {
183202 ret i16 %trunc
184203}
185204
186- ; multi- use of %sel blocks fold
205+ ; non-truncated use of %sel blocks fold
187206define i16 @selective_shift_16.mu.2 (i32 %mask , i16 %upper , i16 %lower ) {
188207; CHECK-LABEL: define i16 @selective_shift_16.mu.2(
189208; CHECK-SAME: i32 [[MASK:%.*]], i16 [[UPPER:%.*]], i16 [[LOWER:%.*]]) {
@@ -248,38 +267,3 @@ define i32 @selective_shift_32(i64 %mask, i32 %upper, i32 %lower) {
248267 %trunc = trunc i64 %sel to i32
249268 ret i32 %trunc
250269}
251-
252- define i32 @selective_shift_32.commute (i64 %mask , i32 %upper , i32 %lower ) {
253- ; CHECK-LABEL: define i32 @selective_shift_32.commute(
254- ; CHECK-SAME: i64 [[MASK:%.*]], i32 [[UPPER:%.*]], i32 [[LOWER:%.*]]) {
255- ; CHECK-NEXT: [[MASK_BIT:%.*]] = and i64 [[MASK]], 32
256- ; CHECK-NEXT: [[MASK_BIT_Z:%.*]] = icmp eq i64 [[MASK_BIT]], 0
257- ; CHECK-NEXT: [[SEL_V:%.*]] = select i1 [[MASK_BIT_Z]], i32 [[LOWER]], i32 [[UPPER]]
258- ; CHECK-NEXT: ret i32 [[SEL_V]]
259- ;
260- %upper.zext = zext i32 %upper to i64
261- %upper.shl = shl nuw i64 %upper.zext , 32
262- %lower.zext = zext i32 %lower to i64
263- %pack = or disjoint i64 %lower.zext , %upper.shl
264- %mask.bit = and i64 %mask , 32
265- %sel = lshr i64 %pack , %mask.bit
266- %trunc = trunc i64 %sel to i32
267- ret i32 %trunc
268- }
269-
270- define i32 @selective_shift_32_range (i64 %mask , i64 %upper , i64 range(i64 0 , 4294967296 ) %lower ) {
271- ; CHECK-LABEL: define i32 @selective_shift_32_range(
272- ; CHECK-SAME: i64 [[MASK:%.*]], i64 [[UPPER:%.*]], i64 range(i64 0, 4294967296) [[LOWER:%.*]]) {
273- ; CHECK-NEXT: [[MASK_BIT:%.*]] = and i64 [[MASK]], 32
274- ; CHECK-NEXT: [[MASK_BIT_Z:%.*]] = icmp eq i64 [[MASK_BIT]], 0
275- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[MASK_BIT_Z]], i64 [[LOWER]], i64 [[UPPER]]
276- ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[SEL]] to i32
277- ; CHECK-NEXT: ret i32 [[TRUNC]]
278- ;
279- %upper.shl = shl nuw i64 %upper , 32
280- %pack = or disjoint i64 %upper.shl , %lower
281- %mask.bit = and i64 %mask , 32
282- %sel = lshr i64 %pack , %mask.bit
283- %trunc = trunc i64 %sel to i32
284- ret i32 %trunc
285- }
0 commit comments