1
1
; 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
4
4
5
5
define void @insert_store (ptr %q , i8 zeroext %s ) {
6
6
; CHECK-LABEL: @insert_store(
@@ -61,6 +61,23 @@ entry:
61
61
ret void
62
62
}
63
63
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
+
64
81
define void @insert_store_v9i4 (ptr %q , i4 zeroext %s ) {
65
82
; CHECK-LABEL: @insert_store_v9i4(
66
83
; CHECK-NEXT: entry:
@@ -125,6 +142,23 @@ entry:
125
142
ret void
126
143
}
127
144
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
+
128
162
; To verify align here is narrowed to scalar store size
129
163
define void @insert_store_nonconst_large_alignment (ptr %q , i32 zeroext %s , i32 %idx ) {
130
164
; CHECK-LABEL: @insert_store_nonconst_large_alignment(
@@ -210,6 +244,27 @@ entry:
210
244
ret void
211
245
}
212
246
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
+
213
268
declare void @maythrow () readnone
214
269
215
270
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:
252
307
ret void
253
308
}
254
309
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
+
255
331
declare void @llvm.assume (i1 )
256
332
257
333
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:
270
346
ret void
271
347
}
272
348
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
+
273
368
define void @insert_store_nonconst_index_base_frozen_and_valid_by_and (ptr %q , i8 zeroext %s , i32 %idx ) {
274
369
; CHECK-LABEL: @insert_store_nonconst_index_base_frozen_and_valid_by_and(
275
370
; CHECK-NEXT: entry:
@@ -310,10 +405,10 @@ entry:
310
405
define void @insert_store_nonconst_index_known_valid_by_and_but_may_be_poison (ptr %q , i8 zeroext %s , i32 %idx ) {
311
406
; CHECK-LABEL: @insert_store_nonconst_index_known_valid_by_and_but_may_be_poison(
312
407
; 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
317
412
; CHECK-NEXT: ret void
318
413
;
319
414
entry:
@@ -357,6 +452,26 @@ entry:
357
452
store <16 x i8 > %vecins , ptr %q
358
453
ret void
359
454
}
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
+
360
475
define void @insert_store_nonconst_index_known_noundef_and_valid_by_urem (ptr %q , i8 zeroext %s , i32 noundef %idx ) {
361
476
; CHECK-LABEL: @insert_store_nonconst_index_known_noundef_and_valid_by_urem(
362
477
; CHECK-NEXT: entry:
@@ -373,6 +488,25 @@ entry:
373
488
ret void
374
489
}
375
490
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
+
376
510
define void @insert_store_nonconst_index_base_frozen_and_valid_by_urem (ptr %q , i8 zeroext %s , i32 %idx ) {
377
511
; CHECK-LABEL: @insert_store_nonconst_index_base_frozen_and_valid_by_urem(
378
512
; CHECK-NEXT: entry:
@@ -413,10 +547,10 @@ entry:
413
547
define void @insert_store_nonconst_index_known_valid_by_urem_but_may_be_poison (ptr %q , i8 zeroext %s , i32 %idx ) {
414
548
; CHECK-LABEL: @insert_store_nonconst_index_known_valid_by_urem_but_may_be_poison(
415
549
; 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
420
554
; CHECK-NEXT: ret void
421
555
;
422
556
entry:
@@ -444,6 +578,25 @@ entry:
444
578
ret void
445
579
}
446
580
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
+
447
600
define void @insert_store_nonconst_index_known_noundef_not_known_valid_by_urem (ptr %q , i8 zeroext %s , i32 noundef %idx ) {
448
601
; CHECK-LABEL: @insert_store_nonconst_index_known_noundef_not_known_valid_by_urem(
449
602
; CHECK-NEXT: entry:
665
818
666
819
declare i32 @bar (i32 , i1 ) readonly
667
820
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