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