xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/trip-multiple.ll (revision 8b5b294ec2cf876bc5eb5bd5fcb56ef487e36d60)
1da36d1f0SJoshua Cao; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
29c1d5e4aSJoshua Cao; RUN: opt -passes='print<scalar-evolution>,verify<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s
3da36d1f0SJoshua Cao
4da36d1f0SJoshua Cao; Test trip multiples with functions that look like:
5da36d1f0SJoshua Cao
6da36d1f0SJoshua Cao; void foo();
7da36d1f0SJoshua Cao; void square(unsigned num) {
8da36d1f0SJoshua Cao;     if (num % 5 == 0)
9da36d1f0SJoshua Cao;     for (unsigned i = 0; i < num; ++i)
10da36d1f0SJoshua Cao;         foo();
11da36d1f0SJoshua Cao; }
12da36d1f0SJoshua Cao
13da36d1f0SJoshua Caodeclare void @foo(...)
14da36d1f0SJoshua Cao
15da36d1f0SJoshua Caodefine void @trip_multiple_3(i32 noundef %num) {
16da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_3'
17da36d1f0SJoshua Cao; CHECK-NEXT:  Classifying expressions for: @trip_multiple_3
18da36d1f0SJoshua Cao; CHECK-NEXT:    %rem = urem i32 %num, 3
19da36d1f0SJoshua Cao; CHECK-NEXT:    --> ((-3 * (%num /u 3)) + %num) U: full-set S: full-set
20da36d1f0SJoshua Cao; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14
21da36d1f0SJoshua Cao; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set
22da36d1f0SJoshua Cao; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
23da36d1f0SJoshua Cao; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-1) S: [0,-1) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
24da36d1f0SJoshua Cao; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1
25da36d1f0SJoshua Cao; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,0) S: [1,0) Exits: %num LoopDispositions: { %for.body: Computable }
26da36d1f0SJoshua Cao; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_3
27da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)
28*7755c261SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2
29da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
3088f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.body: Trip multiple is 3
31da36d1f0SJoshua Cao;
32da36d1f0SJoshua Caoentry:
33da36d1f0SJoshua Cao  %rem = urem i32 %num, 3
34da36d1f0SJoshua Cao  %cmp = icmp eq i32 %rem, 0
35da36d1f0SJoshua Cao  %cmp14 = icmp ne i32 %num, 0
36da36d1f0SJoshua Cao  %or.cond = and i1 %cmp, %cmp14
37da36d1f0SJoshua Cao  br i1 %or.cond, label %for.body, label %if.end
38da36d1f0SJoshua Cao
39da36d1f0SJoshua Caofor.body:                                         ; preds = %entry, %for.body
40da36d1f0SJoshua Cao  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
41da36d1f0SJoshua Cao  tail call void (...) @foo() #2
42da36d1f0SJoshua Cao  %inc = add nuw i32 %i.05, 1
43da36d1f0SJoshua Cao  %exitcond.not = icmp eq i32 %inc, %num
44da36d1f0SJoshua Cao  br i1 %exitcond.not, label %if.end, label %for.body
45da36d1f0SJoshua Cao
46da36d1f0SJoshua Caoif.end:                                           ; preds = %for.body, %entry
47da36d1f0SJoshua Cao  ret void
48da36d1f0SJoshua Cao}
49da36d1f0SJoshua Caodefine void @trip_multiple_4(i32 noundef %num) {
50da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_4'
51da36d1f0SJoshua Cao; CHECK-NEXT:  Classifying expressions for: @trip_multiple_4
52da36d1f0SJoshua Cao; CHECK-NEXT:    %rem = urem i32 %num, 4
53da36d1f0SJoshua Cao; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)
54da36d1f0SJoshua Cao; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14
55da36d1f0SJoshua Cao; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set
56da36d1f0SJoshua Cao; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
57da36d1f0SJoshua Cao; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
58da36d1f0SJoshua Cao; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1
59da36d1f0SJoshua Cao; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable }
60da36d1f0SJoshua Cao; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_4
61da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)
62*7755c261SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -5
63da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
6488f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.body: Trip multiple is 4
65da36d1f0SJoshua Cao;
66da36d1f0SJoshua Caoentry:
67da36d1f0SJoshua Cao  %rem = urem i32 %num, 4
68da36d1f0SJoshua Cao  %cmp = icmp eq i32 %rem, 0
69da36d1f0SJoshua Cao  %cmp14 = icmp ne i32 %num, 0
70da36d1f0SJoshua Cao  %or.cond = and i1 %cmp, %cmp14
71da36d1f0SJoshua Cao  br i1 %or.cond, label %for.body, label %if.end
72da36d1f0SJoshua Cao
73da36d1f0SJoshua Caofor.body:                                         ; preds = %entry, %for.body
74da36d1f0SJoshua Cao  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
75da36d1f0SJoshua Cao  tail call void (...) @foo() #2
76da36d1f0SJoshua Cao  %inc = add nuw i32 %i.05, 1
77da36d1f0SJoshua Cao  %exitcond.not = icmp eq i32 %inc, %num
78da36d1f0SJoshua Cao  br i1 %exitcond.not, label %if.end, label %for.body
79da36d1f0SJoshua Cao
80da36d1f0SJoshua Caoif.end:                                           ; preds = %for.body, %entry
81da36d1f0SJoshua Cao  ret void
82da36d1f0SJoshua Cao}
83da36d1f0SJoshua Cao
84da36d1f0SJoshua Caodefine void @trip_multiple_5(i32 noundef %num) {
85da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_5'
86da36d1f0SJoshua Cao; CHECK-NEXT:  Classifying expressions for: @trip_multiple_5
87da36d1f0SJoshua Cao; CHECK-NEXT:    %rem = urem i32 %num, 5
88da36d1f0SJoshua Cao; CHECK-NEXT:    --> ((-5 * (%num /u 5)) + %num) U: full-set S: full-set
89da36d1f0SJoshua Cao; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14
90da36d1f0SJoshua Cao; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set
91da36d1f0SJoshua Cao; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
92da36d1f0SJoshua Cao; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-1) S: [0,-1) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
93da36d1f0SJoshua Cao; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1
94da36d1f0SJoshua Cao; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,0) S: [1,0) Exits: %num LoopDispositions: { %for.body: Computable }
95da36d1f0SJoshua Cao; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_5
96da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)
97*7755c261SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2
98da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
9988f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.body: Trip multiple is 5
100da36d1f0SJoshua Cao;
101da36d1f0SJoshua Caoentry:
102da36d1f0SJoshua Cao  %rem = urem i32 %num, 5
103da36d1f0SJoshua Cao  %cmp = icmp eq i32 %rem, 0
104da36d1f0SJoshua Cao  %cmp14 = icmp ne i32 %num, 0
105da36d1f0SJoshua Cao  %or.cond = and i1 %cmp, %cmp14
106da36d1f0SJoshua Cao  br i1 %or.cond, label %for.body, label %if.end
107da36d1f0SJoshua Cao
108da36d1f0SJoshua Caofor.body:                                         ; preds = %entry, %for.body
109da36d1f0SJoshua Cao  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
110da36d1f0SJoshua Cao  tail call void (...) @foo() #2
111da36d1f0SJoshua Cao  %inc = add nuw i32 %i.05, 1
112da36d1f0SJoshua Cao  %exitcond.not = icmp eq i32 %inc, %num
113da36d1f0SJoshua Cao  br i1 %exitcond.not, label %if.end, label %for.body
114da36d1f0SJoshua Cao
115da36d1f0SJoshua Caoif.end:                                           ; preds = %for.body, %entry
116da36d1f0SJoshua Cao  ret void
117da36d1f0SJoshua Cao}
118da36d1f0SJoshua Cao
119da36d1f0SJoshua Caodefine void @trip_multiple_6(i32 noundef %num) {
120da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_6'
121da36d1f0SJoshua Cao; CHECK-NEXT:  Classifying expressions for: @trip_multiple_6
122da36d1f0SJoshua Cao; CHECK-NEXT:    %rem = urem i32 %num, 6
123da36d1f0SJoshua Cao; CHECK-NEXT:    --> ((-6 * (%num /u 6)) + %num) U: full-set S: full-set
124da36d1f0SJoshua Cao; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14
125da36d1f0SJoshua Cao; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set
126da36d1f0SJoshua Cao; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
127da36d1f0SJoshua Cao; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
128da36d1f0SJoshua Cao; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1
129da36d1f0SJoshua Cao; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable }
130da36d1f0SJoshua Cao; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_6
131da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)
132*7755c261SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -5
133da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
13488f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.body: Trip multiple is 6
135da36d1f0SJoshua Cao;
136da36d1f0SJoshua Caoentry:
137da36d1f0SJoshua Cao  %rem = urem i32 %num, 6
138da36d1f0SJoshua Cao  %cmp = icmp eq i32 %rem, 0
139da36d1f0SJoshua Cao  %cmp14 = icmp ne i32 %num, 0
140da36d1f0SJoshua Cao  %or.cond = and i1 %cmp, %cmp14
141da36d1f0SJoshua Cao  br i1 %or.cond, label %for.body, label %if.end
142da36d1f0SJoshua Cao
143da36d1f0SJoshua Caofor.body:                                         ; preds = %entry, %for.body
144da36d1f0SJoshua Cao  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
145da36d1f0SJoshua Cao  tail call void (...) @foo() #2
146da36d1f0SJoshua Cao  %inc = add nuw i32 %i.05, 1
147da36d1f0SJoshua Cao  %exitcond.not = icmp eq i32 %inc, %num
148da36d1f0SJoshua Cao  br i1 %exitcond.not, label %if.end, label %for.body
149da36d1f0SJoshua Cao
150da36d1f0SJoshua Caoif.end:                                           ; preds = %for.body, %entry
151da36d1f0SJoshua Cao  ret void
152da36d1f0SJoshua Cao}
153da36d1f0SJoshua Cao
154da36d1f0SJoshua Caodefine void @trip_multiple_7(i32 noundef %num) {
155da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_7'
156da36d1f0SJoshua Cao; CHECK-NEXT:  Classifying expressions for: @trip_multiple_7
157da36d1f0SJoshua Cao; CHECK-NEXT:    %rem = urem i32 %num, 7
158da36d1f0SJoshua Cao; CHECK-NEXT:    --> ((-7 * (%num /u 7)) + %num) U: full-set S: full-set
159da36d1f0SJoshua Cao; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14
160da36d1f0SJoshua Cao; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set
161da36d1f0SJoshua Cao; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
162da36d1f0SJoshua Cao; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
163da36d1f0SJoshua Cao; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1
164da36d1f0SJoshua Cao; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable }
165da36d1f0SJoshua Cao; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_7
166da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)
167*7755c261SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -5
168da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
16988f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.body: Trip multiple is 7
170da36d1f0SJoshua Cao;
171da36d1f0SJoshua Caoentry:
172da36d1f0SJoshua Cao  %rem = urem i32 %num, 7
173da36d1f0SJoshua Cao  %cmp = icmp eq i32 %rem, 0
174da36d1f0SJoshua Cao  %cmp14 = icmp ne i32 %num, 0
175da36d1f0SJoshua Cao  %or.cond = and i1 %cmp, %cmp14
176da36d1f0SJoshua Cao  br i1 %or.cond, label %for.body, label %if.end
177da36d1f0SJoshua Cao
178da36d1f0SJoshua Caofor.body:                                         ; preds = %entry, %for.body
179da36d1f0SJoshua Cao  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
180da36d1f0SJoshua Cao  tail call void (...) @foo() #2
181da36d1f0SJoshua Cao  %inc = add nuw i32 %i.05, 1
182da36d1f0SJoshua Cao  %exitcond.not = icmp eq i32 %inc, %num
183da36d1f0SJoshua Cao  br i1 %exitcond.not, label %if.end, label %for.body
184da36d1f0SJoshua Cao
185da36d1f0SJoshua Caoif.end:                                           ; preds = %for.body, %entry
186da36d1f0SJoshua Cao  ret void
187da36d1f0SJoshua Cao}
188da36d1f0SJoshua Cao
189da36d1f0SJoshua Caodefine void @trip_multiple_8(i32 noundef %num) {
190da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_8'
191da36d1f0SJoshua Cao; CHECK-NEXT:  Classifying expressions for: @trip_multiple_8
192da36d1f0SJoshua Cao; CHECK-NEXT:    %rem = urem i32 %num, 8
193da36d1f0SJoshua Cao; CHECK-NEXT:    --> (zext i3 (trunc i32 %num to i3) to i32) U: [0,8) S: [0,8)
194da36d1f0SJoshua Cao; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14
195da36d1f0SJoshua Cao; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set
196da36d1f0SJoshua Cao; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
197da36d1f0SJoshua Cao; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-8) S: [0,-8) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
198da36d1f0SJoshua Cao; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1
199da36d1f0SJoshua Cao; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-7) S: [1,-7) Exits: %num LoopDispositions: { %for.body: Computable }
200da36d1f0SJoshua Cao; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_8
201da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)
202*7755c261SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -9
203da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
20488f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.body: Trip multiple is 8
205da36d1f0SJoshua Cao;
206da36d1f0SJoshua Caoentry:
207da36d1f0SJoshua Cao  %rem = urem i32 %num, 8
208da36d1f0SJoshua Cao  %cmp = icmp eq i32 %rem, 0
209da36d1f0SJoshua Cao  %cmp14 = icmp ne i32 %num, 0
210da36d1f0SJoshua Cao  %or.cond = and i1 %cmp, %cmp14
211da36d1f0SJoshua Cao  br i1 %or.cond, label %for.body, label %if.end
212da36d1f0SJoshua Cao
213da36d1f0SJoshua Caofor.body:                                         ; preds = %entry, %for.body
214da36d1f0SJoshua Cao  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
215da36d1f0SJoshua Cao  tail call void (...) @foo() #2
216da36d1f0SJoshua Cao  %inc = add nuw i32 %i.05, 1
217da36d1f0SJoshua Cao  %exitcond.not = icmp eq i32 %inc, %num
218da36d1f0SJoshua Cao  br i1 %exitcond.not, label %if.end, label %for.body
219da36d1f0SJoshua Cao
220da36d1f0SJoshua Caoif.end:                                           ; preds = %for.body, %entry
221da36d1f0SJoshua Cao  ret void
222da36d1f0SJoshua Cao}
223da36d1f0SJoshua Caodefine void @trip_multiple_9(i32 noundef %num) {
224da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_9'
225da36d1f0SJoshua Cao; CHECK-NEXT:  Classifying expressions for: @trip_multiple_9
226da36d1f0SJoshua Cao; CHECK-NEXT:    %rem = urem i32 %num, 9
227da36d1f0SJoshua Cao; CHECK-NEXT:    --> ((-9 * (%num /u 9)) + %num) U: full-set S: full-set
228da36d1f0SJoshua Cao; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14
229da36d1f0SJoshua Cao; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set
230da36d1f0SJoshua Cao; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
231da36d1f0SJoshua Cao; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
232da36d1f0SJoshua Cao; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1
233da36d1f0SJoshua Cao; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable }
234da36d1f0SJoshua Cao; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_9
235da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)
236*7755c261SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -5
237da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
23888f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.body: Trip multiple is 9
239da36d1f0SJoshua Cao;
240da36d1f0SJoshua Caoentry:
241da36d1f0SJoshua Cao  %rem = urem i32 %num, 9
242da36d1f0SJoshua Cao  %cmp = icmp eq i32 %rem, 0
243da36d1f0SJoshua Cao  %cmp14 = icmp ne i32 %num, 0
244da36d1f0SJoshua Cao  %or.cond = and i1 %cmp, %cmp14
245da36d1f0SJoshua Cao  br i1 %or.cond, label %for.body, label %if.end
246da36d1f0SJoshua Cao
247da36d1f0SJoshua Caofor.body:                                         ; preds = %entry, %for.body
248da36d1f0SJoshua Cao  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
249da36d1f0SJoshua Cao  tail call void (...) @foo() #2
250da36d1f0SJoshua Cao  %inc = add nuw i32 %i.05, 1
251da36d1f0SJoshua Cao  %exitcond.not = icmp eq i32 %inc, %num
252da36d1f0SJoshua Cao  br i1 %exitcond.not, label %if.end, label %for.body
253da36d1f0SJoshua Cao
254da36d1f0SJoshua Caoif.end:                                           ; preds = %for.body, %entry
255da36d1f0SJoshua Cao  ret void
256da36d1f0SJoshua Cao}
257da36d1f0SJoshua Caodefine void @trip_multiple_10(i32 noundef %num) {
258da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_10'
259da36d1f0SJoshua Cao; CHECK-NEXT:  Classifying expressions for: @trip_multiple_10
260da36d1f0SJoshua Cao; CHECK-NEXT:    %rem = urem i32 %num, 10
261da36d1f0SJoshua Cao; CHECK-NEXT:    --> ((-10 * (%num /u 10)) + %num) U: full-set S: full-set
262da36d1f0SJoshua Cao; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14
263da36d1f0SJoshua Cao; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set
264da36d1f0SJoshua Cao; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
265da36d1f0SJoshua Cao; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-6) S: [0,-6) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }
266da36d1f0SJoshua Cao; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1
267da36d1f0SJoshua Cao; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-5) S: [1,-5) Exits: %num LoopDispositions: { %for.body: Computable }
268da36d1f0SJoshua Cao; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_10
269da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)
270*7755c261SPhilip Reames; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -7
271da36d1f0SJoshua Cao; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)
27288f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.body: Trip multiple is 10
273da36d1f0SJoshua Cao;
274da36d1f0SJoshua Caoentry:
275da36d1f0SJoshua Cao  %rem = urem i32 %num, 10
276da36d1f0SJoshua Cao  %cmp = icmp eq i32 %rem, 0
277da36d1f0SJoshua Cao  %cmp14 = icmp ne i32 %num, 0
278da36d1f0SJoshua Cao  %or.cond = and i1 %cmp, %cmp14
279da36d1f0SJoshua Cao  br i1 %or.cond, label %for.body, label %if.end
280da36d1f0SJoshua Cao
281da36d1f0SJoshua Caofor.body:                                         ; preds = %entry, %for.body
282da36d1f0SJoshua Cao  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
283da36d1f0SJoshua Cao  tail call void (...) @foo() #2
284da36d1f0SJoshua Cao  %inc = add nuw i32 %i.05, 1
285da36d1f0SJoshua Cao  %exitcond.not = icmp eq i32 %inc, %num
286da36d1f0SJoshua Cao  br i1 %exitcond.not, label %if.end, label %for.body
287da36d1f0SJoshua Cao
288da36d1f0SJoshua Caoif.end:                                           ; preds = %for.body, %entry
289da36d1f0SJoshua Cao  ret void
290da36d1f0SJoshua Cao}
291