1 /*
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 
17 public 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
67   /// CHECK:   successors "<<ThenBlock:B\d+>>" "<<ElseBlock:B\d+>>"
68   /// CHECK:       <<CondB:z\d+>>  InstanceFieldGet [<<This>>] field_name:Main.conditionB
69   /// CHECK:                       If [<<CondB>>]
70   /// 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)]
74   /// 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>>]
85   /// 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)
118   /// CHECK: end_block
119 
test()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 
main(String[] args)292   public static void main(String[] args) {
293     Main main = new Main();
294     main.test();
295     System.out.println("passed");
296   }
297 }
298