blob: 639a7a6a3bb0a6dc5aaf0d415ce4d32a19bad971 [file] [log] [blame]
Dan Gohman01ecca22009-04-27 20:16:15 +00001; RUN: llvm-as < %s | llc -march=x86-64 > %t
2; RUN: grep and %t | count 6
3; RUN: grep movzb %t | count 6
4; RUN: grep sar %t | count 12
5
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.
8
9define void @count_up(double* %d, i64 %n) nounwind {
10entry:
11 br label %loop
12
13loop:
14 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
15 %indvar.i8 = and i64 %indvar, 255
16 %t0 = getelementptr double* %d, i64 %indvar.i8
17 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +000018 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +000019 store double %t2, double* %t0
20 %indvar.i24 = and i64 %indvar, 16777215
21 %t3 = getelementptr double* %d, i64 %indvar.i24
22 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +000023 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +000024 store double %t5, double* %t3
25 %t6 = getelementptr double* %d, i64 %indvar
26 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +000027 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +000028 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
32
33return:
34 ret void
35}
36
37define void @count_down(double* %d, i64 %n) nounwind {
38entry:
39 br label %loop
40
41loop:
42 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
43 %indvar.i8 = and i64 %indvar, 255
44 %t0 = getelementptr double* %d, i64 %indvar.i8
45 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +000046 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +000047 store double %t2, double* %t0
48 %indvar.i24 = and i64 %indvar, 16777215
49 %t3 = getelementptr double* %d, i64 %indvar.i24
50 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +000051 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +000052 store double %t5, double* %t3
53 %t6 = getelementptr double* %d, i64 %indvar
54 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +000055 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +000056 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
60
61return:
62 ret void
63}
64
65define void @count_up_signed(double* %d, i64 %n) nounwind {
66entry:
67 br label %loop
68
69loop:
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* %d, i64 %indvar.i8
74 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +000075 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +000076 store double %t2, double* %t0
77 %s1 = shl i64 %indvar, 24
78 %indvar.i24 = ashr i64 %s1, 24
79 %t3 = getelementptr double* %d, i64 %indvar.i24
80 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +000081 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +000082 store double %t5, double* %t3
83 %t6 = getelementptr double* %d, i64 %indvar
84 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +000085 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +000086 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
90
91return:
92 ret void
93}
94
95define void @count_down_signed(double* %d, i64 %n) nounwind {
96entry:
97 br label %loop
98
99loop:
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* %d, i64 %indvar.i8
104 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000105 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000106 store double %t2, double* %t0
107 %s1 = shl i64 %indvar, 24
108 %indvar.i24 = ashr i64 %s1, 24
109 %t3 = getelementptr double* %d, i64 %indvar.i24
110 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000111 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000112 store double %t5, double* %t3
113 %t6 = getelementptr double* %d, i64 %indvar
114 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000115 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000116 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
120
121return:
122 ret void
123}
124
125define void @another_count_up(double* %d, i64 %n) nounwind {
126entry:
127 br label %loop
128
129loop:
130 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
131 %indvar.i8 = and i64 %indvar, 255
132 %t0 = getelementptr double* %d, i64 %indvar.i8
133 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000134 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000135 store double %t2, double* %t0
136 %indvar.i24 = and i64 %indvar, 16777215
137 %t3 = getelementptr double* %d, i64 %indvar.i24
138 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000139 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000140 store double %t5, double* %t3
141 %t6 = getelementptr double* %d, i64 %indvar
142 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000143 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000144 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
148
149return:
150 ret void
151}
152
153define void @another_count_down(double* %d, i64 %n) nounwind {
154entry:
155 br label %loop
156
157loop:
158 %indvar = phi i64 [ %n, %entry ], [ %indvar.next, %loop ]
159 %indvar.i8 = and i64 %indvar, 255
160 %t0 = getelementptr double* %d, i64 %indvar.i8
161 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000162 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000163 store double %t2, double* %t0
164 %indvar.i24 = and i64 %indvar, 16777215
165 %t3 = getelementptr double* %d, i64 %indvar.i24
166 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000167 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000168 store double %t5, double* %t3
169 %t6 = getelementptr double* %d, i64 %indvar
170 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000171 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000172 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
176
177return:
178 ret void
179}
180
181define void @another_count_up_signed(double* %d, i64 %n) nounwind {
182entry:
183 br label %loop
184
185loop:
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* %d, i64 %indvar.i8
190 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000191 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000192 store double %t2, double* %t0
193 %s1 = shl i64 %indvar, 24
194 %indvar.i24 = ashr i64 %s1, 24
195 %t3 = getelementptr double* %d, i64 %indvar.i24
196 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000197 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000198 store double %t5, double* %t3
199 %t6 = getelementptr double* %d, i64 %indvar
200 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000201 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000202 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
206
207return:
208 ret void
209}
210
211define void @another_count_down_signed(double* %d, i64 %n) nounwind {
212entry:
213 br label %loop
214
215loop:
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* %d, i64 %indvar.i8
220 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000221 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000222 store double %t2, double* %t0
223 %s1 = shl i64 %indvar, 24
224 %indvar.i24 = ashr i64 %s1, 24
225 %t3 = getelementptr double* %d, i64 %indvar.i24
226 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000227 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000228 store double %t5, double* %t3
229 %t6 = getelementptr double* %d, i64 %indvar
230 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000231 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000232 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
236
237return:
238 ret void
239}
240
241define void @yet_another_count_down(double* %d, i64 %n) nounwind {
242entry:
243 br label %loop
244
245loop:
246 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
247 %indvar.i8 = and i64 %indvar, 255
248 %t0 = getelementptr double* %d, i64 %indvar.i8
249 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000250 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000251 store double %t2, double* %t0
252 %indvar.i24 = and i64 %indvar, 16777215
253 %t3 = getelementptr double* %d, i64 %indvar.i24
254 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000255 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000256 store double %t5, double* %t3
257 %t6 = getelementptr double* %d, i64 %indvar
258 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000259 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000260 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
264
265return:
266 ret void
267}
268
269define void @yet_another_count_up(double* %d, i64 %n) nounwind {
270entry:
271 br label %loop
272
273loop:
274 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
275 %indvar.i8 = and i64 %indvar, 255
276 %t0 = getelementptr double* %d, i64 %indvar.i8
277 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000278 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000279 store double %t2, double* %t0
280 %indvar.i24 = and i64 %indvar, 16777215
281 %t3 = getelementptr double* %d, i64 %indvar.i24
282 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000283 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000284 store double %t5, double* %t3
285 %t6 = getelementptr double* %d, i64 %indvar
286 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000287 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000288 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
292
293return:
294 ret void
295}
296
297define void @still_another_count_down(double* %d, i64 %n) nounwind {
298entry:
299 br label %loop
300
301loop:
302 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
303 %indvar.i8 = and i64 %indvar, 255
304 %t0 = getelementptr double* %d, i64 %indvar.i8
305 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000306 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000307 store double %t2, double* %t0
308 %indvar.i24 = and i64 %indvar, 16777215
309 %t3 = getelementptr double* %d, i64 %indvar.i24
310 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000311 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000312 store double %t5, double* %t3
313 %t6 = getelementptr double* %d, i64 %indvar
314 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000315 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000316 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
320
321return:
322 ret void
323}
324
325define void @yet_another_count_up_signed(double* %d, i64 %n) nounwind {
326entry:
327 br label %loop
328
329loop:
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* %d, i64 %indvar.i8
334 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000335 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000336 store double %t2, double* %t0
337 %s1 = shl i64 %indvar, 24
338 %indvar.i24 = ashr i64 %s1, 24
339 %t3 = getelementptr double* %d, i64 %indvar.i24
340 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000341 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000342 store double %t5, double* %t3
343 %t6 = getelementptr double* %d, i64 %indvar
344 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000345 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000346 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
350
351return:
352 ret void
353}
354
355define void @yet_another_count_down_signed(double* %d, i64 %n) nounwind {
356entry:
357 br label %loop
358
359loop:
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* %d, i64 %indvar.i8
364 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000365 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000366 store double %t2, double* %t0
367 %s1 = shl i64 %indvar, 24
368 %indvar.i24 = ashr i64 %s1, 24
369 %t3 = getelementptr double* %d, i64 %indvar.i24
370 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000371 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000372 store double %t5, double* %t3
373 %t6 = getelementptr double* %d, i64 %indvar
374 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000375 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000376 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
380
381return:
382 ret void
383}
384
385
386