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