Skip to content

Commit 6642cc6

Browse files
committed
[SCEV] Add tests for ule/sle exit counts (NFC)
1 parent 71fbbb6 commit 6642cc6

File tree

1 file changed

+228
-0
lines changed

1 file changed

+228
-0
lines changed
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s
3+
4+
define void @ule_from_zero(i32 %M, i32 %N) {
5+
; CHECK-LABEL: 'ule_from_zero'
6+
; CHECK-NEXT: Determining loop execution counts for: @ule_from_zero
7+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
8+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
9+
; CHECK-NEXT: exit count for latch: %N
10+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
11+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %N
12+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
13+
; CHECK-NEXT: symbolic max exit count for latch: %N
14+
;
15+
entry:
16+
br label %loop
17+
18+
loop:
19+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
20+
%cmp1 = icmp ule i32 %iv, %M
21+
br i1 %cmp1, label %latch, label %exit
22+
23+
latch:
24+
%iv.next = add nuw i32 %iv, 1
25+
%exitcond.not = icmp eq i32 %iv, %N
26+
br i1 %exitcond.not, label %exit, label %loop
27+
28+
exit:
29+
ret void
30+
}
31+
32+
define void @ule_from_one(i32 %M, i32 %N) {
33+
; CHECK-LABEL: 'ule_from_one'
34+
; CHECK-NEXT: Determining loop execution counts for: @ule_from_one
35+
; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N))
36+
; CHECK-NEXT: exit count for loop: %M
37+
; CHECK-NEXT: exit count for latch: (-1 + %N)
38+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
39+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N))
40+
; CHECK-NEXT: symbolic max exit count for loop: %M
41+
; CHECK-NEXT: symbolic max exit count for latch: (-1 + %N)
42+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
43+
;
44+
entry:
45+
br label %loop
46+
47+
loop:
48+
%iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ]
49+
%cmp1 = icmp ule i32 %iv, %M
50+
br i1 %cmp1, label %latch, label %exit
51+
52+
latch:
53+
%iv.next = add nuw i32 %iv, 1
54+
%exitcond.not = icmp eq i32 %iv, %N
55+
br i1 %exitcond.not, label %exit, label %loop
56+
57+
exit:
58+
ret void
59+
}
60+
61+
define void @ule_from_unknown(i32 %M, i32 %N, i32 %S) {
62+
; CHECK-LABEL: 'ule_from_unknown'
63+
; CHECK-NEXT: Determining loop execution counts for: @ule_from_unknown
64+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
65+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
66+
; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N)
67+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
68+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %S) + %N)
69+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
70+
; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N)
71+
;
72+
entry:
73+
br label %loop
74+
75+
loop:
76+
%iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]
77+
%cmp1 = icmp ule i32 %iv, %M
78+
br i1 %cmp1, label %latch, label %exit
79+
80+
latch:
81+
%iv.next = add nuw i32 %iv, 1
82+
%exitcond.not = icmp eq i32 %iv, %N
83+
br i1 %exitcond.not, label %exit, label %loop
84+
85+
exit:
86+
ret void
87+
}
88+
89+
define void @ule_from_zero_no_nuw(i32 %M, i32 %N) {
90+
; CHECK-LABEL: 'ule_from_zero_no_nuw'
91+
; CHECK-NEXT: Determining loop execution counts for: @ule_from_zero_no_nuw
92+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
93+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
94+
; CHECK-NEXT: exit count for latch: %N
95+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
96+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %N
97+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
98+
; CHECK-NEXT: symbolic max exit count for latch: %N
99+
;
100+
entry:
101+
br label %loop
102+
103+
loop:
104+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
105+
%cmp1 = icmp ule i32 %iv, %M
106+
br i1 %cmp1, label %latch, label %exit
107+
108+
latch:
109+
%iv.next = add i32 %iv, 1
110+
%exitcond.not = icmp eq i32 %iv, %N
111+
br i1 %exitcond.not, label %exit, label %loop
112+
113+
exit:
114+
ret void
115+
}
116+
117+
define void @sle_from_int_min(i32 %M, i32 %N) {
118+
; CHECK-LABEL: 'sle_from_int_min'
119+
; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min
120+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
121+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
122+
; CHECK-NEXT: exit count for latch: (-2147483648 + %N)
123+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
124+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N)
125+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
126+
; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N)
127+
;
128+
entry:
129+
br label %loop
130+
131+
loop:
132+
%iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
133+
%cmp1 = icmp sle i32 %iv, %M
134+
br i1 %cmp1, label %latch, label %exit
135+
136+
latch:
137+
%iv.next = add nsw i32 %iv, 1
138+
%exitcond.not = icmp eq i32 %iv, %N
139+
br i1 %exitcond.not, label %exit, label %loop
140+
141+
exit:
142+
ret void
143+
}
144+
145+
define void @sle_from_int_min_plus_one(i32 %M, i32 %N) {
146+
; CHECK-LABEL: 'sle_from_int_min_plus_one'
147+
; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_plus_one
148+
; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N))
149+
; CHECK-NEXT: exit count for loop: (-2147483648 + %M)
150+
; CHECK-NEXT: exit count for latch: (2147483647 + %N)
151+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
152+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N))
153+
; CHECK-NEXT: symbolic max exit count for loop: (-2147483648 + %M)
154+
; CHECK-NEXT: symbolic max exit count for latch: (2147483647 + %N)
155+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
156+
;
157+
entry:
158+
br label %loop
159+
160+
loop:
161+
%iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ]
162+
%cmp1 = icmp sle i32 %iv, %M
163+
br i1 %cmp1, label %latch, label %exit
164+
165+
latch:
166+
%iv.next = add nsw i32 %iv, 1
167+
%exitcond.not = icmp eq i32 %iv, %N
168+
br i1 %exitcond.not, label %exit, label %loop
169+
170+
exit:
171+
ret void
172+
}
173+
174+
define void @sle_from_unknown(i32 %M, i32 %N, i32 %S) {
175+
; CHECK-LABEL: 'sle_from_unknown'
176+
; CHECK-NEXT: Determining loop execution counts for: @sle_from_unknown
177+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
178+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
179+
; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N)
180+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
181+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %S) + %N)
182+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
183+
; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N)
184+
;
185+
entry:
186+
br label %loop
187+
188+
loop:
189+
%iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]
190+
%cmp1 = icmp sle i32 %iv, %M
191+
br i1 %cmp1, label %latch, label %exit
192+
193+
latch:
194+
%iv.next = add nsw i32 %iv, 1
195+
%exitcond.not = icmp eq i32 %iv, %N
196+
br i1 %exitcond.not, label %exit, label %loop
197+
198+
exit:
199+
ret void
200+
}
201+
202+
define void @sle_from_int_min_no_nsw(i32 %M, i32 %N) {
203+
; CHECK-LABEL: 'sle_from_int_min_no_nsw'
204+
; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_no_nsw
205+
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
206+
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
207+
; CHECK-NEXT: exit count for latch: (-2147483648 + %N)
208+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1
209+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N)
210+
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
211+
; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N)
212+
;
213+
entry:
214+
br label %loop
215+
216+
loop:
217+
%iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]
218+
%cmp1 = icmp sle i32 %iv, %M
219+
br i1 %cmp1, label %latch, label %exit
220+
221+
latch:
222+
%iv.next = add i32 %iv, 1
223+
%exitcond.not = icmp eq i32 %iv, %N
224+
br i1 %exitcond.not, label %exit, label %loop
225+
226+
exit:
227+
ret void
228+
}

0 commit comments

Comments
 (0)