1 ; RUN: llc < %s -march=x86-64 > %t
3 ; RUN: not grep movz %t
6 ; RUN: grep add %t | count 2
7 ; RUN: grep inc %t | count 4
8 ; RUN: grep dec %t | count 2
9 ; RUN: grep lea %t | count 2
11 ; Optimize away zext-inreg and sext-inreg on the loop induction
12 ; variable using trip-count information.
14 define void @count_up(double* %d, i64 %n) nounwind {
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 = fmul 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 = fmul double %t4, 2.3
29 store double %t5, double* %t3
30 %t6 = getelementptr double* %d, i64 %indvar
31 %t7 = load double* %t6
32 %t8 = fmul 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
42 define void @count_down(double* %d, i64 %n) nounwind {
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 = fmul 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 = fmul double %t4, 2.3
57 store double %t5, double* %t3
58 %t6 = getelementptr double* %d, i64 %indvar
59 %t7 = load double* %t6
60 %t8 = fmul 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
70 define void @count_up_signed(double* %d, i64 %n) nounwind {
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 = fmul 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 = fmul double %t4, 2.3
87 store double %t5, double* %t3
88 %t6 = getelementptr double* %d, i64 %indvar
89 %t7 = load double* %t6
90 %t8 = fmul 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
100 define void @count_down_signed(double* %d, i64 %n) nounwind {
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 = fmul 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 = fmul double %t4, 2.3
117 store double %t5, double* %t3
118 %t6 = getelementptr double* %d, i64 %indvar
119 %t7 = load double* %t6
120 %t8 = fmul 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
130 define void @another_count_up(double* %d, i64 %n) nounwind {
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 = fmul 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 = fmul double %t4, 2.3
145 store double %t5, double* %t3
146 %t6 = getelementptr double* %d, i64 %indvar
147 %t7 = load double* %t6
148 %t8 = fmul 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
158 define void @another_count_down(double* %d, i64 %n) nounwind {
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 = fmul 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 = fdiv double %t4, 2.3
173 store double %t5, double* %t3
174 %t6 = getelementptr double* %d, i64 %indvar
175 %t7 = load double* %t6
176 %t8 = fmul 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
186 define void @another_count_up_signed(double* %d, i64 %n) nounwind {
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 = fmul 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 = fdiv double %t4, 2.3
203 store double %t5, double* %t3
204 %t6 = getelementptr double* %d, i64 %indvar
205 %t7 = load double* %t6
206 %t8 = fmul 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
216 define void @another_count_down_signed(double* %d, i64 %n) nounwind {
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 = fmul 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 = fdiv double %t4, 2.3
233 store double %t5, double* %t3
234 %t6 = getelementptr double* %d, i64 %indvar
235 %t7 = load double* %t6
236 %t8 = fmul 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