blob: e10253516ba56baa21776bea9553a0bbed7db06e [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
23 %t2 = mul double %t1, 0.1
24 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
28 %t5 = mul double %t4, 2.3
29 store double %t5, double* %t3
30 %t6 = getelementptr double* %d, i64 %indvar
31 %t7 = load double* %t6
32 %t8 = mul double %t7, 4.5
33 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
51 %t2 = mul double %t1, 0.1
52 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
56 %t5 = mul double %t4, 2.3
57 store double %t5, double* %t3
58 %t6 = getelementptr double* %d, i64 %indvar
59 %t7 = load double* %t6
60 %t8 = mul double %t7, 4.5
61 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
80 %t2 = mul double %t1, 0.1
81 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
86 %t5 = mul double %t4, 2.3
87 store double %t5, double* %t3
88 %t6 = getelementptr double* %d, i64 %indvar
89 %t7 = load double* %t6
90 %t8 = mul double %t7, 4.5
91 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
110 %t2 = mul double %t1, 0.1
111 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
116 %t5 = mul double %t4, 2.3
117 store double %t5, double* %t3
118 %t6 = getelementptr double* %d, i64 %indvar
119 %t7 = load double* %t6
120 %t8 = mul double %t7, 4.5
121 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
139 %t2 = mul double %t1, 0.1
140 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
144 %t5 = mul double %t4, 2.3
145 store double %t5, double* %t3
146 %t6 = getelementptr double* %d, i64 %indvar
147 %t7 = load double* %t6
148 %t8 = mul double %t7, 4.5
149 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
167 %t2 = mul double %t1, 0.1
168 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
172 %t5 = mul double %t4, 2.3
173 store double %t5, double* %t3
174 %t6 = getelementptr double* %d, i64 %indvar
175 %t7 = load double* %t6
176 %t8 = mul double %t7, 4.5
177 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
196 %t2 = mul double %t1, 0.1
197 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
202 %t5 = mul double %t4, 2.3
203 store double %t5, double* %t3
204 %t6 = getelementptr double* %d, i64 %indvar
205 %t7 = load double* %t6
206 %t8 = mul double %t7, 4.5
207 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
226 %t2 = mul double %t1, 0.1
227 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
232 %t5 = mul double %t4, 2.3
233 store double %t5, double* %t3
234 %t6 = getelementptr double* %d, i64 %indvar
235 %t7 = load double* %t6
236 %t8 = mul double %t7, 4.5
237 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}