1 ; RUN: llc < %s -mtriple=x86_64-- > %t
2 ; RUN: grep and %t | count 6
3 ; RUN: grep movzb %t | count 6
4 ; RUN: grep sar %t | count 12
6 ; Don't optimize away zext-inreg and sext-inreg on the loop induction
7 ; variable, because it isn't safe to do so in these cases.
9 define void @count_up(double* %d, i64 %n) nounwind {
14 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
15 %indvar.i8 = and i64 %indvar, 255
16 %t0 = getelementptr double, double* %d, i64 %indvar.i8
17 %t1 = load double, double* %t0
18 %t2 = fmul double %t1, 0.1
19 store double %t2, double* %t0
20 %indvar.i24 = and i64 %indvar, 16777215
21 %t3 = getelementptr double, double* %d, i64 %indvar.i24
22 %t4 = load double, double* %t3
23 %t5 = fmul double %t4, 2.3
24 store double %t5, double* %t3
25 %t6 = getelementptr double, double* %d, i64 %indvar
26 %t7 = load double, double* %t6
27 %t8 = fmul double %t7, 4.5
28 store double %t8, double* %t6
29 %indvar.next = add i64 %indvar, 1
30 %exitcond = icmp eq i64 %indvar.next, 0
31 br i1 %exitcond, label %return, label %loop
37 define void @count_down(double* %d, i64 %n) nounwind {
42 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
43 %indvar.i8 = and i64 %indvar, 255
44 %t0 = getelementptr double, double* %d, i64 %indvar.i8
45 %t1 = load double, double* %t0
46 %t2 = fmul double %t1, 0.1
47 store double %t2, double* %t0
48 %indvar.i24 = and i64 %indvar, 16777215
49 %t3 = getelementptr double, double* %d, i64 %indvar.i24
50 %t4 = load double, double* %t3
51 %t5 = fmul double %t4, 2.3
52 store double %t5, double* %t3
53 %t6 = getelementptr double, double* %d, i64 %indvar
54 %t7 = load double, double* %t6
55 %t8 = fmul double %t7, 4.5
56 store double %t8, double* %t6
57 %indvar.next = sub i64 %indvar, 1
58 %exitcond = icmp eq i64 %indvar.next, 20
59 br i1 %exitcond, label %return, label %loop
65 define void @count_up_signed(double* %d, i64 %n) nounwind {
70 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
71 %s0 = shl i64 %indvar, 8
72 %indvar.i8 = ashr i64 %s0, 8
73 %t0 = getelementptr double, double* %d, i64 %indvar.i8
74 %t1 = load double, double* %t0
75 %t2 = fmul double %t1, 0.1
76 store double %t2, double* %t0
77 %s1 = shl i64 %indvar, 24
78 %indvar.i24 = ashr i64 %s1, 24
79 %t3 = getelementptr double, double* %d, i64 %indvar.i24
80 %t4 = load double, double* %t3
81 %t5 = fmul double %t4, 2.3
82 store double %t5, double* %t3
83 %t6 = getelementptr double, double* %d, i64 %indvar
84 %t7 = load double, double* %t6
85 %t8 = fmul double %t7, 4.5
86 store double %t8, double* %t6
87 %indvar.next = add i64 %indvar, 1
88 %exitcond = icmp eq i64 %indvar.next, 0
89 br i1 %exitcond, label %return, label %loop
95 define void @count_down_signed(double* %d, i64 %n) nounwind {
100 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
101 %s0 = shl i64 %indvar, 8
102 %indvar.i8 = ashr i64 %s0, 8
103 %t0 = getelementptr double, double* %d, i64 %indvar.i8
104 %t1 = load double, double* %t0
105 %t2 = fmul double %t1, 0.1
106 store double %t2, double* %t0
107 %s1 = shl i64 %indvar, 24
108 %indvar.i24 = ashr i64 %s1, 24
109 %t3 = getelementptr double, double* %d, i64 %indvar.i24
110 %t4 = load double, double* %t3
111 %t5 = fmul double %t4, 2.3
112 store double %t5, double* %t3
113 %t6 = getelementptr double, double* %d, i64 %indvar
114 %t7 = load double, double* %t6
115 %t8 = fmul double %t7, 4.5
116 store double %t8, double* %t6
117 %indvar.next = sub i64 %indvar, 1
118 %exitcond = icmp eq i64 %indvar.next, 20
119 br i1 %exitcond, label %return, label %loop
125 define void @another_count_up(double* %d, i64 %n) nounwind {
130 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
131 %indvar.i8 = and i64 %indvar, 255
132 %t0 = getelementptr double, double* %d, i64 %indvar.i8
133 %t1 = load double, double* %t0
134 %t2 = fmul double %t1, 0.1
135 store double %t2, double* %t0
136 %indvar.i24 = and i64 %indvar, 16777215
137 %t3 = getelementptr double, double* %d, i64 %indvar.i24
138 %t4 = load double, double* %t3
139 %t5 = fmul double %t4, 2.3
140 store double %t5, double* %t3
141 %t6 = getelementptr double, double* %d, i64 %indvar
142 %t7 = load double, double* %t6
143 %t8 = fmul double %t7, 4.5
144 store double %t8, double* %t6
145 %indvar.next = add i64 %indvar, 1
146 %exitcond = icmp eq i64 %indvar.next, %n
147 br i1 %exitcond, label %return, label %loop
153 define void @another_count_down(double* %d, i64 %n) nounwind {
158 %indvar = phi i64 [ %n, %entry ], [ %indvar.next, %loop ]
159 %indvar.i8 = and i64 %indvar, 255
160 %t0 = getelementptr double, double* %d, i64 %indvar.i8
161 %t1 = load double, double* %t0
162 %t2 = fmul double %t1, 0.1
163 store double %t2, double* %t0
164 %indvar.i24 = and i64 %indvar, 16777215
165 %t3 = getelementptr double, double* %d, i64 %indvar.i24
166 %t4 = load double, double* %t3
167 %t5 = fmul double %t4, 2.3
168 store double %t5, double* %t3
169 %t6 = getelementptr double, double* %d, i64 %indvar
170 %t7 = load double, double* %t6
171 %t8 = fmul double %t7, 4.5
172 store double %t8, double* %t6
173 %indvar.next = sub i64 %indvar, 1
174 %exitcond = icmp eq i64 %indvar.next, 10
175 br i1 %exitcond, label %return, label %loop
181 define void @another_count_up_signed(double* %d, i64 %n) nounwind {
186 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
187 %s0 = shl i64 %indvar, 8
188 %indvar.i8 = ashr i64 %s0, 8
189 %t0 = getelementptr double, double* %d, i64 %indvar.i8
190 %t1 = load double, double* %t0
191 %t2 = fmul double %t1, 0.1
192 store double %t2, double* %t0
193 %s1 = shl i64 %indvar, 24
194 %indvar.i24 = ashr i64 %s1, 24
195 %t3 = getelementptr double, double* %d, i64 %indvar.i24
196 %t4 = load double, double* %t3
197 %t5 = fmul double %t4, 2.3
198 store double %t5, double* %t3
199 %t6 = getelementptr double, double* %d, i64 %indvar
200 %t7 = load double, double* %t6
201 %t8 = fmul double %t7, 4.5
202 store double %t8, double* %t6
203 %indvar.next = add i64 %indvar, 1
204 %exitcond = icmp eq i64 %indvar.next, %n
205 br i1 %exitcond, label %return, label %loop
211 define void @another_count_down_signed(double* %d, i64 %n) nounwind {
216 %indvar = phi i64 [ %n, %entry ], [ %indvar.next, %loop ]
217 %s0 = shl i64 %indvar, 8
218 %indvar.i8 = ashr i64 %s0, 8
219 %t0 = getelementptr double, double* %d, i64 %indvar.i8
220 %t1 = load double, double* %t0
221 %t2 = fmul double %t1, 0.1
222 store double %t2, double* %t0
223 %s1 = shl i64 %indvar, 24
224 %indvar.i24 = ashr i64 %s1, 24
225 %t3 = getelementptr double, double* %d, i64 %indvar.i24
226 %t4 = load double, double* %t3
227 %t5 = fmul double %t4, 2.3
228 store double %t5, double* %t3
229 %t6 = getelementptr double, double* %d, i64 %indvar
230 %t7 = load double, double* %t6
231 %t8 = fmul double %t7, 4.5
232 store double %t8, double* %t6
233 %indvar.next = sub i64 %indvar, 1
234 %exitcond = icmp eq i64 %indvar.next, 10
235 br i1 %exitcond, label %return, label %loop
241 define void @yet_another_count_down(double* %d, i64 %n) nounwind {
246 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
247 %indvar.i8 = and i64 %indvar, 255
248 %t0 = getelementptr double, double* %d, i64 %indvar.i8
249 %t1 = load double, double* %t0
250 %t2 = fmul double %t1, 0.1
251 store double %t2, double* %t0
252 %indvar.i24 = and i64 %indvar, 16777215
253 %t3 = getelementptr double, double* %d, i64 %indvar.i24
254 %t4 = load double, double* %t3
255 %t5 = fmul double %t4, 2.3
256 store double %t5, double* %t3
257 %t6 = getelementptr double, double* %d, i64 %indvar
258 %t7 = load double, double* %t6
259 %t8 = fmul double %t7, 4.5
260 store double %t8, double* %t6
261 %indvar.next = sub i64 %indvar, 1
262 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615
263 br i1 %exitcond, label %return, label %loop
269 define void @yet_another_count_up(double* %d, i64 %n) nounwind {
274 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
275 %indvar.i8 = and i64 %indvar, 255
276 %t0 = getelementptr double, double* %d, i64 %indvar.i8
277 %t1 = load double, double* %t0
278 %t2 = fmul double %t1, 0.1
279 store double %t2, double* %t0
280 %indvar.i24 = and i64 %indvar, 16777215
281 %t3 = getelementptr double, double* %d, i64 %indvar.i24
282 %t4 = load double, double* %t3
283 %t5 = fmul double %t4, 2.3
284 store double %t5, double* %t3
285 %t6 = getelementptr double, double* %d, i64 %indvar
286 %t7 = load double, double* %t6
287 %t8 = fmul double %t7, 4.5
288 store double %t8, double* %t6
289 %indvar.next = add i64 %indvar, 3
290 %exitcond = icmp eq i64 %indvar.next, 10
291 br i1 %exitcond, label %return, label %loop
297 define void @still_another_count_down(double* %d, i64 %n) nounwind {
302 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
303 %indvar.i8 = and i64 %indvar, 255
304 %t0 = getelementptr double, double* %d, i64 %indvar.i8
305 %t1 = load double, double* %t0
306 %t2 = fmul double %t1, 0.1
307 store double %t2, double* %t0
308 %indvar.i24 = and i64 %indvar, 16777215
309 %t3 = getelementptr double, double* %d, i64 %indvar.i24
310 %t4 = load double, double* %t3
311 %t5 = fmul double %t4, 2.3
312 store double %t5, double* %t3
313 %t6 = getelementptr double, double* %d, i64 %indvar
314 %t7 = load double, double* %t6
315 %t8 = fmul double %t7, 4.5
316 store double %t8, double* %t6
317 %indvar.next = sub i64 %indvar, 3
318 %exitcond = icmp eq i64 %indvar.next, 0
319 br i1 %exitcond, label %return, label %loop
325 define void @yet_another_count_up_signed(double* %d, i64 %n) nounwind {
330 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
331 %s0 = shl i64 %indvar, 8
332 %indvar.i8 = ashr i64 %s0, 8
333 %t0 = getelementptr double, double* %d, i64 %indvar.i8
334 %t1 = load double, double* %t0
335 %t2 = fmul double %t1, 0.1
336 store double %t2, double* %t0
337 %s1 = shl i64 %indvar, 24
338 %indvar.i24 = ashr i64 %s1, 24
339 %t3 = getelementptr double, double* %d, i64 %indvar.i24
340 %t4 = load double, double* %t3
341 %t5 = fmul double %t4, 2.3
342 store double %t5, double* %t3
343 %t6 = getelementptr double, double* %d, i64 %indvar
344 %t7 = load double, double* %t6
345 %t8 = fmul double %t7, 4.5
346 store double %t8, double* %t6
347 %indvar.next = add i64 %indvar, 3
348 %exitcond = icmp eq i64 %indvar.next, 10
349 br i1 %exitcond, label %return, label %loop
355 define void @yet_another_count_down_signed(double* %d, i64 %n) nounwind {
360 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
361 %s0 = shl i64 %indvar, 8
362 %indvar.i8 = ashr i64 %s0, 8
363 %t0 = getelementptr double, double* %d, i64 %indvar.i8
364 %t1 = load double, double* %t0
365 %t2 = fmul double %t1, 0.1
366 store double %t2, double* %t0
367 %s1 = shl i64 %indvar, 24
368 %indvar.i24 = ashr i64 %s1, 24
369 %t3 = getelementptr double, double* %d, i64 %indvar.i24
370 %t4 = load double, double* %t3
371 %t5 = fmul double %t4, 2.3
372 store double %t5, double* %t3
373 %t6 = getelementptr double, double* %d, i64 %indvar
374 %t7 = load double, double* %t6
375 %t8 = fmul double %t7, 4.5
376 store double %t8, double* %t6
377 %indvar.next = sub i64 %indvar, 3
378 %exitcond = icmp eq i64 %indvar.next, 0
379 br i1 %exitcond, label %return, label %loop