Skip to content

Commit c66cedb

Browse files
committed
[SCEV] Add SCEV analysis tests with congruent IVs.
This patch adds a set of tests taken from/llvm/test/Transforms/IndVarSimplify/iv-poison.ll with multiple congruent IVs but different set of flags on the increments. Extra tests for #80430.
1 parent b8025d1 commit c66cedb

File tree

1 file changed

+399
-0
lines changed

1 file changed

+399
-0
lines changed
Lines changed: 399 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,399 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt "-passes=print<scalar-evolution>" -disable-output -S %s 2>&1 | FileCheck %s
3+
4+
; PR59777
5+
define i2 @iv_nsw_poison(i2 %arg) {
6+
; CHECK-LABEL: 'iv_nsw_poison'
7+
; CHECK-NEXT: Classifying expressions for: @iv_nsw_poison
8+
; CHECK-NEXT: %.07 = phi i2 [ 1, %bb ], [ %i, %bb1 ]
9+
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%bb1> U: [1,-2) S: [1,-2) Exits: <<Unknown>> LoopDispositions: { %bb1: Computable }
10+
; CHECK-NEXT: %.0 = phi i2 [ 1, %bb ], [ %i2, %bb1 ]
11+
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%bb1> U: [1,-2) S: [1,-2) Exits: <<Unknown>> LoopDispositions: { %bb1: Computable }
12+
; CHECK-NEXT: %i = add nsw i2 %.07, 1
13+
; CHECK-NEXT: --> {-2,+,1}<nuw><%bb1> U: [-2,0) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %bb1: Computable }
14+
; CHECK-NEXT: %i2 = add i2 %.0, 1
15+
; CHECK-NEXT: --> {-2,+,1}<nuw><%bb1> U: [-2,0) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %bb1: Computable }
16+
; CHECK-NEXT: Determining loop execution counts for: @iv_nsw_poison
17+
; CHECK-NEXT: Loop %bb1: Unpredictable backedge-taken count.
18+
; CHECK-NEXT: Loop %bb1: Unpredictable constant max backedge-taken count.
19+
; CHECK-NEXT: Loop %bb1: Unpredictable symbolic max backedge-taken count.
20+
; CHECK-NEXT: Loop %bb1: Unpredictable predicated backedge-taken count.
21+
;
22+
bb:
23+
br label %bb1
24+
25+
bb1: ; preds = %bb1, %bb
26+
%.07 = phi i2 [ 1, %bb ], [ %i, %bb1 ]
27+
%.0 = phi i2 [ 1, %bb ], [ %i2, %bb1 ]
28+
%i = add nsw i2 %.07, 1
29+
%i2 = add i2 %.0, 1
30+
%.not.not = icmp ult i2 %.07, %arg
31+
br i1 %.not.not, label %common.ret, label %bb1
32+
33+
common.ret: ; preds = %bb1
34+
ret i2 %i2
35+
}
36+
37+
define i4 @iv_nsw_poison2(i4 %0, i4 %end, i4 %start) {
38+
; CHECK-LABEL: 'iv_nsw_poison2'
39+
; CHECK-NEXT: Classifying expressions for: @iv_nsw_poison2
40+
; CHECK-NEXT: %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
41+
; CHECK-NEXT: --> {%start,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
42+
; CHECK-NEXT: %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
43+
; CHECK-NEXT: --> {%start,+,1}<nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
44+
; CHECK-NEXT: %iv.0.next = add i4 %iv.0, 1
45+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
46+
; CHECK-NEXT: %iv.1.next = add nsw i4 %iv.1, 1
47+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
48+
; CHECK-NEXT: Determining loop execution counts for: @iv_nsw_poison2
49+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
50+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
51+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
52+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
53+
;
54+
entry:
55+
br label %loop
56+
57+
loop:
58+
%iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
59+
%iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
60+
%iv.0.next = add i4 %iv.0, 1
61+
%iv.1.next = add nsw i4 %iv.1, 1
62+
%.not.not = icmp ult i4 %iv.0, %end
63+
br i1 %.not.not, label %exit, label %loop
64+
65+
exit:
66+
ret i4 %iv.1.next
67+
}
68+
69+
define i2 @iv_both_adds_nsw(i2 %arg) {
70+
; CHECK-LABEL: 'iv_both_adds_nsw'
71+
; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nsw
72+
; CHECK-NEXT: %iv.0 = phi i2 [ 1, %bb ], [ %iv.0.next, %loop ]
73+
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-2) S: [1,-2) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
74+
; CHECK-NEXT: %iv.1 = phi i2 [ 1, %bb ], [ %iv.1.next, %loop ]
75+
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-2) S: [1,-2) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
76+
; CHECK-NEXT: %iv.0.next = add nsw i2 %iv.0, 1
77+
; CHECK-NEXT: --> {-2,+,1}<nuw><%loop> U: [-2,0) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
78+
; CHECK-NEXT: %iv.1.next = add nsw i2 %iv.1, 1
79+
; CHECK-NEXT: --> {-2,+,1}<nuw><%loop> U: [-2,0) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
80+
; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nsw
81+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
82+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
83+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
84+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
85+
;
86+
bb:
87+
br label %loop
88+
89+
loop:
90+
%iv.0 = phi i2 [ 1, %bb ], [ %iv.0.next, %loop ]
91+
%iv.1 = phi i2 [ 1, %bb ], [ %iv.1.next, %loop ]
92+
%iv.0.next = add nsw i2 %iv.0, 1
93+
%iv.1.next = add nsw i2 %iv.1, 1
94+
%.not.not = icmp ult i2 %iv.0, %arg
95+
br i1 %.not.not, label %exit, label %loop
96+
97+
exit:
98+
ret i2 %iv.1.next
99+
}
100+
101+
define i4 @iv_both_adds_nsw_extra_use(i4 %arg) {
102+
; CHECK-LABEL: 'iv_both_adds_nsw_extra_use'
103+
; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nsw_extra_use
104+
; CHECK-NEXT: %iv.0 = phi i4 [ 1, %bb ], [ %iv.0.next, %loop ]
105+
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-8) S: [1,-8) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
106+
; CHECK-NEXT: %iv.1 = phi i4 [ 1, %bb ], [ %iv.1.next, %loop ]
107+
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-8) S: [1,-8) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
108+
; CHECK-NEXT: %iv.0.next = add nsw i4 %iv.0, 1
109+
; CHECK-NEXT: --> {2,+,1}<nuw><%loop> U: [2,0) S: [2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
110+
; CHECK-NEXT: %iv.1.next = add nsw i4 %iv.1, 1
111+
; CHECK-NEXT: --> {2,+,1}<nuw><%loop> U: [2,0) S: [2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
112+
; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nsw_extra_use
113+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
114+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
115+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
116+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
117+
;
118+
bb:
119+
br label %loop
120+
121+
loop:
122+
%iv.0 = phi i4 [ 1, %bb ], [ %iv.0.next, %loop ]
123+
%iv.1 = phi i4 [ 1, %bb ], [ %iv.1.next, %loop ]
124+
%iv.0.next = add nsw i4 %iv.0, 1
125+
call void @use(i4 %iv.0.next)
126+
%iv.1.next = add nsw i4 %iv.1, 1
127+
call void @use(i4 %iv.1.next)
128+
%.not.not = icmp ult i4 %iv.0, %arg
129+
br i1 %.not.not, label %exit, label %loop
130+
131+
exit:
132+
ret i4 %iv.1.next
133+
}
134+
135+
define i4 @iv_both_adds_nsw_extra_use_incs_reordered(i4 %arg) {
136+
; CHECK-LABEL: 'iv_both_adds_nsw_extra_use_incs_reordered'
137+
; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nsw_extra_use_incs_reordered
138+
; CHECK-NEXT: %iv.0 = phi i4 [ 1, %bb ], [ %iv.0.next, %loop ]
139+
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-8) S: [1,-8) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
140+
; CHECK-NEXT: %iv.1 = phi i4 [ 1, %bb ], [ %iv.1.next, %loop ]
141+
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-8) S: [1,-8) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
142+
; CHECK-NEXT: %iv.1.next = add nsw i4 %iv.1, 1
143+
; CHECK-NEXT: --> {2,+,1}<nuw><%loop> U: [2,0) S: [2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
144+
; CHECK-NEXT: %iv.0.next = add nsw i4 %iv.0, 1
145+
; CHECK-NEXT: --> {2,+,1}<nuw><%loop> U: [2,0) S: [2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
146+
; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nsw_extra_use_incs_reordered
147+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
148+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
149+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
150+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
151+
;
152+
bb:
153+
br label %loop
154+
155+
loop:
156+
%iv.0 = phi i4 [ 1, %bb ], [ %iv.0.next, %loop ]
157+
%iv.1 = phi i4 [ 1, %bb ], [ %iv.1.next, %loop ]
158+
%iv.1.next = add nsw i4 %iv.1, 1
159+
call void @use(i4 %iv.1.next)
160+
%iv.0.next = add nsw i4 %iv.0, 1
161+
call void @use(i4 %iv.0.next)
162+
%.not.not = icmp ult i4 %iv.0, %arg
163+
br i1 %.not.not, label %exit, label %loop
164+
165+
exit:
166+
ret i4 %iv.1.next
167+
}
168+
169+
define i4 @iv_nsw_poison_extra_use(i4 %0, i4 %end, i4 %start) {
170+
; CHECK-LABEL: 'iv_nsw_poison_extra_use'
171+
; CHECK-NEXT: Classifying expressions for: @iv_nsw_poison_extra_use
172+
; CHECK-NEXT: %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
173+
; CHECK-NEXT: --> {%start,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
174+
; CHECK-NEXT: %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
175+
; CHECK-NEXT: --> {%start,+,1}<nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
176+
; CHECK-NEXT: %iv.0.next = add i4 %iv.0, 1
177+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
178+
; CHECK-NEXT: %iv.1.next = add nsw i4 %iv.1, 1
179+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
180+
; CHECK-NEXT: Determining loop execution counts for: @iv_nsw_poison_extra_use
181+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
182+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
183+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
184+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
185+
;
186+
entry:
187+
br label %loop
188+
189+
loop:
190+
%iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
191+
%iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
192+
%iv.0.next = add i4 %iv.0, 1
193+
call void @use(i4 %iv.0.next)
194+
%iv.1.next = add nsw i4 %iv.1, 1
195+
%.not.not = icmp ult i4 %iv.0, %end
196+
br i1 %.not.not, label %exit, label %loop
197+
198+
exit:
199+
ret i4 %iv.1.next
200+
}
201+
202+
declare void @use(i4)
203+
204+
define i2 @iv_nuw_poison(i2 %arg, i2 %start) {
205+
; CHECK-LABEL: 'iv_nuw_poison'
206+
; CHECK-NEXT: Classifying expressions for: @iv_nuw_poison
207+
; CHECK-NEXT: %.07 = phi i2 [ %start, %bb ], [ %i, %bb1 ]
208+
; CHECK-NEXT: --> {%start,+,1}<nuw><%bb1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb1: Computable }
209+
; CHECK-NEXT: %.0 = phi i2 [ %start, %bb ], [ %i2, %bb1 ]
210+
; CHECK-NEXT: --> {%start,+,1}<nuw><%bb1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb1: Computable }
211+
; CHECK-NEXT: %i = add nuw i2 %.07, 1
212+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%bb1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb1: Computable }
213+
; CHECK-NEXT: %i2 = add i2 %.0, 1
214+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%bb1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb1: Computable }
215+
; CHECK-NEXT: Determining loop execution counts for: @iv_nuw_poison
216+
; CHECK-NEXT: Loop %bb1: Unpredictable backedge-taken count.
217+
; CHECK-NEXT: Loop %bb1: Unpredictable constant max backedge-taken count.
218+
; CHECK-NEXT: Loop %bb1: Unpredictable symbolic max backedge-taken count.
219+
; CHECK-NEXT: Loop %bb1: Unpredictable predicated backedge-taken count.
220+
;
221+
bb:
222+
br label %bb1
223+
224+
bb1: ; preds = %bb1, %bb
225+
%.07 = phi i2 [ %start, %bb ], [ %i, %bb1 ]
226+
%.0 = phi i2 [ %start, %bb ], [ %i2, %bb1 ]
227+
%i = add nuw i2 %.07, 1
228+
%i2 = add i2 %.0, 1
229+
%.not.not = icmp ult i2 %.07, %arg
230+
br i1 %.not.not, label %common.ret, label %bb1
231+
232+
common.ret: ; preds = %bb1
233+
ret i2 %i2
234+
}
235+
236+
define i4 @iv_nuw_poison2(i4 %0, i4 %end, i4 %start) {
237+
; CHECK-LABEL: 'iv_nuw_poison2'
238+
; CHECK-NEXT: Classifying expressions for: @iv_nuw_poison2
239+
; CHECK-NEXT: %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
240+
; CHECK-NEXT: --> {%start,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
241+
; CHECK-NEXT: %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
242+
; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
243+
; CHECK-NEXT: %iv.0.next = add i4 %iv.0, 1
244+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
245+
; CHECK-NEXT: %iv.1.next = add nuw i4 %iv.1, 1
246+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
247+
; CHECK-NEXT: Determining loop execution counts for: @iv_nuw_poison2
248+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
249+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
250+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
251+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
252+
;
253+
entry:
254+
br label %loop
255+
256+
loop:
257+
%iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
258+
%iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
259+
%iv.0.next = add i4 %iv.0, 1
260+
%iv.1.next = add nuw i4 %iv.1, 1
261+
%.not.not = icmp ult i4 %iv.0, %end
262+
br i1 %.not.not, label %exit, label %loop
263+
264+
exit:
265+
ret i4 %iv.1.next
266+
}
267+
268+
define i2 @iv_both_adds_nuw(i2 %arg, i2 %start) {
269+
; CHECK-LABEL: 'iv_both_adds_nuw'
270+
; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nuw
271+
; CHECK-NEXT: %iv.0 = phi i2 [ %start, %bb ], [ %iv.0.next, %loop ]
272+
; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
273+
; CHECK-NEXT: %iv.1 = phi i2 [ %start, %bb ], [ %iv.1.next, %loop ]
274+
; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
275+
; CHECK-NEXT: %iv.0.next = add nuw i2 %iv.0, 1
276+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
277+
; CHECK-NEXT: %iv.1.next = add nuw i2 %iv.1, 1
278+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
279+
; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nuw
280+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
281+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
282+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
283+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
284+
;
285+
bb:
286+
br label %loop
287+
288+
loop:
289+
%iv.0 = phi i2 [ %start, %bb ], [ %iv.0.next, %loop ]
290+
%iv.1 = phi i2 [ %start, %bb ], [ %iv.1.next, %loop ]
291+
%iv.0.next = add nuw i2 %iv.0, 1
292+
%iv.1.next = add nuw i2 %iv.1, 1
293+
%.not.not = icmp ult i2 %iv.0, %arg
294+
br i1 %.not.not, label %exit, label %loop
295+
296+
exit:
297+
ret i2 %iv.1.next
298+
}
299+
300+
define i4 @iv_both_adds_nuw_extra_use(i4 %arg, i4 %start) {
301+
; CHECK-LABEL: 'iv_both_adds_nuw_extra_use'
302+
; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nuw_extra_use
303+
; CHECK-NEXT: %iv.0 = phi i4 [ %start, %bb ], [ %iv.0.next, %loop ]
304+
; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
305+
; CHECK-NEXT: %iv.1 = phi i4 [ %start, %bb ], [ %iv.1.next, %loop ]
306+
; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
307+
; CHECK-NEXT: %iv.0.next = add nuw i4 %iv.0, 1
308+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
309+
; CHECK-NEXT: %iv.1.next = add nuw i4 %iv.1, 1
310+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
311+
; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nuw_extra_use
312+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
313+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
314+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
315+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
316+
;
317+
bb:
318+
br label %loop
319+
320+
loop:
321+
%iv.0 = phi i4 [ %start, %bb ], [ %iv.0.next, %loop ]
322+
%iv.1 = phi i4 [ %start, %bb ], [ %iv.1.next, %loop ]
323+
%iv.0.next = add nuw i4 %iv.0, 1
324+
call void @use(i4 %iv.0.next)
325+
%iv.1.next = add nuw i4 %iv.1, 1
326+
call void @use(i4 %iv.1.next)
327+
%.not.not = icmp ult i4 %iv.0, %arg
328+
br i1 %.not.not, label %exit, label %loop
329+
330+
exit:
331+
ret i4 %iv.1.next
332+
}
333+
334+
define i4 @iv_both_adds_nuw_extra_use_incs_reordered(i4 %arg, i4 %start) {
335+
; CHECK-LABEL: 'iv_both_adds_nuw_extra_use_incs_reordered'
336+
; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nuw_extra_use_incs_reordered
337+
; CHECK-NEXT: %iv.0 = phi i4 [ %start, %bb ], [ %iv.0.next, %loop ]
338+
; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
339+
; CHECK-NEXT: %iv.1 = phi i4 [ %start, %bb ], [ %iv.1.next, %loop ]
340+
; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
341+
; CHECK-NEXT: %iv.1.next = add nuw i4 %iv.1, 1
342+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
343+
; CHECK-NEXT: %iv.0.next = add nuw i4 %iv.0, 1
344+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
345+
; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nuw_extra_use_incs_reordered
346+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
347+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
348+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
349+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
350+
;
351+
bb:
352+
br label %loop
353+
354+
loop:
355+
%iv.0 = phi i4 [ %start, %bb ], [ %iv.0.next, %loop ]
356+
%iv.1 = phi i4 [ %start, %bb ], [ %iv.1.next, %loop ]
357+
%iv.1.next = add nuw i4 %iv.1, 1
358+
call void @use(i4 %iv.1.next)
359+
%iv.0.next = add nuw i4 %iv.0, 1
360+
call void @use(i4 %iv.0.next)
361+
%.not.not = icmp ult i4 %iv.0, %arg
362+
br i1 %.not.not, label %exit, label %loop
363+
364+
exit:
365+
ret i4 %iv.1.next
366+
}
367+
368+
define i4 @iv_nuw_poison_extra_use(i4 %0, i4 %end, i4 %start) {
369+
; CHECK-LABEL: 'iv_nuw_poison_extra_use'
370+
; CHECK-NEXT: Classifying expressions for: @iv_nuw_poison_extra_use
371+
; CHECK-NEXT: %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
372+
; CHECK-NEXT: --> {%start,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
373+
; CHECK-NEXT: %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
374+
; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
375+
; CHECK-NEXT: %iv.0.next = add i4 %iv.0, 1
376+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
377+
; CHECK-NEXT: %iv.1.next = add nuw i4 %iv.1, 1
378+
; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
379+
; CHECK-NEXT: Determining loop execution counts for: @iv_nuw_poison_extra_use
380+
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
381+
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
382+
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
383+
; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
384+
;
385+
entry:
386+
br label %loop
387+
388+
loop:
389+
%iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ]
390+
%iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ]
391+
%iv.0.next = add i4 %iv.0, 1
392+
call void @use(i4 %iv.0.next)
393+
%iv.1.next = add nuw i4 %iv.1, 1
394+
%.not.not = icmp ult i4 %iv.0, %end
395+
br i1 %.not.not, label %exit, label %loop
396+
397+
exit:
398+
ret i4 %iv.1.next
399+
}

0 commit comments

Comments
 (0)