@@ -270,6 +270,43 @@ entry:
270
270
ret void
271
271
}
272
272
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
+
273
310
define void @insert_store_nonconst_index_known_valid_by_and_but_may_be_poison (<16 x i8 >* %q , i8 zeroext %s , i32 %idx ) {
274
311
; CHECK-LABEL: @insert_store_nonconst_index_known_valid_by_and_but_may_be_poison(
275
312
; CHECK-NEXT: entry:
@@ -303,6 +340,22 @@ entry:
303
340
ret void
304
341
}
305
342
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
+ }
306
359
define void @insert_store_nonconst_index_known_noundef_and_valid_by_urem (<16 x i8 >* %q , i8 zeroext %s , i32 noundef %idx ) {
307
360
; CHECK-LABEL: @insert_store_nonconst_index_known_noundef_and_valid_by_urem(
308
361
; CHECK-NEXT: entry:
@@ -319,6 +372,43 @@ entry:
319
372
ret void
320
373
}
321
374
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
+
322
412
define void @insert_store_nonconst_index_known_valid_by_urem_but_may_be_poison (<16 x i8 >* %q , i8 zeroext %s , i32 %idx ) {
323
413
; CHECK-LABEL: @insert_store_nonconst_index_known_valid_by_urem_but_may_be_poison(
324
414
; CHECK-NEXT: entry:
@@ -352,6 +442,23 @@ entry:
352
442
ret void
353
443
}
354
444
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
+
355
462
define void @insert_store_ptr_strip (<16 x i8 >* %q , i8 zeroext %s ) {
356
463
; CHECK-LABEL: @insert_store_ptr_strip(
357
464
; CHECK-NEXT: entry:
0 commit comments