@@ -293,3 +293,183 @@ entry:
293
293
%p2 = getelementptr <vscale x 4 x i32 >, ptr %p1 , i64 %index
294
294
ret ptr %p2
295
295
}
296
+
297
+ define ptr @test_all_nuw (ptr %base , i64 %a ) {
298
+ ; CHECK-LABEL: define ptr @test_all_nuw(
299
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
300
+ ; CHECK-NEXT: entry:
301
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9
302
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]
303
+ ; CHECK-NEXT: ret ptr [[P2]]
304
+ ;
305
+ entry:
306
+ %p1 = getelementptr nuw i8 , ptr %base , i64 1
307
+ %index = add nuw i64 %a , 2
308
+ %p2 = getelementptr nuw i32 , ptr %p1 , i64 %index
309
+ ret ptr %p2
310
+ }
311
+
312
+ define ptr @test_all_partial_nuw1 (ptr %base , i64 %a ) {
313
+ ; CHECK-LABEL: define ptr @test_all_partial_nuw1(
314
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
315
+ ; CHECK-NEXT: entry:
316
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9
317
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
318
+ ; CHECK-NEXT: ret ptr [[P2]]
319
+ ;
320
+ entry:
321
+ %p1 = getelementptr i8 , ptr %base , i64 1
322
+ %index = add nuw i64 %a , 2
323
+ %p2 = getelementptr nuw i32 , ptr %p1 , i64 %index
324
+ ret ptr %p2
325
+ }
326
+
327
+ define ptr @test_all_partial_nuw2 (ptr %base , i64 %a ) {
328
+ ; CHECK-LABEL: define ptr @test_all_partial_nuw2(
329
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
330
+ ; CHECK-NEXT: entry:
331
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9
332
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
333
+ ; CHECK-NEXT: ret ptr [[P2]]
334
+ ;
335
+ entry:
336
+ %p1 = getelementptr nuw i8 , ptr %base , i64 1
337
+ %index = add i64 %a , 2
338
+ %p2 = getelementptr nuw i32 , ptr %p1 , i64 %index
339
+ ret ptr %p2
340
+ }
341
+
342
+ define ptr @test_all_partial_nuw3 (ptr %base , i64 %a ) {
343
+ ; CHECK-LABEL: define ptr @test_all_partial_nuw3(
344
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
345
+ ; CHECK-NEXT: entry:
346
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9
347
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
348
+ ; CHECK-NEXT: ret ptr [[P2]]
349
+ ;
350
+ entry:
351
+ %p1 = getelementptr nuw i8 , ptr %base , i64 1
352
+ %index = add nuw i64 %a , 2
353
+ %p2 = getelementptr i32 , ptr %p1 , i64 %index
354
+ ret ptr %p2
355
+ }
356
+
357
+ define ptr @test_all_nuw_disjoint (ptr %base , i64 %a ) {
358
+ ; CHECK-LABEL: define ptr @test_all_nuw_disjoint(
359
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
360
+ ; CHECK-NEXT: entry:
361
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9
362
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]
363
+ ; CHECK-NEXT: ret ptr [[P2]]
364
+ ;
365
+ entry:
366
+ %p1 = getelementptr nuw i8 , ptr %base , i64 1
367
+ %index = or disjoint i64 %a , 2
368
+ %p2 = getelementptr nuw i32 , ptr %p1 , i64 %index
369
+ ret ptr %p2
370
+ }
371
+
372
+ define ptr @test_all_inbounds_nuw (ptr %base , i64 %a ) {
373
+ ; CHECK-LABEL: define ptr @test_all_inbounds_nuw(
374
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
375
+ ; CHECK-NEXT: entry:
376
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 9
377
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP0]], i64 [[A]]
378
+ ; CHECK-NEXT: ret ptr [[P2]]
379
+ ;
380
+ entry:
381
+ %p1 = getelementptr inbounds nuw i8 , ptr %base , i64 1
382
+ %index = add nuw i64 %a , 2
383
+ %p2 = getelementptr inbounds nuw i32 , ptr %p1 , i64 %index
384
+ ret ptr %p2
385
+ }
386
+
387
+ define ptr @test_all_partial_inbounds1 (ptr %base , i64 %a ) {
388
+ ; CHECK-LABEL: define ptr @test_all_partial_inbounds1(
389
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
390
+ ; CHECK-NEXT: entry:
391
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9
392
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]
393
+ ; CHECK-NEXT: ret ptr [[P2]]
394
+ ;
395
+ entry:
396
+ %p1 = getelementptr nuw i8 , ptr %base , i64 1
397
+ %index = add nuw i64 %a , 2
398
+ %p2 = getelementptr inbounds nuw i32 , ptr %p1 , i64 %index
399
+ ret ptr %p2
400
+ }
401
+
402
+ define ptr @test_all_partial_inbounds2 (ptr %base , i64 %a ) {
403
+ ; CHECK-LABEL: define ptr @test_all_partial_inbounds2(
404
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
405
+ ; CHECK-NEXT: entry:
406
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9
407
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]
408
+ ; CHECK-NEXT: ret ptr [[P2]]
409
+ ;
410
+ entry:
411
+ %p1 = getelementptr inbounds nuw i8 , ptr %base , i64 1
412
+ %index = add nuw i64 %a , 2
413
+ %p2 = getelementptr nuw i32 , ptr %p1 , i64 %index
414
+ ret ptr %p2
415
+ }
416
+
417
+ define ptr @test_all_inbounds_partial_nuw1 (ptr %base , i64 %a ) {
418
+ ; CHECK-LABEL: define ptr @test_all_inbounds_partial_nuw1(
419
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
420
+ ; CHECK-NEXT: entry:
421
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 7
422
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
423
+ ; CHECK-NEXT: ret ptr [[P2]]
424
+ ;
425
+ entry:
426
+ %p1 = getelementptr inbounds i8 , ptr %base , i64 -1
427
+ %index = add nuw i64 %a , 2
428
+ %p2 = getelementptr inbounds nuw i32 , ptr %p1 , i64 %index
429
+ ret ptr %p2
430
+ }
431
+
432
+ define ptr @test_all_inbounds_partial_nuw2 (ptr %base , i64 %a ) {
433
+ ; CHECK-LABEL: define ptr @test_all_inbounds_partial_nuw2(
434
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
435
+ ; CHECK-NEXT: entry:
436
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9
437
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
438
+ ; CHECK-NEXT: ret ptr [[P2]]
439
+ ;
440
+ entry:
441
+ %p1 = getelementptr inbounds nuw i8 , ptr %base , i64 1
442
+ %index = add nuw i64 %a , 2
443
+ %p2 = getelementptr inbounds i32 , ptr %p1 , i64 %index
444
+ ret ptr %p2
445
+ }
446
+
447
+ define ptr @test_all_inbounds_partial_nuw3 (ptr %base , i64 %a ) {
448
+ ; CHECK-LABEL: define ptr @test_all_inbounds_partial_nuw3(
449
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
450
+ ; CHECK-NEXT: entry:
451
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9
452
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
453
+ ; CHECK-NEXT: ret ptr [[P2]]
454
+ ;
455
+ entry:
456
+ %p1 = getelementptr inbounds nuw i8 , ptr %base , i64 1
457
+ %index = add i64 %a , 2
458
+ %p2 = getelementptr inbounds nuw i32 , ptr %p1 , i64 %index
459
+ ret ptr %p2
460
+ }
461
+
462
+ define ptr @test_all_nusw_nuw (ptr %base , i64 %a ) {
463
+ ; CHECK-LABEL: define ptr @test_all_nusw_nuw(
464
+ ; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
465
+ ; CHECK-NEXT: entry:
466
+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9
467
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]
468
+ ; CHECK-NEXT: ret ptr [[P2]]
469
+ ;
470
+ entry:
471
+ %p1 = getelementptr nusw nuw i8 , ptr %base , i64 1
472
+ %index = add nsw nuw i64 %a , 2
473
+ %p2 = getelementptr nusw nuw i32 , ptr %p1 , i64 %index
474
+ ret ptr %p2
475
+ }
0 commit comments