blob: e9b80a4c42c356b32d92812198f4ab86bad5bea9 [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
6; RUN: grep add %t | count 6
Dale Johannesenc1acc3f2009-05-11 17:15:42 +00007; RUN: grep inc %t | count 2
8; RUN: grep dec %t | count 4
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.
Dale Johannesenc1acc3f2009-05-11 17:15:42 +000013; Also, the loop-reversal algorithm kicks in twice.
Dan Gohman01ecca22009-04-27 20:16:15 +000014
15define void @count_up(double* %d, i64 %n) nounwind {
16entry:
17 br label %loop
18
19loop:
20 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
21 %indvar.i8 = and i64 %indvar, 255
22 %t0 = getelementptr double* %d, i64 %indvar.i8
23 %t1 = load double* %t0
24 %t2 = mul double %t1, 0.1
25 store double %t2, double* %t0
26 %indvar.i24 = and i64 %indvar, 16777215
27 %t3 = getelementptr double* %d, i64 %indvar.i24
28 %t4 = load double* %t3
29 %t5 = mul double %t4, 2.3
30 store double %t5, double* %t3
31 %t6 = getelementptr double* %d, i64 %indvar
32 %t7 = load double* %t6
33 %t8 = mul double %t7, 4.5
34 store double %t8, double* %t6
35 %indvar.next = add i64 %indvar, 1
36 %exitcond = icmp eq i64 %indvar.next, 10
37 br i1 %exitcond, label %return, label %loop
38
39return:
40 ret void
41}
42
43define void @count_down(double* %d, i64 %n) nounwind {
44entry:
45 br label %loop
46
47loop:
48 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
49 %indvar.i8 = and i64 %indvar, 255
50 %t0 = getelementptr double* %d, i64 %indvar.i8
51 %t1 = load double* %t0
52 %t2 = mul double %t1, 0.1
53 store double %t2, double* %t0
54 %indvar.i24 = and i64 %indvar, 16777215
55 %t3 = getelementptr double* %d, i64 %indvar.i24
56 %t4 = load double* %t3
57 %t5 = mul double %t4, 2.3
58 store double %t5, double* %t3
59 %t6 = getelementptr double* %d, i64 %indvar
60 %t7 = load double* %t6
61 %t8 = mul double %t7, 4.5
62 store double %t8, double* %t6
63 %indvar.next = sub i64 %indvar, 1
64 %exitcond = icmp eq i64 %indvar.next, 0
65 br i1 %exitcond, label %return, label %loop
66
67return:
68 ret void
69}
70
71define void @count_up_signed(double* %d, i64 %n) nounwind {
72entry:
73 br label %loop
74
75loop:
76 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
77 %s0 = shl i64 %indvar, 8
78 %indvar.i8 = ashr i64 %s0, 8
79 %t0 = getelementptr double* %d, i64 %indvar.i8
80 %t1 = load double* %t0
81 %t2 = mul double %t1, 0.1
82 store double %t2, double* %t0
83 %s1 = shl i64 %indvar, 24
84 %indvar.i24 = ashr i64 %s1, 24
85 %t3 = getelementptr double* %d, i64 %indvar.i24
86 %t4 = load double* %t3
87 %t5 = mul double %t4, 2.3
88 store double %t5, double* %t3
89 %t6 = getelementptr double* %d, i64 %indvar
90 %t7 = load double* %t6
91 %t8 = mul double %t7, 4.5
92 store double %t8, double* %t6
93 %indvar.next = add i64 %indvar, 1
94 %exitcond = icmp eq i64 %indvar.next, 10
95 br i1 %exitcond, label %return, label %loop
96
97return:
98 ret void
99}
100
101define void @count_down_signed(double* %d, i64 %n) nounwind {
102entry:
103 br label %loop
104
105loop:
106 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
107 %s0 = shl i64 %indvar, 8
108 %indvar.i8 = ashr i64 %s0, 8
109 %t0 = getelementptr double* %d, i64 %indvar.i8
110 %t1 = load double* %t0
111 %t2 = mul double %t1, 0.1
112 store double %t2, double* %t0
113 %s1 = shl i64 %indvar, 24
114 %indvar.i24 = ashr i64 %s1, 24
115 %t3 = getelementptr double* %d, i64 %indvar.i24
116 %t4 = load double* %t3
117 %t5 = mul double %t4, 2.3
118 store double %t5, double* %t3
119 %t6 = getelementptr double* %d, i64 %indvar
120 %t7 = load double* %t6
121 %t8 = mul double %t7, 4.5
122 store double %t8, double* %t6
123 %indvar.next = sub i64 %indvar, 1
124 %exitcond = icmp eq i64 %indvar.next, 0
125 br i1 %exitcond, label %return, label %loop
126
127return:
128 ret void
129}
130
131define void @another_count_up(double* %d, i64 %n) nounwind {
132entry:
133 br label %loop
134
135loop:
136 %indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
137 %indvar.i8 = and i64 %indvar, 255
138 %t0 = getelementptr double* %d, i64 %indvar.i8
139 %t1 = load double* %t0
140 %t2 = mul double %t1, 0.1
141 store double %t2, double* %t0
142 %indvar.i24 = and i64 %indvar, 16777215
143 %t3 = getelementptr double* %d, i64 %indvar.i24
144 %t4 = load double* %t3
145 %t5 = mul double %t4, 2.3
146 store double %t5, double* %t3
147 %t6 = getelementptr double* %d, i64 %indvar
148 %t7 = load double* %t6
149 %t8 = mul double %t7, 4.5
150 store double %t8, double* %t6
151 %indvar.next = add i64 %indvar, 1
152 %exitcond = icmp eq i64 %indvar.next, 0
153 br i1 %exitcond, label %return, label %loop
154
155return:
156 ret void
157}
158
159define void @another_count_down(double* %d, i64 %n) nounwind {
160entry:
161 br label %loop
162
163loop:
164 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
165 %indvar.i8 = and i64 %indvar, 255
166 %t0 = getelementptr double* %d, i64 %indvar.i8
167 %t1 = load double* %t0
168 %t2 = mul double %t1, 0.1
169 store double %t2, double* %t0
170 %indvar.i24 = and i64 %indvar, 16777215
171 %t3 = getelementptr double* %d, i64 %indvar.i24
172 %t4 = load double* %t3
173 %t5 = mul double %t4, 2.3
174 store double %t5, double* %t3
175 %t6 = getelementptr double* %d, i64 %indvar
176 %t7 = load double* %t6
177 %t8 = mul double %t7, 4.5
178 store double %t8, double* %t6
179 %indvar.next = sub i64 %indvar, 1
180 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615
181 br i1 %exitcond, label %return, label %loop
182
183return:
184 ret void
185}
186
187define void @another_count_up_signed(double* %d, i64 %n) nounwind {
188entry:
189 br label %loop
190
191loop:
192 %indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
193 %s0 = shl i64 %indvar, 8
194 %indvar.i8 = ashr i64 %s0, 8
195 %t0 = getelementptr double* %d, i64 %indvar.i8
196 %t1 = load double* %t0
197 %t2 = mul double %t1, 0.1
198 store double %t2, double* %t0
199 %s1 = shl i64 %indvar, 24
200 %indvar.i24 = ashr i64 %s1, 24
201 %t3 = getelementptr double* %d, i64 %indvar.i24
202 %t4 = load double* %t3
203 %t5 = mul double %t4, 2.3
204 store double %t5, double* %t3
205 %t6 = getelementptr double* %d, i64 %indvar
206 %t7 = load double* %t6
207 %t8 = mul double %t7, 4.5
208 store double %t8, double* %t6
209 %indvar.next = add i64 %indvar, 1
210 %exitcond = icmp eq i64 %indvar.next, 0
211 br i1 %exitcond, label %return, label %loop
212
213return:
214 ret void
215}
216
217define void @another_count_down_signed(double* %d, i64 %n) nounwind {
218entry:
219 br label %loop
220
221loop:
222 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
223 %s0 = shl i64 %indvar, 8
224 %indvar.i8 = ashr i64 %s0, 8
225 %t0 = getelementptr double* %d, i64 %indvar.i8
226 %t1 = load double* %t0
227 %t2 = mul double %t1, 0.1
228 store double %t2, double* %t0
229 %s1 = shl i64 %indvar, 24
230 %indvar.i24 = ashr i64 %s1, 24
231 %t3 = getelementptr double* %d, i64 %indvar.i24
232 %t4 = load double* %t3
233 %t5 = mul double %t4, 2.3
234 store double %t5, double* %t3
235 %t6 = getelementptr double* %d, i64 %indvar
236 %t7 = load double* %t6
237 %t8 = mul double %t7, 4.5
238 store double %t8, double* %t6
239 %indvar.next = sub i64 %indvar, 1
240 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615
241 br i1 %exitcond, label %return, label %loop
242
243return:
244 ret void
245}