xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/trip-count-non-unit-stride.ll (revision 8b5b294ec2cf876bc5eb5bd5fcb56ef487e36d60)
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 constant max backedge-taken count.
19; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
20; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
21; CHECK-NEXT:    symbolic max exit count for latch: ***COULDNOTCOMPUTE***
22;
23start:
24  br label %loop
25
26loop:
27  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
28  %cmp1 = icmp ult i64 %iv, %len
29  br i1 %cmp1, label %latch, label %exit
30
31latch:
32  %iv.inc2 = add nuw i64 %iv, 2
33  %cmp2 = icmp ult i64 %iv.inc2, %len
34  br i1 %cmp2, label %loop, label %exit
35
36exit:
37  ret void
38}
39
40define void @test_postinc_ult(i64 %len) {
41; CHECK-LABEL: 'test_postinc_ult'
42; CHECK-NEXT:  Classifying expressions for: @test_postinc_ult
43; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
44; CHECK-NEXT:    --> {0,+,2}<nuw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
45; CHECK-NEXT:    %iv.inc = add nuw i64 %iv, 1
46; CHECK-NEXT:    --> {1,+,2}<nuw><%loop> U: [1,0) S: [1,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
47; CHECK-NEXT:    %iv.inc2 = add nuw i64 %iv, 2
48; CHECK-NEXT:    --> {2,+,2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
49; CHECK-NEXT:  Determining loop execution counts for: @test_postinc_ult
50; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
51; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
52; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
53; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
54; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
55; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
56; CHECK-NEXT:    symbolic max exit count for latch: ***COULDNOTCOMPUTE***
57;
58start:
59  br label %loop
60
61loop:
62  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
63  %iv.inc = add nuw i64 %iv, 1
64  %cmp1 = icmp ult i64 %iv.inc, %len
65  br i1 %cmp1, label %latch, label %exit
66
67latch:
68  %iv.inc2 = add nuw i64 %iv, 2
69  %cmp2 = icmp ult i64 %iv.inc2, %len
70  br i1 %cmp2, label %loop, label %exit
71
72exit:
73  ret void
74}
75
76define void @test_preinc_slt(i64 %len) {
77; CHECK-LABEL: 'test_preinc_slt'
78; CHECK-NEXT:  Classifying expressions for: @test_preinc_slt
79; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
80; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
81; CHECK-NEXT:    %iv.inc2 = add nsw i64 %iv, 2
82; CHECK-NEXT:    --> {2,+,2}<nuw><%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
83; CHECK-NEXT:  Determining loop execution counts for: @test_preinc_slt
84; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
85; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
86; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
87; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
88; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
89; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
90; CHECK-NEXT:    symbolic max exit count for latch: ***COULDNOTCOMPUTE***
91;
92start:
93  br label %loop
94
95loop:
96  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
97  %cmp1 = icmp slt i64 %iv, %len
98  br i1 %cmp1, label %latch, label %exit
99
100latch:
101  %iv.inc2 = add nsw i64 %iv, 2
102  %cmp2 = icmp slt i64 %iv.inc2, %len
103  br i1 %cmp2, label %loop, label %exit
104
105exit:
106  ret void
107}
108
109define void @test_postinc_slt(i64 %len) {
110; CHECK-LABEL: 'test_postinc_slt'
111; CHECK-NEXT:  Classifying expressions for: @test_postinc_slt
112; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
113; CHECK-NEXT:    --> {0,+,2}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
114; CHECK-NEXT:    %iv.inc = add nsw i64 %iv, 1
115; CHECK-NEXT:    --> {1,+,2}<nuw><nsw><%loop> U: [1,-9223372036854775808) S: [1,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
116; CHECK-NEXT:    %iv.inc2 = add nsw i64 %iv, 2
117; CHECK-NEXT:    --> {2,+,2}<nuw><%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
118; CHECK-NEXT:  Determining loop execution counts for: @test_postinc_slt
119; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
120; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
121; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
122; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
123; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
124; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
125; CHECK-NEXT:    symbolic max exit count for latch: ***COULDNOTCOMPUTE***
126;
127start:
128  br label %loop
129
130loop:
131  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
132  %iv.inc = add nsw i64 %iv, 1
133  %cmp1 = icmp slt i64 %iv.inc, %len
134  br i1 %cmp1, label %latch, label %exit
135
136latch:
137  %iv.inc2 = add nsw i64 %iv, 2
138  %cmp2 = icmp slt i64 %iv.inc2, %len
139  br i1 %cmp2, label %loop, label %exit
140
141exit:
142  ret void
143}
144
145define void @test_preinc_sgt(i64 %lim) {
146; CHECK-LABEL: 'test_preinc_sgt'
147; CHECK-NEXT:  Classifying expressions for: @test_preinc_sgt
148; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
149; CHECK-NEXT:    --> {0,+,-2}<nsw><%loop> U: [0,-1) S: [-9223372036854775808,1) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
150; CHECK-NEXT:    %iv.inc2 = add nsw i64 %iv, -2
151; CHECK-NEXT:    --> {-2,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
152; CHECK-NEXT:  Determining loop execution counts for: @test_preinc_sgt
153; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
154; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
155; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
156; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
157; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
158; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
159; CHECK-NEXT:    symbolic max exit count for latch: ***COULDNOTCOMPUTE***
160;
161start:
162  br label %loop
163
164loop:
165  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
166  %cmp1 = icmp sgt i64 %iv, %lim
167  br i1 %cmp1, label %latch, label %exit
168
169latch:
170  %iv.inc2 = add nsw i64 %iv, -2
171  %cmp2 = icmp sgt i64 %iv.inc2, %lim
172  br i1 %cmp2, label %loop, label %exit
173
174exit:
175  ret void
176}
177
178define void @test_postinc_sgt(i64 %lim) {
179; CHECK-LABEL: 'test_postinc_sgt'
180; CHECK-NEXT:  Classifying expressions for: @test_postinc_sgt
181; CHECK-NEXT:    %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
182; CHECK-NEXT:    --> {0,+,-2}<nsw><%loop> U: [0,-1) S: [-9223372036854775808,1) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
183; CHECK-NEXT:    %iv.inc = add nsw i64 %iv, -1
184; CHECK-NEXT:    --> {-1,+,-2}<nsw><%loop> U: [-9223372036854775808,0) S: [-9223372036854775808,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
185; CHECK-NEXT:    %iv.inc2 = add nsw i64 %iv, -2
186; CHECK-NEXT:    --> {-2,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
187; CHECK-NEXT:  Determining loop execution counts for: @test_postinc_sgt
188; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
189; CHECK-NEXT:    exit count for loop: ***COULDNOTCOMPUTE***
190; CHECK-NEXT:    exit count for latch: ***COULDNOTCOMPUTE***
191; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
192; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
193; CHECK-NEXT:    symbolic max exit count for loop: ***COULDNOTCOMPUTE***
194; CHECK-NEXT:    symbolic max exit count for latch: ***COULDNOTCOMPUTE***
195;
196start:
197  br label %loop
198
199loop:
200  %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]
201  %iv.inc = add nsw i64 %iv, -1
202  %cmp1 = icmp sgt i64 %iv.inc, %lim
203  br i1 %cmp1, label %latch, label %exit
204
205latch:
206  %iv.inc2 = add nsw i64 %iv, -2
207  %cmp2 = icmp sgt i64 %iv.inc2, %lim
208  br i1 %cmp2, label %loop, label %exit
209
210exit:
211  ret void
212}
213