Skip to content

Commit 9be276e

Browse files
committed
[SCEV] Add tests for computing trip counts with align assumptions.
1 parent 83ef38a commit 9be276e

File tree

1 file changed

+159
-0
lines changed

1 file changed

+159
-0
lines changed

llvm/test/Analysis/ScalarEvolution/trip-multiple-guard-info.ll

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
577736
declare void @llvm.assume(i1)
578737
declare void @llvm.experimental.guard(i1, ...)

0 commit comments

Comments
 (0)