Instruction scheduling itinerary for Intel Atom.
[oota-llvm.git] / test / CodeGen / X86 / masked-iv-safe.ll
1 ; RUN: llc < %s -mcpu=generic -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 1
7 ; RUN: grep inc %t | count 4
8 ; RUN: grep dec %t | count 2
9 ; RUN: grep lea %t | count 3
10
11 ; Optimize away zext-inreg and sext-inreg on the loop induction
12 ; variable using trip-count information.
13
14 define void @count_up(double* %d, i64 %n) nounwind {
15 entry:
16         br label %loop
17
18 loop:
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
37
38 return:
39         ret void
40 }
41
42 define void @count_down(double* %d, i64 %n) nounwind {
43 entry:
44         br label %loop
45
46 loop:
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
65
66 return:
67         ret void
68 }
69
70 define void @count_up_signed(double* %d, i64 %n) nounwind {
71 entry:
72         br label %loop
73
74 loop:
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
95
96 return:
97         ret void
98 }
99
100 define void @count_down_signed(double* %d, i64 %n) nounwind {
101 entry:
102         br label %loop
103
104 loop:
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
125
126 return:
127         ret void
128 }
129
130 define void @another_count_up(double* %d, i64 %n) nounwind {
131 entry:
132         br label %loop
133
134 loop:
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
153
154 return:
155         ret void
156 }
157
158 define void @another_count_down(double* %d, i64 %n) nounwind {
159 entry:
160         br label %loop
161
162 loop:
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
181
182 return:
183         ret void
184 }
185
186 define void @another_count_up_signed(double* %d, i64 %n) nounwind {
187 entry:
188         br label %loop
189
190 loop:
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
211
212 return:
213         ret void
214 }
215
216 define void @another_count_down_signed(double* %d, i64 %n) nounwind {
217 entry:
218         br label %loop
219
220 loop:
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
241
242 return:
243         ret void
244 }