Skip to content

Commit f1ea1af

Browse files
committed
[VectorCombine] Add additional tests with freeze combinations.
Suggested in D107364. (cherry-picked from 8d2a8ce)
1 parent a365830 commit f1ea1af

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

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

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,43 @@ entry:
270270
ret void
271271
}
272272

273+
define void @insert_store_nonconst_index_base_frozen_and_valid_by_and(<16 x i8>* %q, i8 zeroext %s, i32 %idx) {
274+
; CHECK-LABEL: @insert_store_nonconst_index_base_frozen_and_valid_by_and(
275+
; CHECK-NEXT: entry:
276+
; CHECK-NEXT: [[IDX_FROZEN:%.*]] = freeze i32 [[IDX:%.*]]
277+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = and i32 [[IDX_FROZEN]], 7
278+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <16 x i8>, <16 x i8>* [[Q:%.*]], i32 0, i32 [[IDX_CLAMPED]]
279+
; CHECK-NEXT: store i8 [[S:%.*]], i8* [[TMP0]], align 1
280+
; CHECK-NEXT: ret void
281+
;
282+
entry:
283+
%0 = load <16 x i8>, <16 x i8>* %q
284+
%idx.frozen = freeze i32 %idx
285+
%idx.clamped = and i32 %idx.frozen, 7
286+
%vecins = insertelement <16 x i8> %0, i8 %s, i32 %idx.clamped
287+
store <16 x i8> %vecins, <16 x i8>* %q
288+
ret void
289+
}
290+
291+
define void @insert_store_nonconst_index_frozen_and_valid_by_and(<16 x i8>* %q, i8 zeroext %s, i32 %idx) {
292+
; CHECK-LABEL: @insert_store_nonconst_index_frozen_and_valid_by_and(
293+
; CHECK-NEXT: entry:
294+
; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, <16 x i8>* [[Q:%.*]], align 16
295+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = and i32 [[IDX:%.*]], 7
296+
; CHECK-NEXT: [[IDX_CLAMPED_FROZEN:%.*]] = freeze i32 [[IDX_CLAMPED]]
297+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX_CLAMPED_FROZEN]]
298+
; CHECK-NEXT: store <16 x i8> [[VECINS]], <16 x i8>* [[Q]], align 16
299+
; CHECK-NEXT: ret void
300+
;
301+
entry:
302+
%0 = load <16 x i8>, <16 x i8>* %q
303+
%idx.clamped = and i32 %idx, 7
304+
%idx.clamped.frozen = freeze i32 %idx.clamped
305+
%vecins = insertelement <16 x i8> %0, i8 %s, i32 %idx.clamped.frozen
306+
store <16 x i8> %vecins, <16 x i8>* %q
307+
ret void
308+
}
309+
273310
define void @insert_store_nonconst_index_known_valid_by_and_but_may_be_poison(<16 x i8>* %q, i8 zeroext %s, i32 %idx) {
274311
; CHECK-LABEL: @insert_store_nonconst_index_known_valid_by_and_but_may_be_poison(
275312
; CHECK-NEXT: entry:
@@ -303,6 +340,22 @@ entry:
303340
ret void
304341
}
305342

343+
define void @insert_store_nonconst_index_known_noundef_not_known_valid_by_and(<16 x i8>* %q, i8 zeroext %s, i32 noundef %idx) {
344+
; CHECK-LABEL: @insert_store_nonconst_index_known_noundef_not_known_valid_by_and(
345+
; CHECK-NEXT: entry:
346+
; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, <16 x i8>* [[Q:%.*]], align 16
347+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = and i32 [[IDX:%.*]], 16
348+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX_CLAMPED]]
349+
; CHECK-NEXT: store <16 x i8> [[VECINS]], <16 x i8>* [[Q]], align 16
350+
; CHECK-NEXT: ret void
351+
;
352+
entry:
353+
%0 = load <16 x i8>, <16 x i8>* %q
354+
%idx.clamped = and i32 %idx, 16
355+
%vecins = insertelement <16 x i8> %0, i8 %s, i32 %idx.clamped
356+
store <16 x i8> %vecins, <16 x i8>* %q
357+
ret void
358+
}
306359
define void @insert_store_nonconst_index_known_noundef_and_valid_by_urem(<16 x i8>* %q, i8 zeroext %s, i32 noundef %idx) {
307360
; CHECK-LABEL: @insert_store_nonconst_index_known_noundef_and_valid_by_urem(
308361
; CHECK-NEXT: entry:
@@ -319,6 +372,43 @@ entry:
319372
ret void
320373
}
321374

375+
define void @insert_store_nonconst_index_base_frozen_and_valid_by_urem(<16 x i8>* %q, i8 zeroext %s, i32 %idx) {
376+
; CHECK-LABEL: @insert_store_nonconst_index_base_frozen_and_valid_by_urem(
377+
; CHECK-NEXT: entry:
378+
; CHECK-NEXT: [[IDX_FROZEN:%.*]] = freeze i32 [[IDX:%.*]]
379+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = urem i32 [[IDX_FROZEN]], 16
380+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <16 x i8>, <16 x i8>* [[Q:%.*]], i32 0, i32 [[IDX_CLAMPED]]
381+
; CHECK-NEXT: store i8 [[S:%.*]], i8* [[TMP0]], align 1
382+
; CHECK-NEXT: ret void
383+
;
384+
entry:
385+
%0 = load <16 x i8>, <16 x i8>* %q
386+
%idx.frozen = freeze i32 %idx
387+
%idx.clamped = urem i32 %idx.frozen, 16
388+
%vecins = insertelement <16 x i8> %0, i8 %s, i32 %idx.clamped
389+
store <16 x i8> %vecins, <16 x i8>* %q
390+
ret void
391+
}
392+
393+
define void @insert_store_nonconst_index_frozen_and_valid_by_urem(<16 x i8>* %q, i8 zeroext %s, i32 %idx) {
394+
; CHECK-LABEL: @insert_store_nonconst_index_frozen_and_valid_by_urem(
395+
; CHECK-NEXT: entry:
396+
; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, <16 x i8>* [[Q:%.*]], align 16
397+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = urem i32 [[IDX:%.*]], 16
398+
; CHECK-NEXT: [[IDX_CLAMPED_FROZEN:%.*]] = freeze i32 [[IDX_CLAMPED]]
399+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX_CLAMPED_FROZEN]]
400+
; CHECK-NEXT: store <16 x i8> [[VECINS]], <16 x i8>* [[Q]], align 16
401+
; CHECK-NEXT: ret void
402+
;
403+
entry:
404+
%0 = load <16 x i8>, <16 x i8>* %q
405+
%idx.clamped = urem i32 %idx, 16
406+
%idx.clamped.frozen = freeze i32 %idx.clamped
407+
%vecins = insertelement <16 x i8> %0, i8 %s, i32 %idx.clamped.frozen
408+
store <16 x i8> %vecins, <16 x i8>* %q
409+
ret void
410+
}
411+
322412
define void @insert_store_nonconst_index_known_valid_by_urem_but_may_be_poison(<16 x i8>* %q, i8 zeroext %s, i32 %idx) {
323413
; CHECK-LABEL: @insert_store_nonconst_index_known_valid_by_urem_but_may_be_poison(
324414
; CHECK-NEXT: entry:
@@ -352,6 +442,23 @@ entry:
352442
ret void
353443
}
354444

445+
define void @insert_store_nonconst_index_known_noundef_not_known_valid_by_urem(<16 x i8>* %q, i8 zeroext %s, i32 noundef %idx) {
446+
; CHECK-LABEL: @insert_store_nonconst_index_known_noundef_not_known_valid_by_urem(
447+
; CHECK-NEXT: entry:
448+
; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, <16 x i8>* [[Q:%.*]], align 16
449+
; CHECK-NEXT: [[IDX_CLAMPED:%.*]] = urem i32 [[IDX:%.*]], 17
450+
; CHECK-NEXT: [[VECINS:%.*]] = insertelement <16 x i8> [[TMP0]], i8 [[S:%.*]], i32 [[IDX_CLAMPED]]
451+
; CHECK-NEXT: store <16 x i8> [[VECINS]], <16 x i8>* [[Q]], align 16
452+
; CHECK-NEXT: ret void
453+
;
454+
entry:
455+
%0 = load <16 x i8>, <16 x i8>* %q
456+
%idx.clamped = urem i32 %idx, 17
457+
%vecins = insertelement <16 x i8> %0, i8 %s, i32 %idx.clamped
458+
store <16 x i8> %vecins, <16 x i8>* %q
459+
ret void
460+
}
461+
355462
define void @insert_store_ptr_strip(<16 x i8>* %q, i8 zeroext %s) {
356463
; CHECK-LABEL: @insert_store_ptr_strip(
357464
; CHECK-NEXT: entry:

0 commit comments

Comments
 (0)