• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -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 2
7; RUN: grep inc %t | count 4
8; RUN: grep dec %t | count 2
9; 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.
13
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 = 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
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 = 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
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 = 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
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 = 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
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 = 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
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 = 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
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 = 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
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 = 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
242return:
243	ret void
244}
245