@@ -574,5 +574,164 @@ exit:
574
574
ret void
575
575
}
576
576
577
+ define void @test_ptr_aligned_by_2_and_4_via_assumption (ptr %start , ptr %end ) {
578
+ ; CHECK-LABEL: 'test_ptr_aligned_by_2_and_4_via_assumption'
579
+ ; CHECK-NEXT: Classifying expressions for: @test_ptr_aligned_by_2_and_4_via_assumption
580
+ ; CHECK-NEXT: %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]
581
+ ; CHECK-NEXT: --> {%start,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
582
+ ; CHECK-NEXT: %iv.next = getelementptr i8, ptr %iv, i64 4
583
+ ; CHECK-NEXT: --> {(4 + %start),+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
584
+ ; CHECK-NEXT: Determining loop execution counts for: @test_ptr_aligned_by_2_and_4_via_assumption
585
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
586
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
587
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
588
+ ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
589
+ ; CHECK-NEXT: Predicates:
590
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
591
+ ; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903
592
+ ; CHECK-NEXT: Predicates:
593
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
594
+ ; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
595
+ ; CHECK-NEXT: Predicates:
596
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
597
+ ;
598
+ entry:
599
+ call void @llvm.assume (i1 true ) [ "align" (ptr %start , i64 2 ) ]
600
+ call void @llvm.assume (i1 true ) [ "align" (ptr %end , i64 4 ) ]
601
+ br label %loop
602
+
603
+ loop:
604
+ %iv = phi ptr [ %start , %entry ], [ %iv.next , %loop ]
605
+ store ptr %iv , ptr %iv
606
+ %iv.next = getelementptr i8 , ptr %iv , i64 4
607
+ %ec = icmp ne ptr %iv.next , %end
608
+ br i1 %ec , label %loop , label %exit
609
+
610
+ exit:
611
+ ret void
612
+ }
613
+
614
+ define void @test_ptrs_aligned_by_4_via_assumption (ptr %start , ptr %end ) {
615
+ ; CHECK-LABEL: 'test_ptrs_aligned_by_4_via_assumption'
616
+ ; CHECK-NEXT: Classifying expressions for: @test_ptrs_aligned_by_4_via_assumption
617
+ ; CHECK-NEXT: %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]
618
+ ; CHECK-NEXT: --> {%start,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
619
+ ; CHECK-NEXT: %iv.next = getelementptr i8, ptr %iv, i64 4
620
+ ; CHECK-NEXT: --> {(4 + %start),+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
621
+ ; CHECK-NEXT: Determining loop execution counts for: @test_ptrs_aligned_by_4_via_assumption
622
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
623
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
624
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
625
+ ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
626
+ ; CHECK-NEXT: Predicates:
627
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
628
+ ; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903
629
+ ; CHECK-NEXT: Predicates:
630
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
631
+ ; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
632
+ ; CHECK-NEXT: Predicates:
633
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
634
+ ;
635
+ entry:
636
+ call void @llvm.assume (i1 true ) [ "align" (ptr %start , i64 4 ) ]
637
+ call void @llvm.assume (i1 true ) [ "align" (ptr %end , i64 4 ) ]
638
+ br label %loop
639
+
640
+ loop:
641
+ %iv = phi ptr [ %start , %entry ], [ %iv.next , %loop ]
642
+ store ptr %iv , ptr %iv
643
+ %iv.next = getelementptr i8 , ptr %iv , i64 4
644
+ %ec = icmp ne ptr %iv.next , %end
645
+ br i1 %ec , label %loop , label %exit
646
+
647
+ exit:
648
+ ret void
649
+ }
650
+
651
+ define void @test_ptrs_aligned_by_8_via_assumption (ptr %start , ptr %end ) {
652
+ ; CHECK-LABEL: 'test_ptrs_aligned_by_8_via_assumption'
653
+ ; CHECK-NEXT: Classifying expressions for: @test_ptrs_aligned_by_8_via_assumption
654
+ ; CHECK-NEXT: %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]
655
+ ; CHECK-NEXT: --> {%start,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
656
+ ; CHECK-NEXT: %iv.next = getelementptr i8, ptr %iv, i64 4
657
+ ; CHECK-NEXT: --> {(4 + %start),+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
658
+ ; CHECK-NEXT: Determining loop execution counts for: @test_ptrs_aligned_by_8_via_assumption
659
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
660
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
661
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
662
+ ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
663
+ ; CHECK-NEXT: Predicates:
664
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
665
+ ; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903
666
+ ; CHECK-NEXT: Predicates:
667
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
668
+ ; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
669
+ ; CHECK-NEXT: Predicates:
670
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
671
+ ;
672
+ entry:
673
+ call void @llvm.assume (i1 true ) [ "align" (ptr %start , i64 8 ) ]
674
+ call void @llvm.assume (i1 true ) [ "align" (ptr %end , i64 8 ) ]
675
+ br label %loop
676
+
677
+ loop:
678
+ %iv = phi ptr [ %start , %entry ], [ %iv.next , %loop ]
679
+ store ptr %iv , ptr %iv
680
+ %iv.next = getelementptr i8 , ptr %iv , i64 4
681
+ %ec = icmp ne ptr %iv.next , %end
682
+ br i1 %ec , label %loop , label %exit
683
+
684
+ exit:
685
+ ret void
686
+ }
687
+
688
+ declare i1 @cond ()
689
+
690
+ define void @test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors (ptr %start , ptr %end ) {
691
+ ; CHECK-LABEL: 'test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors'
692
+ ; CHECK-NEXT: Classifying expressions for: @test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors
693
+ ; CHECK-NEXT: %c = call i1 @cond()
694
+ ; CHECK-NEXT: --> %c U: full-set S: full-set
695
+ ; CHECK-NEXT: %iv = phi ptr [ %start, %then ], [ %start, %else ], [ %iv.next, %loop ]
696
+ ; CHECK-NEXT: --> {%start,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
697
+ ; CHECK-NEXT: %iv.next = getelementptr i8, ptr %iv, i64 4
698
+ ; CHECK-NEXT: --> {(4 + %start),+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
699
+ ; CHECK-NEXT: Determining loop execution counts for: @test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors
700
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
701
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
702
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
703
+ ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
704
+ ; CHECK-NEXT: Predicates:
705
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
706
+ ; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903
707
+ ; CHECK-NEXT: Predicates:
708
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
709
+ ; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)
710
+ ; CHECK-NEXT: Predicates:
711
+ ; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %end to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2))) to i64) == 0
712
+ ;
713
+ entry:
714
+ call void @llvm.assume (i1 true ) [ "align" (ptr %start , i64 2 ) ]
715
+ call void @llvm.assume (i1 true ) [ "align" (ptr %end , i64 4 ) ]
716
+ %c = call i1 @cond ()
717
+ br i1 %c , label %then , label %else
718
+
719
+ then:
720
+ br label %loop
721
+
722
+ else:
723
+ br label %loop
724
+
725
+ loop:
726
+ %iv = phi ptr [ %start , %then ] , [ %start , %else ], [ %iv.next , %loop ]
727
+ store ptr %iv , ptr %iv
728
+ %iv.next = getelementptr i8 , ptr %iv , i64 4
729
+ %ec = icmp ne ptr %iv.next , %end
730
+ br i1 %ec , label %loop , label %exit
731
+
732
+ exit:
733
+ ret void
734
+ }
735
+
577
736
declare void @llvm.assume (i1 )
578
737
declare void @llvm.experimental.guard (i1 , ...)
0 commit comments