@@ -413,3 +413,291 @@ for.body: ; preds = %for.body, %entry
413
413
for.end: ; preds = %for.body
414
414
ret void
415
415
}
416
+
417
+ define i64 @ivopt_widen_ptr_indvar_1 (ptr noalias %a , i64 %stride , i64 %n ) {
418
+ ; DEFAULT-LABEL: @ivopt_widen_ptr_indvar_1(
419
+ ; DEFAULT-NEXT: entry:
420
+ ; DEFAULT-NEXT: br label [[FOR_BODY:%.*]]
421
+ ; DEFAULT: for.body:
422
+ ; DEFAULT-NEXT: [[INDVAR:%.*]] = phi i64 [ [[INDVAR_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
423
+ ; DEFAULT-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ null, [[ENTRY]] ]
424
+ ; DEFAULT-NEXT: [[ARRAYIDX:%.*]] = getelementptr i64, ptr [[A:%.*]], i64 [[INDVAR]]
425
+ ; DEFAULT-NEXT: [[TMP0:%.*]] = load i64, ptr [[ARRAYIDX]], align 8
426
+ ; DEFAULT-NEXT: [[PTR_IV_NEXT]] = getelementptr i64, ptr [[PTR_IV]], i64 [[STRIDE:%.*]]
427
+ ; DEFAULT-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1
428
+ ; DEFAULT-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVAR]], [[N:%.*]]
429
+ ; DEFAULT-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
430
+ ; DEFAULT: exit:
431
+ ; DEFAULT-NEXT: [[PTR_IV_LCSSA:%.*]] = phi ptr [ [[PTR_IV]], [[FOR_BODY]] ]
432
+ ; DEFAULT-NEXT: [[DOTLCSSA:%.*]] = phi i64 [ [[TMP0]], [[FOR_BODY]] ]
433
+ ; DEFAULT-NEXT: [[CAST_PTR:%.*]] = ptrtoint ptr [[PTR_IV_LCSSA]] to i64
434
+ ; DEFAULT-NEXT: [[RESULT:%.*]] = add i64 [[CAST_PTR]], [[DOTLCSSA]]
435
+ ; DEFAULT-NEXT: ret i64 [[RESULT]]
436
+ ;
437
+ ; STRIDED-LABEL: @ivopt_widen_ptr_indvar_1(
438
+ ; STRIDED-NEXT: entry:
439
+ ; STRIDED-NEXT: [[TMP0:%.*]] = add i64 [[N:%.*]], 1
440
+ ; STRIDED-NEXT: [[TMP1:%.*]] = shl i64 [[STRIDE:%.*]], 3
441
+ ; STRIDED-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP0]], 4
442
+ ; STRIDED-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
443
+ ; STRIDED: vector.ph:
444
+ ; STRIDED-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP0]], 4
445
+ ; STRIDED-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]]
446
+ ; STRIDED-NEXT: [[TMP2:%.*]] = mul i64 [[N_VEC]], [[TMP1]]
447
+ ; STRIDED-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr null, i64 [[TMP2]]
448
+ ; STRIDED-NEXT: br label [[VECTOR_BODY:%.*]]
449
+ ; STRIDED: vector.body:
450
+ ; STRIDED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
451
+ ; STRIDED-NEXT: [[TMP4:%.*]] = getelementptr i64, ptr [[A:%.*]], i64 [[INDEX]]
452
+ ; STRIDED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP4]], align 8
453
+ ; STRIDED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
454
+ ; STRIDED-NEXT: [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
455
+ ; STRIDED-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
456
+ ; STRIDED: middle.block:
457
+ ; STRIDED-NEXT: [[TMP7:%.*]] = extractelement <4 x i64> [[WIDE_LOAD]], i32 3
458
+ ; STRIDED-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]
459
+ ; STRIDED-NEXT: [[TMP8:%.*]] = sub i64 0, [[TMP1]]
460
+ ; STRIDED-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
461
+ ; STRIDED-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
462
+ ; STRIDED: scalar.ph:
463
+ ; STRIDED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
464
+ ; STRIDED-NEXT: [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[TMP3]], [[MIDDLE_BLOCK]] ], [ null, [[ENTRY]] ]
465
+ ; STRIDED-NEXT: br label [[FOR_BODY:%.*]]
466
+ ; STRIDED: for.body:
467
+ ; STRIDED-NEXT: [[INDVAR:%.*]] = phi i64 [ [[INDVAR_NEXT:%.*]], [[FOR_BODY]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
468
+ ; STRIDED-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ]
469
+ ; STRIDED-NEXT: [[ARRAYIDX:%.*]] = getelementptr i64, ptr [[A]], i64 [[INDVAR]]
470
+ ; STRIDED-NEXT: [[TMP9:%.*]] = load i64, ptr [[ARRAYIDX]], align 8
471
+ ; STRIDED-NEXT: [[PTR_IV_NEXT]] = getelementptr i64, ptr [[PTR_IV]], i64 [[STRIDE]]
472
+ ; STRIDED-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1
473
+ ; STRIDED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVAR]], [[N]]
474
+ ; STRIDED-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]
475
+ ; STRIDED: exit:
476
+ ; STRIDED-NEXT: [[PTR_IV_LCSSA:%.*]] = phi ptr [ [[PTR_IV]], [[FOR_BODY]] ], [ [[IND_ESCAPE]], [[MIDDLE_BLOCK]] ]
477
+ ; STRIDED-NEXT: [[DOTLCSSA:%.*]] = phi i64 [ [[TMP9]], [[FOR_BODY]] ], [ [[TMP7]], [[MIDDLE_BLOCK]] ]
478
+ ; STRIDED-NEXT: [[CAST_PTR:%.*]] = ptrtoint ptr [[PTR_IV_LCSSA]] to i64
479
+ ; STRIDED-NEXT: [[RESULT:%.*]] = add i64 [[CAST_PTR]], [[DOTLCSSA]]
480
+ ; STRIDED-NEXT: ret i64 [[RESULT]]
481
+ ;
482
+ entry:
483
+ br label %for.body
484
+
485
+ for.body:
486
+ %indvar = phi i64 [ %indvar.next , %for.body ], [ 0 , %entry ]
487
+ %ptr.iv = phi ptr [ %ptr.iv.next , %for.body ], [ null , %entry ]
488
+ %arrayidx = getelementptr i64 , ptr %a , i64 %indvar
489
+ %0 = load i64 , ptr %arrayidx , align 8
490
+ %ptr.iv.next = getelementptr i64 , ptr %ptr.iv , i64 %stride
491
+ %indvar.next = add i64 %indvar , 1
492
+ %exitcond.not = icmp eq i64 %indvar , %n
493
+ br i1 %exitcond.not , label %exit , label %for.body
494
+
495
+ exit:
496
+ %cast.ptr = ptrtoint ptr %ptr.iv to i64
497
+ %result = add i64 %cast.ptr , %0
498
+ ret i64 %result
499
+ }
500
+
501
+ define i64 @ivopt_widen_ptr_indvar_2 (ptr noalias %a , i64 %stride , i64 %n ) {
502
+ ; DEFAULT-LABEL: @ivopt_widen_ptr_indvar_2(
503
+ ; DEFAULT-NEXT: entry:
504
+ ; DEFAULT-NEXT: br label [[FOR_BODY:%.*]]
505
+ ; DEFAULT: for.body:
506
+ ; DEFAULT-NEXT: [[INDVAR:%.*]] = phi i64 [ [[INDVAR_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
507
+ ; DEFAULT-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ null, [[ENTRY]] ]
508
+ ; DEFAULT-NEXT: [[ARRAYIDX:%.*]] = getelementptr i64, ptr [[A:%.*]], i64 [[INDVAR]]
509
+ ; DEFAULT-NEXT: [[TMP0:%.*]] = load i64, ptr [[ARRAYIDX]], align 8
510
+ ; DEFAULT-NEXT: store i64 [[TMP0]], ptr [[PTR_IV]], align 8
511
+ ; DEFAULT-NEXT: [[PTR_IV_NEXT]] = getelementptr i64, ptr [[PTR_IV]], i64 [[STRIDE:%.*]]
512
+ ; DEFAULT-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1
513
+ ; DEFAULT-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVAR]], [[N:%.*]]
514
+ ; DEFAULT-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
515
+ ; DEFAULT: exit:
516
+ ; DEFAULT-NEXT: [[PTR_IV_LCSSA:%.*]] = phi ptr [ [[PTR_IV]], [[FOR_BODY]] ]
517
+ ; DEFAULT-NEXT: [[DOTLCSSA:%.*]] = phi i64 [ [[TMP0]], [[FOR_BODY]] ]
518
+ ; DEFAULT-NEXT: [[CAST_PTR:%.*]] = ptrtoint ptr [[PTR_IV_LCSSA]] to i64
519
+ ; DEFAULT-NEXT: [[RESULT:%.*]] = add i64 [[CAST_PTR]], [[DOTLCSSA]]
520
+ ; DEFAULT-NEXT: ret i64 [[RESULT]]
521
+ ;
522
+ ; STRIDED-LABEL: @ivopt_widen_ptr_indvar_2(
523
+ ; STRIDED-NEXT: entry:
524
+ ; STRIDED-NEXT: [[TMP0:%.*]] = add i64 [[N:%.*]], 1
525
+ ; STRIDED-NEXT: [[TMP1:%.*]] = shl i64 [[STRIDE:%.*]], 3
526
+ ; STRIDED-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP0]], 4
527
+ ; STRIDED-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
528
+ ; STRIDED: vector.ph:
529
+ ; STRIDED-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP0]], 4
530
+ ; STRIDED-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]]
531
+ ; STRIDED-NEXT: [[TMP2:%.*]] = mul i64 [[N_VEC]], [[TMP1]]
532
+ ; STRIDED-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr null, i64 [[TMP2]]
533
+ ; STRIDED-NEXT: br label [[VECTOR_BODY:%.*]]
534
+ ; STRIDED: vector.body:
535
+ ; STRIDED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
536
+ ; STRIDED-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], [[TMP1]]
537
+ ; STRIDED-NEXT: [[TMP8:%.*]] = mul i64 0, [[TMP1]]
538
+ ; STRIDED-NEXT: [[TMP9:%.*]] = add i64 [[OFFSET_IDX]], [[TMP8]]
539
+ ; STRIDED-NEXT: [[TMP10:%.*]] = mul i64 1, [[TMP1]]
540
+ ; STRIDED-NEXT: [[TMP11:%.*]] = add i64 [[OFFSET_IDX]], [[TMP10]]
541
+ ; STRIDED-NEXT: [[TMP12:%.*]] = mul i64 2, [[TMP1]]
542
+ ; STRIDED-NEXT: [[TMP13:%.*]] = add i64 [[OFFSET_IDX]], [[TMP12]]
543
+ ; STRIDED-NEXT: [[TMP14:%.*]] = mul i64 3, [[TMP1]]
544
+ ; STRIDED-NEXT: [[TMP15:%.*]] = add i64 [[OFFSET_IDX]], [[TMP14]]
545
+ ; STRIDED-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr null, i64 [[TMP9]]
546
+ ; STRIDED-NEXT: [[NEXT_GEP1:%.*]] = getelementptr i8, ptr null, i64 [[TMP11]]
547
+ ; STRIDED-NEXT: [[NEXT_GEP2:%.*]] = getelementptr i8, ptr null, i64 [[TMP13]]
548
+ ; STRIDED-NEXT: [[NEXT_GEP3:%.*]] = getelementptr i8, ptr null, i64 [[TMP15]]
549
+ ; STRIDED-NEXT: [[TMP21:%.*]] = getelementptr i64, ptr [[A:%.*]], i64 [[INDEX]]
550
+ ; STRIDED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP21]], align 8
551
+ ; STRIDED-NEXT: [[TMP23:%.*]] = extractelement <4 x i64> [[WIDE_LOAD]], i32 0
552
+ ; STRIDED-NEXT: store i64 [[TMP23]], ptr [[NEXT_GEP]], align 8
553
+ ; STRIDED-NEXT: [[TMP24:%.*]] = extractelement <4 x i64> [[WIDE_LOAD]], i32 1
554
+ ; STRIDED-NEXT: store i64 [[TMP24]], ptr [[NEXT_GEP1]], align 8
555
+ ; STRIDED-NEXT: [[TMP16:%.*]] = extractelement <4 x i64> [[WIDE_LOAD]], i32 2
556
+ ; STRIDED-NEXT: store i64 [[TMP16]], ptr [[NEXT_GEP2]], align 8
557
+ ; STRIDED-NEXT: [[TMP25:%.*]] = extractelement <4 x i64> [[WIDE_LOAD]], i32 3
558
+ ; STRIDED-NEXT: store i64 [[TMP25]], ptr [[NEXT_GEP3]], align 8
559
+ ; STRIDED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
560
+ ; STRIDED-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
561
+ ; STRIDED-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
562
+ ; STRIDED: middle.block:
563
+ ; STRIDED-NEXT: [[TMP17:%.*]] = extractelement <4 x i64> [[WIDE_LOAD]], i32 3
564
+ ; STRIDED-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]
565
+ ; STRIDED-NEXT: [[TMP19:%.*]] = sub i64 0, [[TMP1]]
566
+ ; STRIDED-NEXT: [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP19]]
567
+ ; STRIDED-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
568
+ ; STRIDED: scalar.ph:
569
+ ; STRIDED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
570
+ ; STRIDED-NEXT: [[BC_RESUME_VAL4:%.*]] = phi ptr [ [[TMP3]], [[MIDDLE_BLOCK]] ], [ null, [[ENTRY]] ]
571
+ ; STRIDED-NEXT: br label [[FOR_BODY:%.*]]
572
+ ; STRIDED: for.body:
573
+ ; STRIDED-NEXT: [[INDVAR:%.*]] = phi i64 [ [[INDVAR_NEXT:%.*]], [[FOR_BODY]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
574
+ ; STRIDED-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[BC_RESUME_VAL4]], [[SCALAR_PH]] ]
575
+ ; STRIDED-NEXT: [[ARRAYIDX:%.*]] = getelementptr i64, ptr [[A]], i64 [[INDVAR]]
576
+ ; STRIDED-NEXT: [[TMP20:%.*]] = load i64, ptr [[ARRAYIDX]], align 8
577
+ ; STRIDED-NEXT: store i64 [[TMP20]], ptr [[PTR_IV]], align 8
578
+ ; STRIDED-NEXT: [[PTR_IV_NEXT]] = getelementptr i64, ptr [[PTR_IV]], i64 [[STRIDE]]
579
+ ; STRIDED-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1
580
+ ; STRIDED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVAR]], [[N]]
581
+ ; STRIDED-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP13:![0-9]+]]
582
+ ; STRIDED: exit:
583
+ ; STRIDED-NEXT: [[PTR_IV_LCSSA:%.*]] = phi ptr [ [[PTR_IV]], [[FOR_BODY]] ], [ [[IND_ESCAPE]], [[MIDDLE_BLOCK]] ]
584
+ ; STRIDED-NEXT: [[DOTLCSSA:%.*]] = phi i64 [ [[TMP20]], [[FOR_BODY]] ], [ [[TMP17]], [[MIDDLE_BLOCK]] ]
585
+ ; STRIDED-NEXT: [[CAST_PTR:%.*]] = ptrtoint ptr [[PTR_IV_LCSSA]] to i64
586
+ ; STRIDED-NEXT: [[RESULT:%.*]] = add i64 [[CAST_PTR]], [[DOTLCSSA]]
587
+ ; STRIDED-NEXT: ret i64 [[RESULT]]
588
+ ;
589
+ entry:
590
+ br label %for.body
591
+
592
+ for.body:
593
+ %indvar = phi i64 [ %indvar.next , %for.body ], [ 0 , %entry ]
594
+ %ptr.iv = phi ptr [ %ptr.iv.next , %for.body ], [ null , %entry ]
595
+ %arrayidx = getelementptr i64 , ptr %a , i64 %indvar
596
+ %0 = load i64 , ptr %arrayidx , align 8
597
+ store i64 %0 , ptr %ptr.iv , align 8
598
+ %ptr.iv.next = getelementptr i64 , ptr %ptr.iv , i64 %stride
599
+ %indvar.next = add i64 %indvar , 1
600
+ %exitcond.not = icmp eq i64 %indvar , %n
601
+ br i1 %exitcond.not , label %exit , label %for.body
602
+
603
+ exit:
604
+ %cast.ptr = ptrtoint ptr %ptr.iv to i64
605
+ %result = add i64 %cast.ptr , %0
606
+ ret i64 %result
607
+ }
608
+
609
+ define i64 @ivopt_widen_ptr_indvar_3 (ptr noalias %a , i64 %stride , i64 %n ) {
610
+ ; DEFAULT-LABEL: @ivopt_widen_ptr_indvar_3(
611
+ ; DEFAULT-NEXT: entry:
612
+ ; DEFAULT-NEXT: br label [[FOR_BODY:%.*]]
613
+ ; DEFAULT: for.body:
614
+ ; DEFAULT-NEXT: [[INDVAR:%.*]] = phi i64 [ [[INDVAR_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
615
+ ; DEFAULT-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ null, [[ENTRY]] ]
616
+ ; DEFAULT-NEXT: [[ARRAYIDX:%.*]] = getelementptr i64, ptr [[A:%.*]], i64 [[INDVAR]]
617
+ ; DEFAULT-NEXT: [[TMP0:%.*]] = load i64, ptr [[ARRAYIDX]], align 8
618
+ ; DEFAULT-NEXT: [[PTR_IV_NEXT]] = getelementptr i64, ptr [[PTR_IV]], i64 [[STRIDE:%.*]]
619
+ ; DEFAULT-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1
620
+ ; DEFAULT-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVAR]], [[N:%.*]]
621
+ ; DEFAULT-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT:%.*]], label [[FOR_BODY]]
622
+ ; DEFAULT: exit:
623
+ ; DEFAULT-NEXT: [[DOTLCSSA:%.*]] = phi i64 [ [[TMP0]], [[FOR_BODY]] ]
624
+ ; DEFAULT-NEXT: [[PTR_IV_NEXT_LCSSA:%.*]] = phi ptr [ [[PTR_IV_NEXT]], [[FOR_BODY]] ]
625
+ ; DEFAULT-NEXT: [[CAST_PTR:%.*]] = ptrtoint ptr [[PTR_IV_NEXT_LCSSA]] to i64
626
+ ; DEFAULT-NEXT: [[RESULT:%.*]] = add i64 [[CAST_PTR]], [[DOTLCSSA]]
627
+ ; DEFAULT-NEXT: ret i64 [[RESULT]]
628
+ ;
629
+ ; STRIDED-LABEL: @ivopt_widen_ptr_indvar_3(
630
+ ; STRIDED-NEXT: entry:
631
+ ; STRIDED-NEXT: [[TMP0:%.*]] = add i64 [[N:%.*]], 1
632
+ ; STRIDED-NEXT: [[TMP1:%.*]] = shl i64 [[STRIDE:%.*]], 3
633
+ ; STRIDED-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP0]], 4
634
+ ; STRIDED-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
635
+ ; STRIDED: vector.ph:
636
+ ; STRIDED-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP0]], 4
637
+ ; STRIDED-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]]
638
+ ; STRIDED-NEXT: [[TMP2:%.*]] = mul i64 [[N_VEC]], [[TMP1]]
639
+ ; STRIDED-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr null, i64 [[TMP2]]
640
+ ; STRIDED-NEXT: br label [[VECTOR_BODY:%.*]]
641
+ ; STRIDED: vector.body:
642
+ ; STRIDED-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
643
+ ; STRIDED-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], [[TMP1]]
644
+ ; STRIDED-NEXT: [[TMP4:%.*]] = mul i64 0, [[TMP1]]
645
+ ; STRIDED-NEXT: [[TMP5:%.*]] = add i64 [[OFFSET_IDX]], [[TMP4]]
646
+ ; STRIDED-NEXT: [[TMP6:%.*]] = mul i64 1, [[TMP1]]
647
+ ; STRIDED-NEXT: [[TMP7:%.*]] = add i64 [[OFFSET_IDX]], [[TMP6]]
648
+ ; STRIDED-NEXT: [[TMP8:%.*]] = mul i64 2, [[TMP1]]
649
+ ; STRIDED-NEXT: [[TMP9:%.*]] = add i64 [[OFFSET_IDX]], [[TMP8]]
650
+ ; STRIDED-NEXT: [[TMP10:%.*]] = mul i64 3, [[TMP1]]
651
+ ; STRIDED-NEXT: [[TMP11:%.*]] = add i64 [[OFFSET_IDX]], [[TMP10]]
652
+ ; STRIDED-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr null, i64 [[TMP5]]
653
+ ; STRIDED-NEXT: [[NEXT_GEP1:%.*]] = getelementptr i8, ptr null, i64 [[TMP7]]
654
+ ; STRIDED-NEXT: [[NEXT_GEP2:%.*]] = getelementptr i8, ptr null, i64 [[TMP9]]
655
+ ; STRIDED-NEXT: [[NEXT_GEP3:%.*]] = getelementptr i8, ptr null, i64 [[TMP11]]
656
+ ; STRIDED-NEXT: [[TMP12:%.*]] = getelementptr i64, ptr [[A:%.*]], i64 [[INDEX]]
657
+ ; STRIDED-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP12]], align 8
658
+ ; STRIDED-NEXT: [[TMP14:%.*]] = getelementptr i64, ptr [[NEXT_GEP3]], i64 [[STRIDE]]
659
+ ; STRIDED-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
660
+ ; STRIDED-NEXT: [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
661
+ ; STRIDED-NEXT: br i1 [[TMP15]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]
662
+ ; STRIDED: middle.block:
663
+ ; STRIDED-NEXT: [[TMP16:%.*]] = extractelement <4 x i64> [[WIDE_LOAD]], i32 3
664
+ ; STRIDED-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]
665
+ ; STRIDED-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
666
+ ; STRIDED: scalar.ph:
667
+ ; STRIDED-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
668
+ ; STRIDED-NEXT: [[BC_RESUME_VAL4:%.*]] = phi ptr [ [[TMP3]], [[MIDDLE_BLOCK]] ], [ null, [[ENTRY]] ]
669
+ ; STRIDED-NEXT: br label [[FOR_BODY:%.*]]
670
+ ; STRIDED: for.body:
671
+ ; STRIDED-NEXT: [[INDVAR:%.*]] = phi i64 [ [[INDVAR_NEXT:%.*]], [[FOR_BODY]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
672
+ ; STRIDED-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[BC_RESUME_VAL4]], [[SCALAR_PH]] ]
673
+ ; STRIDED-NEXT: [[ARRAYIDX:%.*]] = getelementptr i64, ptr [[A]], i64 [[INDVAR]]
674
+ ; STRIDED-NEXT: [[TMP17:%.*]] = load i64, ptr [[ARRAYIDX]], align 8
675
+ ; STRIDED-NEXT: [[PTR_IV_NEXT]] = getelementptr i64, ptr [[PTR_IV]], i64 [[STRIDE]]
676
+ ; STRIDED-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1
677
+ ; STRIDED-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVAR]], [[N]]
678
+ ; STRIDED-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
679
+ ; STRIDED: exit:
680
+ ; STRIDED-NEXT: [[DOTLCSSA:%.*]] = phi i64 [ [[TMP17]], [[FOR_BODY]] ], [ [[TMP16]], [[MIDDLE_BLOCK]] ]
681
+ ; STRIDED-NEXT: [[PTR_IV_NEXT_LCSSA:%.*]] = phi ptr [ [[PTR_IV_NEXT]], [[FOR_BODY]] ], [ [[TMP14]], [[MIDDLE_BLOCK]] ]
682
+ ; STRIDED-NEXT: [[CAST_PTR:%.*]] = ptrtoint ptr [[PTR_IV_NEXT_LCSSA]] to i64
683
+ ; STRIDED-NEXT: [[RESULT:%.*]] = add i64 [[CAST_PTR]], [[DOTLCSSA]]
684
+ ; STRIDED-NEXT: ret i64 [[RESULT]]
685
+ ;
686
+ entry:
687
+ br label %for.body
688
+
689
+ for.body:
690
+ %indvar = phi i64 [ %indvar.next , %for.body ], [ 0 , %entry ]
691
+ %ptr.iv = phi ptr [ %ptr.iv.next , %for.body ], [ null , %entry ]
692
+ %arrayidx = getelementptr i64 , ptr %a , i64 %indvar
693
+ %0 = load i64 , ptr %arrayidx , align 8
694
+ %ptr.iv.next = getelementptr i64 , ptr %ptr.iv , i64 %stride
695
+ %indvar.next = add i64 %indvar , 1
696
+ %exitcond.not = icmp eq i64 %indvar , %n
697
+ br i1 %exitcond.not , label %exit , label %for.body
698
+
699
+ exit:
700
+ %cast.ptr = ptrtoint ptr %ptr.iv.next to i64
701
+ %result = add i64 %cast.ptr , %0
702
+ ret i64 %result
703
+ }
0 commit comments