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