blob: 0bf347c64271e08742ea2ca8d9a9f69dbac8efd2 [file] [log] [blame]
Dan Gohman01ecca22009-04-27 20:16:15 +00001; RUN: llvm-as < %s | llc -march=x86-64 > %t
2; RUN: not grep and %t
3; RUN: not grep movz %t
4; RUN: not grep sar %t
5; RUN: not grep shl %t
Dan Gohman81db61a2009-05-12 02:17:14 +00006; RUN: grep add %t | count 2
7; RUN: grep inc %t | count 4
8; RUN: grep dec %t | count 2
Dan Gohman01ecca22009-04-27 20:16:15 +00009; RUN: grep lea %t | count 2
10
11; Optimize away zext-inreg and sext-inreg on the loop induction
12; variable using trip-count information.
Dan Gohman01ecca22009-04-27 20:16:15 +000013
14define void @count_up(double* %d, i64 %n) nounwind {
15entry:
16 br label %loop
17
18loop:
19 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
20 %indvar.i8 = and i64 %indvar, 255
21 %t0 = getelementptr double* %d, i64 %indvar.i8
22 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +000023 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +000024 store double %t2, double* %t0
25 %indvar.i24 = and i64 %indvar, 16777215
26 %t3 = getelementptr double* %d, i64 %indvar.i24
27 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +000028 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +000029 store double %t5, double* %t3
30 %t6 = getelementptr double* %d, i64 %indvar
31 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +000032 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +000033 store double %t8, double* %t6
34 %indvar.next = add i64 %indvar, 1
35 %exitcond = icmp eq i64 %indvar.next, 10
36 br i1 %exitcond, label %return, label %loop
37
38return:
39 ret void
40}
41
42define void @count_down(double* %d, i64 %n) nounwind {
43entry:
44 br label %loop
45
46loop:
47 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
48 %indvar.i8 = and i64 %indvar, 255
49 %t0 = getelementptr double* %d, i64 %indvar.i8
50 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +000051 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +000052 store double %t2, double* %t0
53 %indvar.i24 = and i64 %indvar, 16777215
54 %t3 = getelementptr double* %d, i64 %indvar.i24
55 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +000056 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +000057 store double %t5, double* %t3
58 %t6 = getelementptr double* %d, i64 %indvar
59 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +000060 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +000061 store double %t8, double* %t6
62 %indvar.next = sub i64 %indvar, 1
63 %exitcond = icmp eq i64 %indvar.next, 0
64 br i1 %exitcond, label %return, label %loop
65
66return:
67 ret void
68}
69
70define void @count_up_signed(double* %d, i64 %n) nounwind {
71entry:
72 br label %loop
73
74loop:
75 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
76 %s0 = shl i64 %indvar, 8
77 %indvar.i8 = ashr i64 %s0, 8
78 %t0 = getelementptr double* %d, i64 %indvar.i8
79 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +000080 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +000081 store double %t2, double* %t0
82 %s1 = shl i64 %indvar, 24
83 %indvar.i24 = ashr i64 %s1, 24
84 %t3 = getelementptr double* %d, i64 %indvar.i24
85 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +000086 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +000087 store double %t5, double* %t3
88 %t6 = getelementptr double* %d, i64 %indvar
89 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +000090 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +000091 store double %t8, double* %t6
92 %indvar.next = add i64 %indvar, 1
93 %exitcond = icmp eq i64 %indvar.next, 10
94 br i1 %exitcond, label %return, label %loop
95
96return:
97 ret void
98}
99
100define void @count_down_signed(double* %d, i64 %n) nounwind {
101entry:
102 br label %loop
103
104loop:
105 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
106 %s0 = shl i64 %indvar, 8
107 %indvar.i8 = ashr i64 %s0, 8
108 %t0 = getelementptr double* %d, i64 %indvar.i8
109 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000110 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000111 store double %t2, double* %t0
112 %s1 = shl i64 %indvar, 24
113 %indvar.i24 = ashr i64 %s1, 24
114 %t3 = getelementptr double* %d, i64 %indvar.i24
115 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000116 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000117 store double %t5, double* %t3
118 %t6 = getelementptr double* %d, i64 %indvar
119 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000120 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000121 store double %t8, double* %t6
122 %indvar.next = sub i64 %indvar, 1
123 %exitcond = icmp eq i64 %indvar.next, 0
124 br i1 %exitcond, label %return, label %loop
125
126return:
127 ret void
128}
129
130define void @another_count_up(double* %d, i64 %n) nounwind {
131entry:
132 br label %loop
133
134loop:
135 %indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
136 %indvar.i8 = and i64 %indvar, 255
137 %t0 = getelementptr double* %d, i64 %indvar.i8
138 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000139 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000140 store double %t2, double* %t0
141 %indvar.i24 = and i64 %indvar, 16777215
142 %t3 = getelementptr double* %d, i64 %indvar.i24
143 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000144 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000145 store double %t5, double* %t3
146 %t6 = getelementptr double* %d, i64 %indvar
147 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000148 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000149 store double %t8, double* %t6
150 %indvar.next = add i64 %indvar, 1
151 %exitcond = icmp eq i64 %indvar.next, 0
152 br i1 %exitcond, label %return, label %loop
153
154return:
155 ret void
156}
157
158define void @another_count_down(double* %d, i64 %n) nounwind {
159entry:
160 br label %loop
161
162loop:
163 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
164 %indvar.i8 = and i64 %indvar, 255
165 %t0 = getelementptr double* %d, i64 %indvar.i8
166 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000167 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000168 store double %t2, double* %t0
169 %indvar.i24 = and i64 %indvar, 16777215
170 %t3 = getelementptr double* %d, i64 %indvar.i24
171 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000172 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000173 store double %t5, double* %t3
174 %t6 = getelementptr double* %d, i64 %indvar
175 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000176 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000177 store double %t8, double* %t6
178 %indvar.next = sub i64 %indvar, 1
179 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615
180 br i1 %exitcond, label %return, label %loop
181
182return:
183 ret void
184}
185
186define void @another_count_up_signed(double* %d, i64 %n) nounwind {
187entry:
188 br label %loop
189
190loop:
191 %indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
192 %s0 = shl i64 %indvar, 8
193 %indvar.i8 = ashr i64 %s0, 8
194 %t0 = getelementptr double* %d, i64 %indvar.i8
195 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000196 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000197 store double %t2, double* %t0
198 %s1 = shl i64 %indvar, 24
199 %indvar.i24 = ashr i64 %s1, 24
200 %t3 = getelementptr double* %d, i64 %indvar.i24
201 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000202 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000203 store double %t5, double* %t3
204 %t6 = getelementptr double* %d, i64 %indvar
205 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000206 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000207 store double %t8, double* %t6
208 %indvar.next = add i64 %indvar, 1
209 %exitcond = icmp eq i64 %indvar.next, 0
210 br i1 %exitcond, label %return, label %loop
211
212return:
213 ret void
214}
215
216define void @another_count_down_signed(double* %d, i64 %n) nounwind {
217entry:
218 br label %loop
219
220loop:
221 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
222 %s0 = shl i64 %indvar, 8
223 %indvar.i8 = ashr i64 %s0, 8
224 %t0 = getelementptr double* %d, i64 %indvar.i8
225 %t1 = load double* %t0
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000226 %t2 = fmul double %t1, 0.1
Dan Gohman01ecca22009-04-27 20:16:15 +0000227 store double %t2, double* %t0
228 %s1 = shl i64 %indvar, 24
229 %indvar.i24 = ashr i64 %s1, 24
230 %t3 = getelementptr double* %d, i64 %indvar.i24
231 %t4 = load double* %t3
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000232 %t5 = fmul double %t4, 2.3
Dan Gohman01ecca22009-04-27 20:16:15 +0000233 store double %t5, double* %t3
234 %t6 = getelementptr double* %d, i64 %indvar
235 %t7 = load double* %t6
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000236 %t8 = fmul double %t7, 4.5
Dan Gohman01ecca22009-04-27 20:16:15 +0000237 store double %t8, double* %t6
238 %indvar.next = sub i64 %indvar, 1
239 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615
240 br i1 %exitcond, label %return, label %loop
241
242return:
243 ret void
244}