@@ -574,5 +574,164 @@ exit:
574574 ret void
575575}
576576
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+
577736declare void @llvm.assume (i1 )
578737declare void @llvm.experimental.guard (i1 , ...)
0 commit comments