1 ; RUN: llc < %s -mcpu=generic -march=x86-64 > %t
3 ; RUN: not grep movz %t
6 ; RUN: grep add %t | count 5
7 ; RUN: grep inc %t | count 2
8 ; RUN: grep lea %t | count 3
10 ; Optimize away zext-inreg and sext-inreg on the loop induction
11 ; variable using trip-count information.
13 define void @count_up(double* %d, i64 %n) nounwind {
18 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
19 %indvar.i8 = and i64 %indvar, 255
20 %t0 = getelementptr double* %d, i64 %indvar.i8
21 %t1 = load double* %t0
22 %t2 = fmul double %t1, 0.1
23 store double %t2, double* %t0
24 %indvar.i24 = and i64 %indvar, 16777215
25 %t3 = getelementptr double* %d, i64 %indvar.i24
26 %t4 = load double* %t3
27 %t5 = fmul double %t4, 2.3
28 store double %t5, double* %t3
29 %t6 = getelementptr double* %d, i64 %indvar
30 %t7 = load double* %t6
31 %t8 = fmul double %t7, 4.5
32 store double %t8, double* %t6
33 %indvar.next = add i64 %indvar, 1
34 %exitcond = icmp eq i64 %indvar.next, 10
35 br i1 %exitcond, label %return, label %loop
41 define void @count_down(double* %d, i64 %n) nounwind {
46 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
47 %indvar.i8 = and i64 %indvar, 255
48 %t0 = getelementptr double* %d, i64 %indvar.i8
49 %t1 = load double* %t0
50 %t2 = fmul double %t1, 0.1
51 store double %t2, double* %t0
52 %indvar.i24 = and i64 %indvar, 16777215
53 %t3 = getelementptr double* %d, i64 %indvar.i24
54 %t4 = load double* %t3
55 %t5 = fmul double %t4, 2.3
56 store double %t5, double* %t3
57 %t6 = getelementptr double* %d, i64 %indvar
58 %t7 = load double* %t6
59 %t8 = fmul double %t7, 4.5
60 store double %t8, double* %t6
61 %indvar.next = sub i64 %indvar, 1
62 %exitcond = icmp eq i64 %indvar.next, 0
63 br i1 %exitcond, label %return, label %loop
69 define void @count_up_signed(double* %d, i64 %n) nounwind {
74 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
75 %s0 = shl i64 %indvar, 8
76 %indvar.i8 = ashr i64 %s0, 8
77 %t0 = getelementptr double* %d, i64 %indvar.i8
78 %t1 = load double* %t0
79 %t2 = fmul double %t1, 0.1
80 store double %t2, double* %t0
81 %s1 = shl i64 %indvar, 24
82 %indvar.i24 = ashr i64 %s1, 24
83 %t3 = getelementptr double* %d, i64 %indvar.i24
84 %t4 = load double* %t3
85 %t5 = fmul double %t4, 2.3
86 store double %t5, double* %t3
87 %t6 = getelementptr double* %d, i64 %indvar
88 %t7 = load double* %t6
89 %t8 = fmul double %t7, 4.5
90 store double %t8, double* %t6
91 %indvar.next = add i64 %indvar, 1
92 %exitcond = icmp eq i64 %indvar.next, 10
93 br i1 %exitcond, label %return, label %loop
99 define void @count_down_signed(double* %d, i64 %n) nounwind {
104 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]
105 %s0 = shl i64 %indvar, 8
106 %indvar.i8 = ashr i64 %s0, 8
107 %t0 = getelementptr double* %d, i64 %indvar.i8
108 %t1 = load double* %t0
109 %t2 = fmul double %t1, 0.1
110 store double %t2, double* %t0
111 %s1 = shl i64 %indvar, 24
112 %indvar.i24 = ashr i64 %s1, 24
113 %t3 = getelementptr double* %d, i64 %indvar.i24
114 %t4 = load double* %t3
115 %t5 = fmul double %t4, 2.3
116 store double %t5, double* %t3
117 %t6 = getelementptr double* %d, i64 %indvar
118 %t7 = load double* %t6
119 %t8 = fmul double %t7, 4.5
120 store double %t8, double* %t6
121 %indvar.next = sub i64 %indvar, 1
122 %exitcond = icmp eq i64 %indvar.next, 0
123 br i1 %exitcond, label %return, label %loop
129 define void @another_count_up(double* %d, i64 %n) nounwind {
134 %indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
135 %indvar.i8 = and i64 %indvar, 255
136 %t0 = getelementptr double* %d, i64 %indvar.i8
137 %t1 = load double* %t0
138 %t2 = fmul double %t1, 0.1
139 store double %t2, double* %t0
140 %indvar.i24 = and i64 %indvar, 16777215
141 %t3 = getelementptr double* %d, i64 %indvar.i24
142 %t4 = load double* %t3
143 %t5 = fmul double %t4, 2.3
144 store double %t5, double* %t3
145 %t6 = getelementptr double* %d, i64 %indvar
146 %t7 = load double* %t6
147 %t8 = fmul double %t7, 4.5
148 store double %t8, double* %t6
149 %indvar.next = add i64 %indvar, 1
150 %exitcond = icmp eq i64 %indvar.next, 0
151 br i1 %exitcond, label %return, label %loop
157 define void @another_count_down(double* %d, i64 %n) nounwind {
162 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
163 %indvar.i8 = and i64 %indvar, 255
164 %t0 = getelementptr double* %d, i64 %indvar.i8
165 %t1 = load double* %t0
166 %t2 = fmul double %t1, 0.1
167 store double %t2, double* %t0
168 %indvar.i24 = and i64 %indvar, 16777215
169 %t3 = getelementptr double* %d, i64 %indvar.i24
170 %t4 = load double* %t3
171 %t5 = fdiv double %t4, 2.3
172 store double %t5, double* %t3
173 %t6 = getelementptr double* %d, i64 %indvar
174 %t7 = load double* %t6
175 %t8 = fmul double %t7, 4.5
176 store double %t8, double* %t6
177 %indvar.next = sub i64 %indvar, 1
178 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615
179 br i1 %exitcond, label %return, label %loop
185 define void @another_count_up_signed(double* %d, i64 %n) nounwind {
190 %indvar = phi i64 [ 18446744073709551615, %entry ], [ %indvar.next, %loop ]
191 %s0 = shl i64 %indvar, 8
192 %indvar.i8 = ashr i64 %s0, 8
193 %t0 = getelementptr double* %d, i64 %indvar.i8
194 %t1 = load double* %t0
195 %t2 = fmul double %t1, 0.1
196 store double %t2, double* %t0
197 %s1 = shl i64 %indvar, 24
198 %indvar.i24 = ashr i64 %s1, 24
199 %t3 = getelementptr double* %d, i64 %indvar.i24
200 %t4 = load double* %t3
201 %t5 = fdiv double %t4, 2.3
202 store double %t5, double* %t3
203 %t6 = getelementptr double* %d, i64 %indvar
204 %t7 = load double* %t6
205 %t8 = fmul double %t7, 4.5
206 store double %t8, double* %t6
207 %indvar.next = add i64 %indvar, 1
208 %exitcond = icmp eq i64 %indvar.next, 0
209 br i1 %exitcond, label %return, label %loop
215 define void @another_count_down_signed(double* %d, i64 %n) nounwind {
220 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
221 %s0 = shl i64 %indvar, 8
222 %indvar.i8 = ashr i64 %s0, 8
223 %t0 = getelementptr double* %d, i64 %indvar.i8
224 %t1 = load double* %t0
225 %t2 = fmul double %t1, 0.1
226 store double %t2, double* %t0
227 %s1 = shl i64 %indvar, 24
228 %indvar.i24 = ashr i64 %s1, 24
229 %t3 = getelementptr double* %d, i64 %indvar.i24
230 %t4 = load double* %t3
231 %t5 = fdiv double %t4, 2.3
232 store double %t5, double* %t3
233 %t6 = getelementptr double* %d, i64 %indvar
234 %t7 = load double* %t6
235 %t8 = fmul double %t7, 4.5
236 store double %t8, double* %t6
237 %indvar.next = sub i64 %indvar, 1
238 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615
239 br i1 %exitcond, label %return, label %loop