Skip to content

Commit cdb7d57

Browse files
committed
[LV] Add test for select truncation.
Add test coverage for truncating selects for D149903.
1 parent 6d0d411 commit cdb7d57

File tree

1 file changed

+104
-13
lines changed

1 file changed

+104
-13
lines changed

llvm/test/Transforms/LoopVectorize/AArch64/deterministic-type-shrinkage.ll

Lines changed: 104 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -165,32 +165,47 @@ define void @test_shrink_zext_in_preheader(ptr noalias %src, ptr noalias %dst, i
165165
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <16 x i32> poison, i32 [[A]], i64 0
166166
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <16 x i32> [[BROADCAST_SPLATINSERT]], <16 x i32> poison, <16 x i32> zeroinitializer
167167
; CHECK-NEXT: [[TMP0:%.*]] = insertelement <16 x i16> undef, i16 [[B]], i64 0
168-
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i16> [[TMP0]], <16 x i16> poison, <16 x i32> zeroinitializer
168+
; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector <16 x i16> [[TMP0]], <16 x i16> poison, <16 x i32> zeroinitializer
169169
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
170170
; CHECK: vector.body:
171171
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
172-
; CHECK-NEXT: [[TMP2:%.*]] = trunc <16 x i32> [[BROADCAST_SPLAT]] to <16 x i16>
173-
; CHECK-NEXT: [[TMP3:%.*]] = mul <16 x i16> [[TMP1]], [[TMP2]]
174-
; CHECK-NEXT: [[TMP4:%.*]] = trunc <16 x i32> [[BROADCAST_SPLAT]] to <16 x i16>
175-
; CHECK-NEXT: [[TMP5:%.*]] = mul <16 x i16> [[TMP1]], [[TMP4]]
176-
; CHECK-NEXT: [[TMP6:%.*]] = lshr <16 x i16> [[TMP3]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
177-
; CHECK-NEXT: [[TMP7:%.*]] = lshr <16 x i16> [[TMP5]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
172+
; CHECK-NEXT: [[TMP1:%.*]] = trunc <16 x i32> [[BROADCAST_SPLAT]] to <16 x i16>
173+
; CHECK-NEXT: [[TMP2:%.*]] = mul <16 x i16> [[BROADCAST_SPLAT2]], [[TMP1]]
174+
; CHECK-NEXT: [[TMP3:%.*]] = trunc <16 x i32> [[BROADCAST_SPLAT]] to <16 x i16>
175+
; CHECK-NEXT: [[TMP4:%.*]] = mul <16 x i16> [[BROADCAST_SPLAT2]], [[TMP3]]
176+
; CHECK-NEXT: [[TMP5:%.*]] = lshr <16 x i16> [[TMP2]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
177+
; CHECK-NEXT: [[TMP6:%.*]] = lshr <16 x i16> [[TMP4]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
178+
; CHECK-NEXT: [[TMP7:%.*]] = trunc <16 x i16> [[TMP5]] to <16 x i8>
178179
; CHECK-NEXT: [[TMP8:%.*]] = trunc <16 x i16> [[TMP6]] to <16 x i8>
179-
; CHECK-NEXT: [[TMP9:%.*]] = trunc <16 x i16> [[TMP7]] to <16 x i8>
180-
; CHECK-NEXT: [[TMP10:%.*]] = sext i32 [[INDEX]] to i64
181-
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP10]]
180+
; CHECK-NEXT: [[TMP9:%.*]] = sext i32 [[INDEX]] to i64
181+
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP9]]
182+
; CHECK-NEXT: store <16 x i8> [[TMP7]], ptr [[TMP10]], align 1
183+
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[TMP10]], i64 16
182184
; CHECK-NEXT: store <16 x i8> [[TMP8]], ptr [[TMP11]], align 1
183-
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[TMP11]], i64 16
184-
; CHECK-NEXT: store <16 x i8> [[TMP9]], ptr [[TMP12]], align 1
185185
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 32
186+
; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992
187+
; CHECK-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
186188
; CHECK: middle.block:
187189
; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]
188190
; CHECK: vec.epilog.iter.check:
189191
; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]]
190192
; CHECK: vec.epilog.ph:
191-
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <8 x i16> undef, i16 [[B]], i64 0
193+
; CHECK-NEXT: [[TMP13:%.*]] = insertelement <8 x i16> undef, i16 [[B]], i64 0
192194
; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]
193195
; CHECK: vec.epilog.vector.body:
196+
; CHECK-NEXT: [[INDEX4:%.*]] = phi i32 [ 992, [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT9:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
197+
; CHECK-NEXT: [[TMP14:%.*]] = trunc i32 [[A]] to i16
198+
; CHECK-NEXT: [[TMP15:%.*]] = insertelement <8 x i16> undef, i16 [[TMP14]], i64 0
199+
; CHECK-NEXT: [[TMP16:%.*]] = mul <8 x i16> [[TMP15]], [[TMP13]]
200+
; CHECK-NEXT: [[TMP17:%.*]] = lshr <8 x i16> [[TMP16]], <i16 8, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
201+
; CHECK-NEXT: [[TMP18:%.*]] = trunc <8 x i16> [[TMP17]] to <8 x i8>
202+
; CHECK-NEXT: [[TMP19:%.*]] = shufflevector <8 x i8> [[TMP18]], <8 x i8> poison, <8 x i32> zeroinitializer
203+
; CHECK-NEXT: [[TMP20:%.*]] = sext i32 [[INDEX4]] to i64
204+
; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP20]]
205+
; CHECK-NEXT: store <8 x i8> [[TMP19]], ptr [[TMP21]], align 1
206+
; CHECK-NEXT: [[INDEX_NEXT9]] = add nuw i32 [[INDEX4]], 8
207+
; CHECK-NEXT: [[TMP22:%.*]] = icmp eq i32 [[INDEX_NEXT9]], 1000
208+
; CHECK-NEXT: br i1 [[TMP22]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
194209
; CHECK: vec.epilog.middle.block:
195210
; CHECK-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
196211
; CHECK: vec.epilog.scalar.ph:
@@ -221,3 +236,79 @@ loop:
221236
exit:
222237
ret void
223238
}
239+
240+
define void @test_shrink_select(ptr noalias %src, ptr noalias %dst, i32 %A, i1 %c) {
241+
; CHECK-LABEL: define void @test_shrink_select
242+
; CHECK-SAME: (ptr noalias [[SRC:%.*]], ptr noalias [[DST:%.*]], i32 [[A:%.*]], i1 [[C:%.*]]) {
243+
; CHECK-NEXT: iter.check:
244+
; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]
245+
; CHECK: vector.main.loop.iter.check:
246+
; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]
247+
; CHECK: vector.ph:
248+
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
249+
; CHECK: vector.body:
250+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
251+
; CHECK-NEXT: [[TMP0:%.*]] = trunc i32 [[A]] to i16
252+
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <16 x i16> undef, i16 [[TMP0]], i64 0
253+
; CHECK-NEXT: [[TMP2:%.*]] = mul <16 x i16> [[TMP1]], <i16 99, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison>
254+
; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i16> [[TMP2]], <16 x i16> poison, <16 x i32> zeroinitializer
255+
; CHECK-NEXT: [[TMP4:%.*]] = lshr <16 x i16> [[TMP3]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
256+
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[C]], <16 x i16> [[TMP4]], <16 x i16> [[TMP3]]
257+
; CHECK-NEXT: [[TMP6:%.*]] = trunc <16 x i16> [[TMP5]] to <16 x i8>
258+
; CHECK-NEXT: [[TMP7:%.*]] = sext i32 [[INDEX]] to i64
259+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP7]]
260+
; CHECK-NEXT: store <16 x i8> [[TMP6]], ptr [[TMP8]], align 1
261+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 16
262+
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992
263+
; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
264+
; CHECK: middle.block:
265+
; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]
266+
; CHECK: vec.epilog.iter.check:
267+
; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]]
268+
; CHECK: vec.epilog.ph:
269+
; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]
270+
; CHECK: vec.epilog.vector.body:
271+
; CHECK-NEXT: [[INDEX2:%.*]] = phi i32 [ 992, [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT5:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
272+
; CHECK-NEXT: [[TMP10:%.*]] = trunc i32 [[A]] to i16
273+
; CHECK-NEXT: [[TMP11:%.*]] = insertelement <8 x i16> undef, i16 [[TMP10]], i64 0
274+
; CHECK-NEXT: [[TMP12:%.*]] = mul <8 x i16> [[TMP11]], <i16 99, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison>
275+
; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <8 x i16> [[TMP12]], <8 x i16> poison, <8 x i32> zeroinitializer
276+
; CHECK-NEXT: [[TMP14:%.*]] = lshr <8 x i16> [[TMP13]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
277+
; CHECK-NEXT: [[TMP15:%.*]] = select i1 [[C]], <8 x i16> [[TMP14]], <8 x i16> [[TMP13]]
278+
; CHECK-NEXT: [[TMP16:%.*]] = trunc <8 x i16> [[TMP15]] to <8 x i8>
279+
; CHECK-NEXT: [[TMP17:%.*]] = sext i32 [[INDEX2]] to i64
280+
; CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP17]]
281+
; CHECK-NEXT: store <8 x i8> [[TMP16]], ptr [[TMP18]], align 1
282+
; CHECK-NEXT: [[INDEX_NEXT5]] = add nuw i32 [[INDEX2]], 8
283+
; CHECK-NEXT: [[TMP19:%.*]] = icmp eq i32 [[INDEX_NEXT5]], 1000
284+
; CHECK-NEXT: br i1 [[TMP19]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
285+
; CHECK: vec.epilog.middle.block:
286+
; CHECK-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
287+
; CHECK: vec.epilog.scalar.ph:
288+
; CHECK-NEXT: br label [[LOOP:%.*]]
289+
; CHECK: loop:
290+
; CHECK-NEXT: br i1 poison, label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP10:![0-9]+]]
291+
; CHECK: exit:
292+
; CHECK-NEXT: ret void
293+
;
294+
entry:
295+
br label %loop
296+
297+
loop:
298+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
299+
%gep.src = getelementptr inbounds i16, ptr %src, i32 %iv
300+
%l = load i16, ptr %gep.src
301+
%conv4111 = zext i16 %l to i32
302+
%mul = mul i32 %A, 99
303+
%shr = lshr i32 %mul, 8
304+
%sel = select i1 %c, i32 %shr, i32 %mul
305+
%conv5 = trunc i32 %sel to i8
306+
%gep.dst = getelementptr inbounds i8, ptr %dst, i32 %iv
307+
store i8 %conv5, ptr %gep.dst, align 1
308+
%iv.next = add i32 %iv, 1
309+
%exitcond.not = icmp eq i32 %iv.next, 1000
310+
br i1 %exitcond.not, label %exit, label %loop
311+
312+
exit:
313+
ret void
314+
}

0 commit comments

Comments
 (0)