Temporarily enable MI-Sched on X86.
[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 6
7 ; RUN: grep inc %t | count 2
8 ; RUN: grep lea %t | count 0
9
10 ; Optimize away zext-inreg and sext-inreg on the loop induction
11 ; variable using trip-count information.
12
13 define void @count_up(double* %d, i64 %n) nounwind {
14 entry:
15         br label %loop
16
17 loop:
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
36
37 return:
38         ret void
39 }
40
41 define void @count_down(double* %d, i64 %n) nounwind {
42 entry:
43         br label %loop
44
45 loop:
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
64
65 return:
66         ret void
67 }
68
69 define void @count_up_signed(double* %d, i64 %n) nounwind {
70 entry:
71         br label %loop
72
73 loop:
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
94
95 return:
96         ret void
97 }
98
99 define void @count_down_signed(double* %d, i64 %n) nounwind {
100 entry:
101         br label %loop
102
103 loop:
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
124
125 return:
126         ret void
127 }
128
129 define void @another_count_up(double* %d, i64 %n) nounwind {
130 entry:
131         br label %loop
132
133 loop:
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
152
153 return:
154         ret void
155 }
156
157 define void @another_count_down(double* %d, i64 %n) nounwind {
158 entry:
159         br label %loop
160
161 loop:
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
180
181 return:
182         ret void
183 }
184
185 define void @another_count_up_signed(double* %d, i64 %n) nounwind {
186 entry:
187         br label %loop
188
189 loop:
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
210
211 return:
212         ret void
213 }
214
215 define void @another_count_down_signed(double* %d, i64 %n) nounwind {
216 entry:
217         br label %loop
218
219 loop:
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
240
241 return:
242         ret void
243 }