Skip to content

Commit 0731f18

Browse files
committed
[SCEV] Add extra test coverage with URem & AddRec guards.
Add test with urem guard with non-constant divisor and AddRec guards. Extra test coverage for llvm#163021
1 parent 907335c commit 0731f18

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

llvm/test/Analysis/ScalarEvolution/backedge-taken-count-guard-info.ll

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,56 @@ exit:
104104
}
105105

106106
declare void @clobber()
107+
108+
109+
declare void @clobber.i32(i32)
110+
111+
define void @test_guards_across_loops(i32 %N) {
112+
; CHECK-LABEL: 'test_guards_across_loops'
113+
; CHECK-NEXT: Classifying expressions for: @test_guards_across_loops
114+
; CHECK-NEXT: %iv.1 = phi i32 [ 0, %entry ], [ %iv.1.next, %loop.1 ]
115+
; CHECK-NEXT: --> {0,+,1}<%loop.1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.1: Computable }
116+
; CHECK-NEXT: %iv.1.next = add i32 %iv.1, 1
117+
; CHECK-NEXT: --> {1,+,1}<%loop.1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.1: Computable }
118+
; CHECK-NEXT: %iv.2 = phi i32 [ 0, %loop.1 ], [ %iv.2.next, %loop.2 ]
119+
; CHECK-NEXT: --> {0,+,1}<nuw><%loop.2> U: full-set S: full-set Exits: (1 + %N) LoopDispositions: { %loop.2: Computable }
120+
; CHECK-NEXT: %iv.2.next = add i32 %iv.2, 1
121+
; CHECK-NEXT: --> {1,+,1}<nw><%loop.2> U: full-set S: full-set Exits: (2 + %N) LoopDispositions: { %loop.2: Computable }
122+
; CHECK-NEXT: Determining loop execution counts for: @test_guards_across_loops
123+
; CHECK-NEXT: Loop %loop.2: backedge-taken count is (1 + (zext i32 %N to i64))<nuw><nsw>
124+
; CHECK-NEXT: Loop %loop.2: constant max backedge-taken count is i64 4294967296
125+
; CHECK-NEXT: Loop %loop.2: symbolic max backedge-taken count is (1 + (zext i32 %N to i64))<nuw><nsw>
126+
; CHECK-NEXT: Loop %loop.2: Trip multiple is 1
127+
; CHECK-NEXT: Loop %loop.1: Unpredictable backedge-taken count.
128+
; CHECK-NEXT: Loop %loop.1: Unpredictable constant max backedge-taken count.
129+
; CHECK-NEXT: Loop %loop.1: Unpredictable symbolic max backedge-taken count.
130+
; CHECK-NEXT: Loop %loop.1: Predicated backedge-taken count is (1 + (zext i32 %N to i64))<nuw><nsw>
131+
; CHECK-NEXT: Predicates:
132+
; CHECK-NEXT: {0,+,1}<%loop.1> Added Flags: <nusw>
133+
; CHECK-NEXT: Loop %loop.1: Predicated constant max backedge-taken count is i64 4294967296
134+
; CHECK-NEXT: Predicates:
135+
; CHECK-NEXT: {0,+,1}<%loop.1> Added Flags: <nusw>
136+
; CHECK-NEXT: Loop %loop.1: Predicated symbolic max backedge-taken count is (1 + (zext i32 %N to i64))<nuw><nsw>
137+
; CHECK-NEXT: Predicates:
138+
; CHECK-NEXT: {0,+,1}<%loop.1> Added Flags: <nusw>
139+
;
140+
entry:
141+
br label %loop.1
142+
143+
loop.1:
144+
%iv.1 = phi i32 [ 0, %entry ], [ %iv.1.next, %loop.1 ]
145+
call void @clobber.i32(i32 %iv.1)
146+
%ec.1 = icmp ugt i32 %iv.1, %N
147+
%iv.1.next = add i32 %iv.1, 1
148+
br i1 %ec.1, label %loop.2, label %loop.1
149+
150+
loop.2:
151+
%iv.2 = phi i32 [ 0, %loop.1 ], [ %iv.2.next, %loop.2 ]
152+
call void @clobber.i32(i32 %iv.2)
153+
%ec.2 = icmp ugt i32 %iv.2, %N
154+
%iv.2.next = add i32 %iv.2, 1
155+
br i1 %ec.2, label %exit, label %loop.2
156+
157+
exit:
158+
ret void
159+
}

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,5 +717,46 @@ exit:
717717
ret void
718718
}
719719

720+
define void @test_urem_non_constant(ptr %dst, i32 %a, i32 %b) {
721+
; CHECK-LABEL: 'test_urem_non_constant'
722+
; CHECK-NEXT: Classifying expressions for: @test_urem_non_constant
723+
; CHECK-NEXT: %rem = urem i32 %a, %b
724+
; CHECK-NEXT: --> ((-1 * (%a /u %b) * %b) + %a) U: full-set S: full-set
725+
; CHECK-NEXT: %and.0 = and i1 %pre.0, %pre.1
726+
; CHECK-NEXT: --> (%pre.1 umin %pre.0) U: full-set S: full-set
727+
; CHECK-NEXT: %and.1 = and i1 %and.0, %pre.2
728+
; CHECK-NEXT: --> (%pre.1 umin %pre.2 umin %pre.0) U: full-set S: full-set
729+
; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
730+
; CHECK-NEXT: --> {0,+,%b}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
731+
; CHECK-NEXT: %gep.dst = getelementptr inbounds i8, ptr %dst, i32 %b
732+
; CHECK-NEXT: --> ((sext i32 %b to i64) + %dst) U: full-set S: full-set Exits: ((sext i32 %b to i64) + %dst) LoopDispositions: { %loop: Invariant }
733+
; CHECK-NEXT: %iv.next = add i32 %iv, %b
734+
; CHECK-NEXT: --> {%b,+,%b}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
735+
; CHECK-NEXT: Determining loop execution counts for: @test_urem_non_constant
736+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
737+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
738+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
739+
;
740+
entry:
741+
%rem = urem i32 %a, %b
742+
%pre.0 = icmp eq i32 %rem, 0
743+
%pre.1 = icmp ne i32 %a, 0
744+
%pre.2 = icmp ne i32 %b, 0
745+
%and.0 = and i1 %pre.0, %pre.1
746+
%and.1 = and i1 %and.0, %pre.2
747+
br i1 %and.1, label %loop, label %exit
748+
749+
loop:
750+
%iv = phi i32 [ 0, %entry], [ %iv.next, %loop ]
751+
%gep.dst = getelementptr inbounds i8, ptr %dst, i32 %b
752+
store i8 0, ptr %gep.dst
753+
%iv.next = add i32 %iv, %b
754+
%ec = icmp ne i32 %iv.next, %a
755+
br i1 %ec, label %loop, label %exit
756+
757+
exit:
758+
ret void
759+
}
760+
720761
declare void @llvm.assume(i1)
721762
declare void @llvm.experimental.guard(i1, ...)

0 commit comments

Comments
 (0)