Skip to content

Commit ad648c9

Browse files
committed
[VectorCombine][NFC][test] Supplement tests of the load-insert-store sequence
The newly added tests are all about scalable vector types. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D157098
1 parent 9427238 commit ad648c9

File tree

1 file changed

+166
-10
lines changed

1 file changed

+166
-10
lines changed

llvm/test/Transforms/VectorCombine/load-insert-store.ll

Lines changed: 166 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt -S -passes=vector-combine -data-layout=e < %s | FileCheck %s
3-
; RUN: opt -S -passes=vector-combine -data-layout=E < %s | FileCheck %s
2+
; RUN: opt -S -passes=vector-combine -data-layout=e < %s | FileCheck %s --check-prefixes=CHECK,LE
3+
; RUN: opt -S -passes=vector-combine -data-layout=E < %s | FileCheck %s --check-prefixes=CHECK,BE
44

55
define void @insert_store(ptr %q, i8 zeroext %s) {
66
; CHECK-LABEL: @insert_store(
@@ -61,6 +61,23 @@ entry:
6161
ret void
6262
}
6363

64+
; To verify the case that index exceeds the minium number
65+
; of elements of a scalable vector type.
66+
define void @insert_store_vscale_exceeds(ptr %q, i16 zeroext %s) {
67+
; CHECK-LABEL: @insert_store_vscale_exceeds(
68+
; CHECK-NEXT: entry:
69+
; CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 8 x i16>, ptr [[Q:%.*]], align 16
70+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <vscale x 8 x i16> [[TMP0]], i16 [[S:%.*]], i32 9
71+
; CHECK-NEXT: store <vscale x 8 x i16> [[VECINS]], ptr [[Q]], align 16
72+
; CHECK-NEXT: ret void
73+
;
74+
entry:
75+
%0 = load <vscale x 8 x i16>, ptr %q
76+
%vecins = insertelement <vscale x 8 x i16> %0, i16 %s, i32 9
77+
store <vscale x 8 x i16> %vecins, ptr %q
78+
ret void
79+
}
80+
6481
define void @insert_store_v9i4(ptr %q, i4 zeroext %s) {
6582
; CHECK-LABEL: @insert_store_v9i4(
6683
; CHECK-NEXT: entry:
@@ -125,6 +142,23 @@ entry:
125142
ret void
126143
}
127144

145+
; To verify the case that the index is not a constant, and
146+
; the vector type is scalable.
147+
define void @insert_store_vscale_nonconst(ptr %q, i8 zeroext %s, i32 %idx) {
148+
; CHECK-LABEL: @insert_store_vscale_nonconst(
149+
; CHECK-NEXT: entry:
150+
; CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i8>, ptr [[Q:%.*]], align 16
151+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <vscale x 16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX:%.*]]
152+
; CHECK-NEXT: store <vscale x 16 x i8> [[VECINS]], ptr [[Q]], align 16
153+
; CHECK-NEXT: ret void
154+
;
155+
entry:
156+
%0 = load <vscale x 16 x i8>, ptr %q
157+
%vecins = insertelement <vscale x 16 x i8> %0, i8 %s, i32 %idx
158+
store <vscale x 16 x i8> %vecins, ptr %q
159+
ret void
160+
}
161+
128162
; To verify align here is narrowed to scalar store size
129163
define void @insert_store_nonconst_large_alignment(ptr %q, i32 zeroext %s, i32 %idx) {
130164
; CHECK-LABEL: @insert_store_nonconst_large_alignment(
@@ -210,6 +244,27 @@ entry:
210244
ret void
211245
}
212246

247+
; To verify the index is not a constant but valid by assume,
248+
; for scalable vector types.
249+
define void @insert_store_vscale_nonconst_index_known_valid_by_assume(ptr %q, i8 zeroext %s, i32 %idx) {
250+
; CHECK-LABEL: @insert_store_vscale_nonconst_index_known_valid_by_assume(
251+
; CHECK-NEXT: entry:
252+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IDX:%.*]], 4
253+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
254+
; CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i8>, ptr [[Q:%.*]], align 16
255+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <vscale x 16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX]]
256+
; CHECK-NEXT: store <vscale x 16 x i8> [[VECINS]], ptr [[Q]], align 16
257+
; CHECK-NEXT: ret void
258+
;
259+
entry:
260+
%cmp = icmp ult i32 %idx, 4
261+
call void @llvm.assume(i1 %cmp)
262+
%0 = load <vscale x 16 x i8>, ptr %q
263+
%vecins = insertelement <vscale x 16 x i8> %0, i8 %s, i32 %idx
264+
store <vscale x 16 x i8> %vecins, ptr %q
265+
ret void
266+
}
267+
213268
declare void @maythrow() readnone
214269

215270
define void @insert_store_nonconst_index_not_known_valid_by_assume_after_load(ptr %q, i8 zeroext %s, i32 %idx) {
@@ -252,6 +307,27 @@ entry:
252307
ret void
253308
}
254309

310+
; To verify the index is not a constant and may not be valid by assume,
311+
; for scalable vector types.
312+
define void @insert_store_vscale_nonconst_index_not_known_valid_by_assume(ptr %q, i8 zeroext %s, i32 %idx) {
313+
; CHECK-LABEL: @insert_store_vscale_nonconst_index_not_known_valid_by_assume(
314+
; CHECK-NEXT: entry:
315+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IDX:%.*]], 17
316+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
317+
; CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i8>, ptr [[Q:%.*]], align 16
318+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <vscale x 16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX]]
319+
; CHECK-NEXT: store <vscale x 16 x i8> [[VECINS]], ptr [[Q]], align 16
320+
; CHECK-NEXT: ret void
321+
;
322+
entry:
323+
%cmp = icmp ult i32 %idx, 17
324+
call void @llvm.assume(i1 %cmp)
325+
%0 = load <vscale x 16 x i8>, ptr %q
326+
%vecins = insertelement <vscale x 16 x i8> %0, i8 %s, i32 %idx
327+
store <vscale x 16 x i8> %vecins, ptr %q
328+
ret void
329+
}
330+
255331
declare void @llvm.assume(i1)
256332

257333
define void @insert_store_nonconst_index_known_noundef_and_valid_by_and(ptr %q, i8 zeroext %s, i32 noundef %idx) {
@@ -270,6 +346,25 @@ entry:
270346
ret void
271347
}
272348

349+
; To verify the index is not a constant but valid by and,
350+
; for scalable vector types.
351+
define void @insert_store_vscale_nonconst_index_known_noundef_and_valid_by_and(ptr %q, i8 zeroext %s, i32 noundef %idx) {
352+
; CHECK-LABEL: @insert_store_vscale_nonconst_index_known_noundef_and_valid_by_and(
353+
; CHECK-NEXT: entry:
354+
; CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i8>, ptr [[Q:%.*]], align 16
355+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = and i32 [[IDX:%.*]], 7
356+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <vscale x 16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX_CLAMPED]]
357+
; CHECK-NEXT: store <vscale x 16 x i8> [[VECINS]], ptr [[Q]], align 16
358+
; CHECK-NEXT: ret void
359+
;
360+
entry:
361+
%0 = load <vscale x 16 x i8>, ptr %q
362+
%idx.clamped = and i32 %idx, 7
363+
%vecins = insertelement <vscale x 16 x i8> %0, i8 %s, i32 %idx.clamped
364+
store <vscale x 16 x i8> %vecins, ptr %q
365+
ret void
366+
}
367+
273368
define void @insert_store_nonconst_index_base_frozen_and_valid_by_and(ptr %q, i8 zeroext %s, i32 %idx) {
274369
; CHECK-LABEL: @insert_store_nonconst_index_base_frozen_and_valid_by_and(
275370
; CHECK-NEXT: entry:
@@ -310,10 +405,10 @@ entry:
310405
define void @insert_store_nonconst_index_known_valid_by_and_but_may_be_poison(ptr %q, i8 zeroext %s, i32 %idx) {
311406
; CHECK-LABEL: @insert_store_nonconst_index_known_valid_by_and_but_may_be_poison(
312407
; CHECK-NEXT: entry:
313-
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[IDX:%.*]]
314-
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = and i32 [[TMP0]], 7
315-
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <16 x i8>, ptr [[Q:%.*]], i32 0, i32 [[IDX_CLAMPED]]
316-
; CHECK-NEXT: store i8 [[S:%.*]], ptr [[TMP1]], align 1
408+
; CHECK-NEXT: [[IDX_FROZEN:%.*]] = freeze i32 [[IDX:%.*]]
409+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = and i32 [[IDX_FROZEN]], 7
410+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <16 x i8>, ptr [[Q:%.*]], i32 0, i32 [[IDX_CLAMPED]]
411+
; CHECK-NEXT: store i8 [[S:%.*]], ptr [[TMP0]], align 1
317412
; CHECK-NEXT: ret void
318413
;
319414
entry:
@@ -357,6 +452,26 @@ entry:
357452
store <16 x i8> %vecins, ptr %q
358453
ret void
359454
}
455+
456+
; To verify the index is not a constant and may not be valid by and,
457+
; for scalable vector types.
458+
define void @insert_store_vscale_nonconst_index_not_known_valid_by_and(ptr %q, i8 zeroext %s, i32 %idx) {
459+
; CHECK-LABEL: @insert_store_vscale_nonconst_index_not_known_valid_by_and(
460+
; CHECK-NEXT: entry:
461+
; CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i8>, ptr [[Q:%.*]], align 16
462+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = and i32 [[IDX:%.*]], 31
463+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <vscale x 16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX_CLAMPED]]
464+
; CHECK-NEXT: store <vscale x 16 x i8> [[VECINS]], ptr [[Q]], align 16
465+
; CHECK-NEXT: ret void
466+
;
467+
entry:
468+
%0 = load <vscale x 16 x i8>, ptr %q
469+
%idx.clamped = and i32 %idx, 31
470+
%vecins = insertelement <vscale x 16 x i8> %0, i8 %s, i32 %idx.clamped
471+
store <vscale x 16 x i8> %vecins, ptr %q
472+
ret void
473+
}
474+
360475
define void @insert_store_nonconst_index_known_noundef_and_valid_by_urem(ptr %q, i8 zeroext %s, i32 noundef %idx) {
361476
; CHECK-LABEL: @insert_store_nonconst_index_known_noundef_and_valid_by_urem(
362477
; CHECK-NEXT: entry:
@@ -373,6 +488,25 @@ entry:
373488
ret void
374489
}
375490

491+
; To verify the index is not a constant but valid by urem,
492+
; for scalable vector types.
493+
define void @insert_store_vscale_nonconst_index_known_noundef_and_valid_by_urem(ptr %q, i8 zeroext %s, i32 noundef %idx) {
494+
; CHECK-LABEL: @insert_store_vscale_nonconst_index_known_noundef_and_valid_by_urem(
495+
; CHECK-NEXT: entry:
496+
; CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i8>, ptr [[Q:%.*]], align 16
497+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = urem i32 [[IDX:%.*]], 16
498+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <vscale x 16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX_CLAMPED]]
499+
; CHECK-NEXT: store <vscale x 16 x i8> [[VECINS]], ptr [[Q]], align 16
500+
; CHECK-NEXT: ret void
501+
;
502+
entry:
503+
%0 = load <vscale x 16 x i8>, ptr %q
504+
%idx.clamped = urem i32 %idx, 16
505+
%vecins = insertelement <vscale x 16 x i8> %0, i8 %s, i32 %idx.clamped
506+
store <vscale x 16 x i8> %vecins, ptr %q
507+
ret void
508+
}
509+
376510
define void @insert_store_nonconst_index_base_frozen_and_valid_by_urem(ptr %q, i8 zeroext %s, i32 %idx) {
377511
; CHECK-LABEL: @insert_store_nonconst_index_base_frozen_and_valid_by_urem(
378512
; CHECK-NEXT: entry:
@@ -413,10 +547,10 @@ entry:
413547
define void @insert_store_nonconst_index_known_valid_by_urem_but_may_be_poison(ptr %q, i8 zeroext %s, i32 %idx) {
414548
; CHECK-LABEL: @insert_store_nonconst_index_known_valid_by_urem_but_may_be_poison(
415549
; CHECK-NEXT: entry:
416-
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[IDX:%.*]]
417-
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = urem i32 [[TMP0]], 16
418-
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <16 x i8>, ptr [[Q:%.*]], i32 0, i32 [[IDX_CLAMPED]]
419-
; CHECK-NEXT: store i8 [[S:%.*]], ptr [[TMP1]], align 1
550+
; CHECK-NEXT: [[IDX_FROZEN:%.*]] = freeze i32 [[IDX:%.*]]
551+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = urem i32 [[IDX_FROZEN]], 16
552+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <16 x i8>, ptr [[Q:%.*]], i32 0, i32 [[IDX_CLAMPED]]
553+
; CHECK-NEXT: store i8 [[S:%.*]], ptr [[TMP0]], align 1
420554
; CHECK-NEXT: ret void
421555
;
422556
entry:
@@ -444,6 +578,25 @@ entry:
444578
ret void
445579
}
446580

581+
; To verify the index is not a constant and may not be vaild by urem,
582+
; for scalable vector types.
583+
define void @insert_store_vscale_nonconst_index_not_known_valid_by_urem(ptr %q, i8 zeroext %s, i32 %idx) {
584+
; CHECK-LABEL: @insert_store_vscale_nonconst_index_not_known_valid_by_urem(
585+
; CHECK-NEXT: entry:
586+
; CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i8>, ptr [[Q:%.*]], align 16
587+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = urem i32 [[IDX:%.*]], 17
588+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <vscale x 16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX_CLAMPED]]
589+
; CHECK-NEXT: store <vscale x 16 x i8> [[VECINS]], ptr [[Q]], align 16
590+
; CHECK-NEXT: ret void
591+
;
592+
entry:
593+
%0 = load <vscale x 16 x i8>, ptr %q
594+
%idx.clamped = urem i32 %idx, 17
595+
%vecins = insertelement <vscale x 16 x i8> %0, i8 %s, i32 %idx.clamped
596+
store <vscale x 16 x i8> %vecins, ptr %q
597+
ret void
598+
}
599+
447600
define void @insert_store_nonconst_index_known_noundef_not_known_valid_by_urem(ptr %q, i8 zeroext %s, i32 noundef %idx) {
448601
; CHECK-LABEL: @insert_store_nonconst_index_known_noundef_not_known_valid_by_urem(
449602
; CHECK-NEXT: entry:
@@ -665,3 +818,6 @@ bb:
665818

666819
declare i32 @bar(i32, i1) readonly
667820
declare double @llvm.log2.f64(double)
821+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
822+
; BE: {{.*}}
823+
; LE: {{.*}}

0 commit comments

Comments
 (0)