blob: 139491769e055aa21b5e352726bf8db05a4c04a0 [file] [log] [blame]
Roland Levillain78b3d5d2017-01-04 10:27:50 +00001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17public class Main {
18
19 boolean b00;
20 boolean b01;
21 boolean b02;
22 boolean b03;
23 boolean b04;
24 boolean b05;
25 boolean b06;
26 boolean b07;
27 boolean b08;
28 boolean b09;
29 boolean b10;
30 boolean b11;
31 boolean b12;
32 boolean b13;
33 boolean b14;
34 boolean b15;
35 boolean b16;
36 boolean b17;
37 boolean b18;
38 boolean b19;
39 boolean b20;
40 boolean b21;
41 boolean b22;
42 boolean b23;
43 boolean b24;
44 boolean b25;
45 boolean b26;
46 boolean b27;
47 boolean b28;
48 boolean b29;
49 boolean b30;
50 boolean b31;
51 boolean b32;
52 boolean b33;
53 boolean b34;
54 boolean b35;
55 boolean b36;
56
57 boolean conditionA;
58 boolean conditionB;
59 boolean conditionC;
60
61 /// CHECK-START-ARM64: void Main.test() register (after)
62 /// CHECK: begin_block
63 /// CHECK: name "B0"
64 /// CHECK: <<This:l\d+>> ParameterValue
65 /// CHECK: end_block
66 /// CHECK: begin_block
Nicolas Geoffray94cd28a2017-11-16 09:03:45 +000067 /// CHECK: successors "<<ThenBlock:B\d+>>" "<<ElseBlock:B\d+>>"
Roland Levillain78b3d5d2017-01-04 10:27:50 +000068 /// CHECK: <<CondB:z\d+>> InstanceFieldGet [<<This>>] field_name:Main.conditionB
69 /// CHECK: If [<<CondB>>]
Nicolas Geoffray94cd28a2017-11-16 09:03:45 +000070 /// CHECK: end_block
71 /// CHECK: begin_block
72 /// CHECK: name "<<ElseBlock>>"
73 /// CHECK: ParallelMove moves:[40(sp)->d0,24(sp)->32(sp),28(sp)->36(sp),d0->d3,d3->d4,d2->d5,d4->d6,d5->d7,d6->d18,d7->d19,d18->d20,d19->d21,d20->d22,d21->d23,d22->d10,d23->d11,16(sp)->24(sp),20(sp)->28(sp),d10->d14,d11->d12,d12->d13,d13->d1,d14->d2,32(sp)->16(sp),36(sp)->20(sp)]
Roland Levillain78b3d5d2017-01-04 10:27:50 +000074 /// CHECK: end_block
75
76 /// CHECK-START-ARM64: void Main.test() disassembly (after)
77 /// CHECK: begin_block
78 /// CHECK: name "B0"
79 /// CHECK: <<This:l\d+>> ParameterValue
80 /// CHECK: end_block
81 /// CHECK: begin_block
82 /// CHECK: successors "<<ThenBlock:B\d+>>" "<<ElseBlock:B\d+>>"
83 /// CHECK: <<CondB:z\d+>> InstanceFieldGet [<<This>>] field_name:Main.conditionB
84 /// CHECK: If [<<CondB>>]
Nicolas Geoffray94cd28a2017-11-16 09:03:45 +000085 /// CHECK: end_block
86 /// CHECK: begin_block
87 /// CHECK: name "<<ElseBlock>>"
88 /// CHECK: ParallelMove moves:[invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid]
89 /// CHECK: fmov d31, d2
90 /// CHECK: ldr s2, [sp, #36]
91 /// CHECK: ldr w16, [sp, #16]
92 /// CHECK: str w16, [sp, #36]
93 /// CHECK: str s14, [sp, #16]
94 /// CHECK: ldr s14, [sp, #28]
95 /// CHECK: str s1, [sp, #28]
96 /// CHECK: ldr s1, [sp, #32]
97 /// CHECK: str s31, [sp, #32]
98 /// CHECK: ldr s31, [sp, #20]
99 /// CHECK: str s31, [sp, #40]
100 /// CHECK: str s12, [sp, #20]
101 /// CHECK: fmov d12, d11
102 /// CHECK: fmov d11, d10
103 /// CHECK: fmov d10, d23
104 /// CHECK: fmov d23, d22
105 /// CHECK: fmov d22, d21
106 /// CHECK: fmov d21, d20
107 /// CHECK: fmov d20, d19
108 /// CHECK: fmov d19, d18
109 /// CHECK: fmov d18, d7
110 /// CHECK: fmov d7, d6
111 /// CHECK: fmov d6, d5
112 /// CHECK: fmov d5, d4
113 /// CHECK: fmov d4, d3
114 /// CHECK: fmov d3, d13
115 /// CHECK: ldr s13, [sp, #24]
116 /// CHECK: str s3, [sp, #24]
117 /// CHECK: ldr s3, pc+{{\d+}} (addr {{0x[0-9a-f]+}}) (100)
Roland Levillain78b3d5d2017-01-04 10:27:50 +0000118 /// CHECK: end_block
119
120 public void test() {
121 String r = "";
122
123 // For the purpose of this regression test, the order of
124 // definition of these float variable matters. Likewise with the
125 // order of the instructions where these variables are used below.
126 // Reordering these lines make make the original (b/32545705)
127 // issue vanish.
128 float f17 = b17 ? 0.0f : 1.0f;
129 float f16 = b16 ? 0.0f : 1.0f;
130 float f18 = b18 ? 0.0f : 1.0f;
131 float f19 = b19 ? 0.0f : 1.0f;
132 float f20 = b20 ? 0.0f : 1.0f;
133 float f21 = b21 ? 0.0f : 1.0f;
134 float f15 = b15 ? 0.0f : 1.0f;
135 float f00 = b00 ? 0.0f : 1.0f;
136 float f22 = b22 ? 0.0f : 1.0f;
137 float f23 = b23 ? 0.0f : 1.0f;
138 float f24 = b24 ? 0.0f : 1.0f;
139 float f25 = b25 ? 0.0f : 1.0f;
140 float f26 = b26 ? 0.0f : 1.0f;
141 float f27 = b27 ? 0.0f : 1.0f;
142 float f29 = b29 ? 0.0f : 1.0f;
143 float f28 = b28 ? 0.0f : 1.0f;
144 float f01 = b01 ? 0.0f : 1.0f;
145 float f02 = b02 ? 0.0f : 1.0f;
146 float f03 = b03 ? 0.0f : 1.0f;
147 float f04 = b04 ? 0.0f : 1.0f;
148 float f05 = b05 ? 0.0f : 1.0f;
149 float f07 = b07 ? 0.0f : 1.0f;
150 float f06 = b06 ? 0.0f : 1.0f;
151 float f30 = b30 ? 0.0f : 1.0f;
152 float f31 = b31 ? 0.0f : 1.0f;
153 float f32 = b32 ? 0.0f : 1.0f;
154 float f33 = b33 ? 0.0f : 1.0f;
155 float f34 = b34 ? 0.0f : 1.0f;
156 float f36 = b36 ? 0.0f : 1.0f;
157 float f35 = b35 ? 0.0f : 1.0f;
158 float f08 = b08 ? 0.0f : 1.0f;
159 float f09 = b09 ? 0.0f : 1.0f;
160 float f10 = b10 ? 0.0f : 1.0f;
161 float f11 = b11 ? 0.0f : 1.0f;
162 float f12 = b12 ? 0.0f : 1.0f;
163 float f14 = b14 ? 0.0f : 1.0f;
164 float f13 = b13 ? 0.0f : 1.0f;
165
166 if (conditionA) {
167 f16 /= 1000.0f;
168 f17 /= 1000.0f;
169 f18 /= 1000.0f;
170 f19 /= 1000.0f;
171 f20 /= 1000.0f;
172 f21 /= 1000.0f;
173 f15 /= 1000.0f;
174 f08 /= 1000.0f;
175 f09 /= 1000.0f;
176 f10 /= 1000.0f;
177 f11 /= 1000.0f;
178 f12 /= 1000.0f;
179 f30 /= 1000.0f;
180 f31 /= 1000.0f;
181 f32 /= 1000.0f;
182 f33 /= 1000.0f;
183 f34 /= 1000.0f;
184 f01 /= 1000.0f;
185 f02 /= 1000.0f;
186 f03 /= 1000.0f;
187 f04 /= 1000.0f;
188 f05 /= 1000.0f;
189 f23 /= 1000.0f;
190 f24 /= 1000.0f;
191 f25 /= 1000.0f;
192 f26 /= 1000.0f;
193 f27 /= 1000.0f;
194 f22 /= 1000.0f;
195 f00 /= 1000.0f;
196 f14 /= 1000.0f;
197 f13 /= 1000.0f;
198 f36 /= 1000.0f;
199 f35 /= 1000.0f;
200 f07 /= 1000.0f;
201 f06 /= 1000.0f;
202 f29 /= 1000.0f;
203 f28 /= 1000.0f;
204 }
205 // The parallel move that used to exhaust the ARM64 parallel move
206 // resolver's scratch register pool (provided by VIXL) was in the
207 // "else" branch of the following condition generated by ART's
208 // compiler.
209 if (conditionB) {
210 f16 /= 100.0f;
211 f17 /= 100.0f;
212 f18 /= 100.0f;
213 f19 /= 100.0f;
214 f20 /= 100.0f;
215 f21 /= 100.0f;
216 f15 /= 100.0f;
217 f08 /= 100.0f;
218 f09 /= 100.0f;
219 f10 /= 100.0f;
220 f11 /= 100.0f;
221 f12 /= 100.0f;
222 f30 /= 100.0f;
223 f31 /= 100.0f;
224 f32 /= 100.0f;
225 f33 /= 100.0f;
226 f34 /= 100.0f;
227 f01 /= 100.0f;
228 f02 /= 100.0f;
229 f03 /= 100.0f;
230 f04 /= 100.0f;
231 f05 /= 100.0f;
232 f23 /= 100.0f;
233 f24 /= 100.0f;
234 f25 /= 100.0f;
235 f26 /= 100.0f;
236 f27 /= 100.0f;
237 f22 /= 100.0f;
238 f00 /= 100.0f;
239 f14 /= 100.0f;
240 f13 /= 100.0f;
241 f36 /= 100.0f;
242 f35 /= 100.0f;
243 f07 /= 100.0f;
244 f06 /= 100.0f;
245 f29 /= 100.0f;
246 f28 /= 100.0f;
247 }
248 if (conditionC) {
249 f16 /= 12.0f;
250 f17 /= 12.0f;
251 f18 /= 12.0f;
252 f19 /= 12.0f;
253 f20 /= 12.0f;
254 f21 /= 12.0f;
255 f15 /= 12.0f;
256 f08 /= 12.0f;
257 f09 /= 12.0f;
258 f10 /= 12.0f;
259 f11 /= 12.0f;
260 f12 /= 12.0f;
261 f30 /= 12.0f;
262 f31 /= 12.0f;
263 f32 /= 12.0f;
264 f33 /= 12.0f;
265 f34 /= 12.0f;
266 f01 /= 12.0f;
267 f02 /= 12.0f;
268 f03 /= 12.0f;
269 f04 /= 12.0f;
270 f05 /= 12.0f;
271 f23 /= 12.0f;
272 f24 /= 12.0f;
273 f25 /= 12.0f;
274 f26 /= 12.0f;
275 f27 /= 12.0f;
276 f22 /= 12.0f;
277 f00 /= 12.0f;
278 f14 /= 12.0f;
279 f13 /= 12.0f;
280 f36 /= 12.0f;
281 f35 /= 12.0f;
282 f07 /= 12.0f;
283 f06 /= 12.0f;
284 f29 /= 12.0f;
285 f28 /= 12.0f;
286 }
287 float s = 0.0f;
288 s = ((float) Math.round(100.0f * s)) / 100.0f;
289 String res = s + r;
290 }
291
Nicolas Geoffray94cd28a2017-11-16 09:03:45 +0000292 public static void main(String[] args) {
Roland Levillain78b3d5d2017-01-04 10:27:50 +0000293 Main main = new Main();
294 main.test();
Roland Levillain78b3d5d2017-01-04 10:27:50 +0000295 System.out.println("passed");
296 }
297}