1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt -S -passes='print<scalar-evolution>' -disable-output < %s 2>&1 | FileCheck %s
3
4; Test non-unit strides in multiple-exit loops, and the interaction with
5; nowrap flags.
6
7define void @test_preinc_ult(i64 %len) {
8; CHECK-LABEL: 'test_preinc_ult'
9; CHECK-NEXT:  Classifying expressions for: @test_preinc_ult
10; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
11; CHECK-NEXT:    --> {0,+,2}<nuw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
12; CHECK-NEXT:    %iv.inc2 = add nuw i64 %iv, 2
13; CHECK-NEXT:    --> {2,+,2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
14; CHECK-NEXT:  Determining loop execution counts for: @test_preinc_ult
15; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
16; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
17; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
18; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
19; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
20;
21start:
22  br label %loop
23
24loop:
25  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
26  %cmp1 = icmp ult i64 %iv, %len
27  br i1 %cmp1, label %latch, label %exit
28
29latch:
30  %iv.inc2 = add nuw i64 %iv, 2
31  %cmp2 = icmp ult i64 %iv.inc2, %len
32  br i1 %cmp2, label %loop, label %exit
33
34exit:
35  ret void
36}
37
38define void @test_postinc_ult(i64 %len) {
39; CHECK-LABEL: 'test_postinc_ult'
40; CHECK-NEXT:  Classifying expressions for: @test_postinc_ult
41; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
42; CHECK-NEXT:    --> {0,+,2}<nuw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
43; CHECK-NEXT:    %iv.inc = add nuw i64 %iv, 1
44; CHECK-NEXT:    --> {1,+,2}<nuw><%loop> U: [1,0) S: [1,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
45; CHECK-NEXT:    %iv.inc2 = add nuw i64 %iv, 2
46; CHECK-NEXT:    --> {2,+,2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
47; CHECK-NEXT:  Determining loop execution counts for: @test_postinc_ult
48; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
49; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
50; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
51; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
52; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
53;
54start:
55  br label %loop
56
57loop:
58  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
59  %iv.inc = add nuw i64 %iv, 1
60  %cmp1 = icmp ult i64 %iv.inc, %len
61  br i1 %cmp1, label %latch, label %exit
62
63latch:
64  %iv.inc2 = add nuw i64 %iv, 2
65  %cmp2 = icmp ult i64 %iv.inc2, %len
66  br i1 %cmp2, label %loop, label %exit
67
68exit:
69  ret void
70}
71
72define void @test_preinc_slt(i64 %len) {
73; CHECK-LABEL: 'test_preinc_slt'
74; CHECK-NEXT:  Classifying expressions for: @test_preinc_slt
75; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
76; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
77; CHECK-NEXT:    %iv.inc2 = add nsw i64 %iv, 2
78; CHECK-NEXT:    --> {2,+,2}<nuw><%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
79; CHECK-NEXT:  Determining loop execution counts for: @test_preinc_slt
80; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
81; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
82; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
83; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
84; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
85;
86start:
87  br label %loop
88
89loop:
90  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
91  %cmp1 = icmp slt i64 %iv, %len
92  br i1 %cmp1, label %latch, label %exit
93
94latch:
95  %iv.inc2 = add nsw i64 %iv, 2
96  %cmp2 = icmp slt i64 %iv.inc2, %len
97  br i1 %cmp2, label %loop, label %exit
98
99exit:
100  ret void
101}
102
103define void @test_postinc_slt(i64 %len) {
104; CHECK-LABEL: 'test_postinc_slt'
105; CHECK-NEXT:  Classifying expressions for: @test_postinc_slt
106; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
107; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
108; CHECK-NEXT:    %iv.inc = add nsw i64 %iv, 1
109; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%loop> U: [1,-9223372036854775808) S: [1,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
110; CHECK-NEXT:    %iv.inc2 = add nsw i64 %iv, 2
111; CHECK-NEXT:    --> {2,+,2}<nuw><%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
112; CHECK-NEXT:  Determining loop execution counts for: @test_postinc_slt
113; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
114; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
115; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
116; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
117; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
118;
119start:
120  br label %loop
121
122loop:
123  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
124  %iv.inc = add nsw i64 %iv, 1
125  %cmp1 = icmp slt i64 %iv.inc, %len
126  br i1 %cmp1, label %latch, label %exit
127
128latch:
129  %iv.inc2 = add nsw i64 %iv, 2
130  %cmp2 = icmp slt i64 %iv.inc2, %len
131  br i1 %cmp2, label %loop, label %exit
132
133exit:
134  ret void
135}
136
137define void @test_preinc_sgt(i64 %lim) {
138; CHECK-LABEL: 'test_preinc_sgt'
139; CHECK-NEXT:  Classifying expressions for: @test_preinc_sgt
140; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
141; CHECK-NEXT:    --> {0,+,-2}<nsw><%loop> U: [0,-1) S: [-9223372036854775808,1) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
142; CHECK-NEXT:    %iv.inc2 = add nsw i64 %iv, -2
143; CHECK-NEXT:    --> {-2,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
144; CHECK-NEXT:  Determining loop execution counts for: @test_preinc_sgt
145; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
146; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
147; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
148; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
149; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
150;
151start:
152  br label %loop
153
154loop:
155  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
156  %cmp1 = icmp sgt i64 %iv, %lim
157  br i1 %cmp1, label %latch, label %exit
158
159latch:
160  %iv.inc2 = add nsw i64 %iv, -2
161  %cmp2 = icmp sgt i64 %iv.inc2, %lim
162  br i1 %cmp2, label %loop, label %exit
163
164exit:
165  ret void
166}
167
168define void @test_postinc_sgt(i64 %lim) {
169; CHECK-LABEL: 'test_postinc_sgt'
170; CHECK-NEXT:  Classifying expressions for: @test_postinc_sgt
171; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
172; CHECK-NEXT:    --> {0,+,-2}<nsw><%loop> U: [0,-1) S: [-9223372036854775808,1) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
173; CHECK-NEXT:    %iv.inc = add nsw i64 %iv, -1
174; CHECK-NEXT:    --> {-1,+,-2}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
175; CHECK-NEXT:    %iv.inc2 = add nsw i64 %iv, -2
176; CHECK-NEXT:    --> {-2,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
177; CHECK-NEXT:  Determining loop execution counts for: @test_postinc_sgt
178; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
179; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
180; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
181; CHECK-NEXT:  Loop %loop: Unpredictable max backedge-taken count.
182; CHECK-NEXT:  Loop %loop: Unpredictable predicated backedge-taken count.
183;
184start:
185  br label %loop
186
187loop:
188  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
189  %iv.inc = add nsw i64 %iv, -1
190  %cmp1 = icmp sgt i64 %iv.inc, %lim
191  br i1 %cmp1, label %latch, label %exit
192
193latch:
194  %iv.inc2 = add nsw i64 %iv, -2
195  %cmp2 = icmp sgt i64 %iv.inc2, %lim
196  br i1 %cmp2, label %loop, label %exit
197
198exit:
199  ret void
200}
201