11; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-max-iterations=0 -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s
22
3- define void @epilogue (i64 %count ) {
4- ; CHECK-LABEL: 'epilogue'
5- ; CHECK-NEXT: Determining loop execution counts for: @epilogue
6- ; CHECK-NEXT: Loop %epilogue: backedge-taken count is (-1 + %count.epilogue)
7- ; CHECK-NEXT: Loop %epilogue: constant max backedge-taken count is i64 6
8- ; CHECK-NEXT: Loop %epilogue: symbolic max backedge-taken count is (-1 + %count.epilogue)
9- ; CHECK-NEXT: Loop %epilogue: Trip multiple is 1
10- ; CHECK-NEXT: Loop %while.body: backedge-taken count is ((-8 + %count) /u 8)
11- ; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i64 2305843009213693951
12- ; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is ((-8 + %count) /u 8)
13- ; CHECK-NEXT: Loop %while.body: Trip multiple is 1
3+ define void @slt (i16 %a , i16 %b , i1 %c ) {
4+ ; CHECK-LABEL: 'slt'
5+ ; CHECK-NEXT: Determining loop execution counts for: @slt
6+ ; CHECK-NEXT: Loop %loop: backedge-taken count is (19 + (-1 * %count)<nsw>)<nsw>
7+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 18
8+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (19 + (-1 * %count)<nsw>)<nsw>
9+ ; CHECK-NEXT: Loop %loop: Trip multiple is 1
1410entry:
15- %cmp = icmp ugt i64 %count , 7
16- br i1 %cmp , label %while.body , label %epilogue.preheader
11+ br i1 %c , label %b1 , label %b2
1712
18- while.body:
19- %iv = phi i64 [ %sub , %while.body ], [ %count , %entry ]
20- %sub = add i64 %iv , -8
21- %exitcond.not = icmp ugt i64 %sub , 7
22- br i1 %exitcond.not , label %while.body , label %while.loopexit
13+ b1:
14+ %cmp1 = icmp slt i16 %a , 1
15+ br i1 %cmp1 , label %exit , label %preheader
2316
24- while.loopexit :
25- %sub.exit = phi i64 [ %sub , %while.body ]
26- br label %epilogue. preheader
17+ b2 :
18+ %cmp2 = icmp slt i16 %b , 4
19+ br i1 %cmp2 , label %exit , label % preheader
2720
28- epilogue. preheader:
29- %count.epilogue = phi i64 [ %count , %entry ], [ %sub.exit , %while.loopexit ]
30- %epilogue.cmp = icmp eq i64 %count.epilogue , 0
31- br i1 %epilogue.cmp , label %exit , label %epilogue
21+ preheader:
22+ %count = phi i16 [ %a , %b1 ], [ %b , %b2 ]
23+ %cmp3 = icmp sle i16 %count , 19
24+ br i1 %cmp3 , label %loop , label %exit
3225
33- epilogue :
34- %iv.epilogue = phi i64 [ %dec , %epilogue ], [ %count.epilogue , %epilogue. preheader ]
35- %dec = add i64 %iv.epilogue , - 1
36- %exitcond.epilogue = icmp eq i64 %dec , 0
37- br i1 %exitcond.epilogue , label %exit , label %epilogue
26+ loop :
27+ %iv = phi i16 [ %iv.next , %loop ], [ %count , %preheader ]
28+ %iv.next = add i16 %iv , 1
29+ %exitcond = icmp eq i16 %iv.next , 20
30+ br i1 %exitcond , label %exit , label %loop
3831
3932exit:
4033 ret void
4134}
4235
43- define void @epilogue2 (i64 %count ) {
44- ; CHECK-LABEL: 'epilogue2'
45- ; CHECK-NEXT: Determining loop execution counts for: @epilogue2
46- ; CHECK-NEXT: Loop %epilogue: backedge-taken count is (-1 + %count.epilogue)
47- ; CHECK-NEXT: Loop %epilogue: constant max backedge-taken count is i64 8
48- ; CHECK-NEXT: Loop %epilogue: symbolic max backedge-taken count is (-1 + %count.epilogue)
49- ; CHECK-NEXT: Loop %epilogue: Trip multiple is 1
50- ; CHECK-NEXT: Loop %while.body: backedge-taken count is ((-8 + %count) /u 8)
51- ; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i64 2305843009213693951
52- ; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is ((-8 + %count) /u 8)
53- ; CHECK-NEXT: Loop %while.body: Trip multiple is 1
36+ define void @ult (i16 %a , i16 %b , i1 %c ) {
37+ ; CHECK-LABEL: 'ult'
38+ ; CHECK-NEXT: Determining loop execution counts for: @ult
39+ ; CHECK-NEXT: Loop %loop: backedge-taken count is (21 + (-1 * %count))
40+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 19
41+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (21 + (-1 * %count))
42+ ; CHECK-NEXT: Loop %loop: Trip multiple is 1
5443entry:
55- %cmp = icmp ugt i64 %count , 9
56- br i1 %cmp , label %while.body , label %epilogue.preheader
44+ br i1 %c , label %b1 , label %b2
5745
58- while.body:
59- %iv = phi i64 [ %sub , %while.body ], [ %count , %entry ]
60- %sub = add i64 %iv , -8
61- %exitcond.not = icmp ugt i64 %sub , 7
62- br i1 %exitcond.not , label %while.body , label %while.loopexit
46+ b1:
47+ %cmp1 = icmp ult i16 %a , 2
48+ br i1 %cmp1 , label %exit , label %preheader
6349
64- while.loopexit :
65- %sub.exit = phi i64 [ %sub , %while.body ]
66- br label %epilogue. preheader
50+ b2 :
51+ %cmp2 = icmp ult i16 %b , 5
52+ br i1 %cmp2 , label %exit , label % preheader
6753
68- epilogue. preheader:
69- %count.epilogue = phi i64 [ %count , %entry ], [ %sub.exit , %while.loopexit ]
70- %epilogue.cmp = icmp eq i64 %count.epilogue , 0
71- br i1 %epilogue.cmp , label %exit , label %epilogue
54+ preheader:
55+ %count = phi i16 [ %a , %b1 ], [ %b , %b2 ]
56+ %cmp3 = icmp ule i16 %count , 20
57+ br i1 %cmp3 , label %loop , label %exit
7258
73- epilogue :
74- %iv.epilogue = phi i64 [ %dec , %epilogue ], [ %count.epilogue , %epilogue. preheader ]
75- %dec = add i64 %iv.epilogue , - 1
76- %exitcond.epilogue = icmp eq i64 %dec , 0
77- br i1 %exitcond.epilogue , label %exit , label %epilogue
59+ loop :
60+ %iv = phi i16 [ %iv.next , %loop ], [ %count , %preheader ]
61+ %iv.next = add i16 %iv , 1
62+ %exitcond = icmp eq i16 %iv.next , 22
63+ br i1 %exitcond , label %exit , label %loop
7864
7965exit:
8066 ret void
8167}
8268
83- define void @slt (i16 %a , i16 %b , i1 %c ) {
84- ; CHECK-LABEL: 'slt '
85- ; CHECK-NEXT: Determining loop execution counts for: @slt
86- ; CHECK-NEXT: Loop %loop: backedge-taken count is (63 + ( -1 * %count) )
87- ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -32704
88- ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (63 + ( -1 * %count) )
69+ define void @sgt (i16 %a , i16 %b , i1 %c ) {
70+ ; CHECK-LABEL: 'sgt '
71+ ; CHECK-NEXT: Determining loop execution counts for: @sgt
72+ ; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)
73+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 9
74+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)
8975; CHECK-NEXT: Loop %loop: Trip multiple is 1
9076entry:
9177 br i1 %c , label %b1 , label %b2
9278
9379b1:
94- %cmp1 = icmp slt i16 %a , 8
95- br i1 %cmp1 , label %preheader , label %exit
80+ %cmp1 = icmp sgt i16 %a , 10
81+ br i1 %cmp1 , label %exit , label %preheader
9682
9783b2:
98- %cmp2 = icmp slt i16 %b , 8
99- br i1 %cmp2 , label %preheader , label %exit
84+ %cmp2 = icmp sgt i16 %b , 8
85+ br i1 %cmp2 , label %exit , label %preheader
10086
10187preheader:
10288 %count = phi i16 [ %a , %b1 ], [ %b , %b2 ]
103- br label %loop
89+ %cmp3 = icmp sge i16 %count , 1
90+ br i1 %cmp3 , label %loop , label %exit
10491
10592loop:
10693 %iv = phi i16 [ %iv.next , %loop ], [ %count , %preheader ]
107- %iv.next = add i16 %iv , 1
108- %exitcond = icmp slt i16 %iv.next , 64
109- br i1 %exitcond , label %loop , label %exit
94+ %iv.next = add i16 %iv , - 1
95+ %exitcond = icmp eq i16 %iv.next , 0
96+ br i1 %exitcond , label %exit , label %loop
11097
11198exit:
11299 ret void
113100}
114101
115- define void @ult (i16 %a , i16 %b , i1 %c ) {
116- ; CHECK-LABEL: 'ult '
117- ; CHECK-NEXT: Determining loop execution counts for: @ult
118- ; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)
119- ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -2
120- ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)
102+ define void @ugt (i16 %a , i16 %b , i1 %c ) {
103+ ; CHECK-LABEL: 'ugt '
104+ ; CHECK-NEXT: Determining loop execution counts for: @ugt
105+ ; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)<nsw>
106+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 10
107+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)<nsw>
121108; CHECK-NEXT: Loop %loop: Trip multiple is 1
122109entry:
123110 br i1 %c , label %b1 , label %b2
124111
125112b1:
126- %cmp1 = icmp ult i16 %a , 8
113+ %cmp1 = icmp ugt i16 %a , 11
127114 br i1 %cmp1 , label %exit , label %preheader
128115
129116b2:
130- %cmp2 = icmp ult i16 %b , 8
117+ %cmp2 = icmp ugt i16 %b , 7
131118 br i1 %cmp2 , label %exit , label %preheader
132119
133120preheader:
134121 %count = phi i16 [ %a , %b1 ], [ %b , %b2 ]
135- br label %loop
122+ %cmp3 = icmp ne i16 %count , 0
123+ br i1 %cmp3 , label %loop , label %exit
136124
137125loop:
138126 %iv = phi i16 [ %iv.next , %loop ], [ %count , %preheader ]
@@ -144,66 +132,147 @@ exit:
144132 ret void
145133}
146134
147- define void @sgt (i16 %a , i16 %b , i1 %c ) {
148- ; CHECK-LABEL: 'sgt '
149- ; CHECK-NEXT: Determining loop execution counts for: @sgt
150- ; CHECK-NEXT: Loop %loop: backedge-taken count is %count
151- ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 32767
152- ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %count
135+ define void @three_incoming (i16 %a , i16 %b , i1 %c , i1 %d ) {
136+ ; CHECK-LABEL: 'three_incoming '
137+ ; CHECK-NEXT: Determining loop execution counts for: @three_incoming
138+ ; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)<nsw>
139+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 11
140+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)<nsw>
153141; CHECK-NEXT: Loop %loop: Trip multiple is 1
154142entry:
155- br i1 %c , label %b1 , label %b2
143+ br i1 %c , label %b1 , label %entry2
144+
145+ entry2:
146+ br i1 %d , label %b2 , label %b3
156147
157148b1:
158- %cmp1 = icmp sgt i16 %a , 8
159- br i1 %cmp1 , label %preheader , label %exit
149+ %cmp1 = icmp ugt i16 %a , 10
150+ br i1 %cmp1 , label %exit , label %preheader
160151
161152b2:
162- %cmp2 = icmp sgt i16 %b , 8
163- br i1 %cmp2 , label %preheader , label %exit
153+ %cmp2 = icmp ugt i16 %b , 8
154+ br i1 %cmp2 , label %exit , label %preheader
155+
156+ b3:
157+ %cmp3 = icmp ugt i16 %b , 12
158+ br i1 %cmp3 , label %exit , label %preheader
164159
165160preheader:
166- %count = phi i16 [ %a , %b1 ], [ %b , %b2 ]
167- br label %loop
161+ %count = phi i16 [ %a , %b1 ], [ %b , %b2 ], [ %b , %b3 ]
162+ %cmp4 = icmp ne i16 %count , 0
163+ br i1 %cmp4 , label %loop , label %exit
168164
169165loop:
170166 %iv = phi i16 [ %iv.next , %loop ], [ %count , %preheader ]
171167 %iv.next = add i16 %iv , -1
172- %exitcond = icmp slt i16 %iv.next , 0
168+ %exitcond = icmp eq i16 %iv.next , 0
173169 br i1 %exitcond , label %exit , label %loop
174170
175171exit:
176172 ret void
177173}
178174
179-
180175define void @mixed (i16 %a , i16 %b , i1 %c ) {
181176; CHECK-LABEL: 'mixed'
182177; CHECK-NEXT: Determining loop execution counts for: @mixed
183- ; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (-1 * %count) + (64 smax (1 + %count)) )
184- ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -32704
185- ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (-1 * %count) + (64 smax (1 + %count)) )
178+ ; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)
179+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -2
180+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)
186181; CHECK-NEXT: Loop %loop: Trip multiple is 1
187182entry:
188183 br i1 %c , label %b1 , label %b2
189184
190185b1:
191- %cmp1 = icmp slt i16 %a , 8
192- br i1 %cmp1 , label %preheader , label %exit
186+ %cmp1 = icmp ugt i16 %a , 10
187+ br i1 %cmp1 , label %exit , label %preheader
193188
194189b2:
195- %cmp2 = icmp ult i16 %b , 8
196- br i1 %cmp2 , label %preheader , label %exit
190+ %cmp2 = icmp sgt i16 %b , 8
191+ br i1 %cmp2 , label %exit , label %preheader
197192
198193preheader:
199194 %count = phi i16 [ %a , %b1 ], [ %b , %b2 ]
200- br label %loop
195+ %cmp3 = icmp ne i16 %count , 0
196+ br i1 %cmp3 , label %loop , label %exit
201197
202198loop:
203199 %iv = phi i16 [ %iv.next , %loop ], [ %count , %preheader ]
204- %iv.next = add i16 %iv , 1
205- %exitcond = icmp slt i16 %iv.next , 64
206- br i1 %exitcond , label %loop , label %exit
200+ %iv.next = add i16 %iv , -1
201+ %exitcond = icmp eq i16 %iv.next , 0
202+ br i1 %exitcond , label %exit , label %loop
203+
204+ exit:
205+ ret void
206+ }
207+
208+ define void @one_constant (i16 %a , i16 %b , i1 %c , i16 %d ) {
209+ ; CHECK-LABEL: 'one_constant'
210+ ; CHECK-NEXT: Determining loop execution counts for: @one_constant
211+ ; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)
212+ ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -2
213+ ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)
214+ ; CHECK-NEXT: Loop %loop: Trip multiple is 1
215+ entry:
216+ br i1 %c , label %b1 , label %b2
217+
218+ b1:
219+ %cmp1 = icmp ugt i16 %a , 10
220+ br i1 %cmp1 , label %exit , label %preheader
221+
222+ b2:
223+ %cmp2 = icmp ugt i16 %b , %d
224+ br i1 %cmp2 , label %exit , label %preheader
225+
226+ preheader:
227+ %count = phi i16 [ %a , %b1 ], [ %b , %b2 ]
228+ %cmp3 = icmp ne i16 %count , 0
229+ br i1 %cmp3 , label %loop , label %exit
230+
231+ loop:
232+ %iv = phi i16 [ %iv.next , %loop ], [ %count , %preheader ]
233+ %iv.next = add i16 %iv , -1
234+ %exitcond = icmp eq i16 %iv.next , 0
235+ br i1 %exitcond , label %exit , label %loop
236+
237+ exit:
238+ ret void
239+ }
240+
241+ define void @epilogue (i64 %count ) {
242+ ; CHECK-LABEL: 'epilogue'
243+ ; CHECK-NEXT: Determining loop execution counts for: @epilogue
244+ ; CHECK-NEXT: Loop %epilogue: backedge-taken count is (-1 + %count.epilogue)
245+ ; CHECK-NEXT: Loop %epilogue: constant max backedge-taken count is i64 6
246+ ; CHECK-NEXT: Loop %epilogue: symbolic max backedge-taken count is (-1 + %count.epilogue)
247+ ; CHECK-NEXT: Loop %epilogue: Trip multiple is 1
248+ ; CHECK-NEXT: Loop %while.body: backedge-taken count is ((-8 + %count) /u 8)
249+ ; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i64 2305843009213693951
250+ ; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is ((-8 + %count) /u 8)
251+ ; CHECK-NEXT: Loop %while.body: Trip multiple is 1
252+ entry:
253+ %cmp = icmp ugt i64 %count , 7
254+ br i1 %cmp , label %while.body , label %epilogue.preheader
255+
256+ while.body:
257+ %iv = phi i64 [ %sub , %while.body ], [ %count , %entry ]
258+ %sub = add i64 %iv , -8
259+ %exitcond.not = icmp ugt i64 %sub , 7
260+ br i1 %exitcond.not , label %while.body , label %while.loopexit
261+
262+ while.loopexit:
263+ %sub.exit = phi i64 [ %sub , %while.body ]
264+ br label %epilogue.preheader
265+
266+ epilogue.preheader:
267+ %count.epilogue = phi i64 [ %count , %entry ], [ %sub.exit , %while.loopexit ]
268+ %epilogue.cmp = icmp eq i64 %count.epilogue , 0
269+ br i1 %epilogue.cmp , label %exit , label %epilogue
270+
271+ epilogue:
272+ %iv.epilogue = phi i64 [ %dec , %epilogue ], [ %count.epilogue , %epilogue.preheader ]
273+ %dec = add i64 %iv.epilogue , -1
274+ %exitcond.epilogue = icmp eq i64 %dec , 0
275+ br i1 %exitcond.epilogue , label %exit , label %epilogue
207276
208277exit:
209278 ret void
0 commit comments