xref: /aosp_15_r20/art/test/530-checker-lse-simd/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker public class Main {
18*795d594fSAndroid Build Coastguard Worker   // Based on Linpack.matgen
19*795d594fSAndroid Build Coastguard Worker   // Load-store elimination did not work when a function had SIMD code.
20*795d594fSAndroid Build Coastguard Worker   // In the test below loop B is vectorized.
21*795d594fSAndroid Build Coastguard Worker   // Check that a redundant ArrayGet is eliminated in loop A.
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.$noinline$vecgen(double[], double[], int) load_store_elimination (before)
24*795d594fSAndroid Build Coastguard Worker   /// CHECK:      Rem
25*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: TypeConversion
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Sub
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Mul
28*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArraySet
29*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArrayGet
30*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: LessThanOrEqual
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Select
32*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Add
33*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Goto loop:{{B\d+}}
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.$noinline$vecgen(double[], double[], int) load_store_elimination (after)
36*795d594fSAndroid Build Coastguard Worker   /// CHECK:      Rem
37*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: TypeConversion
38*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Sub
39*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Mul
40*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArraySet
41*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
42*795d594fSAndroid Build Coastguard Worker   //
43*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NEXT: ArrayGet
44*795d594fSAndroid Build Coastguard Worker   //
45*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
46*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: LessThanOrEqual
47*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Select
48*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Add
49*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Goto loop:{{B\d+}}
50*795d594fSAndroid Build Coastguard Worker   //
51*795d594fSAndroid Build Coastguard Worker   // TODO: reenable LSE for graphs with Predicated SIMD.
$noinline$vecgen(double a[], double b[], int n)52*795d594fSAndroid Build Coastguard Worker   static double $noinline$vecgen(double a[], double b[], int n) {
53*795d594fSAndroid Build Coastguard Worker     double norma = 0.0;
54*795d594fSAndroid Build Coastguard Worker     int init = 1325;
55*795d594fSAndroid Build Coastguard Worker     // Loop A
56*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
57*795d594fSAndroid Build Coastguard Worker       init = 3125*init % 65536;
58*795d594fSAndroid Build Coastguard Worker       a[i] = (init - 32768.0)/16384.0;
59*795d594fSAndroid Build Coastguard Worker       norma = (a[i] > norma) ? a[i] : norma; // ArrayGet should be removed by LSE.
60*795d594fSAndroid Build Coastguard Worker     }
61*795d594fSAndroid Build Coastguard Worker 
62*795d594fSAndroid Build Coastguard Worker     // Loop B
63*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
64*795d594fSAndroid Build Coastguard Worker       b[i] += a[i];
65*795d594fSAndroid Build Coastguard Worker     }
66*795d594fSAndroid Build Coastguard Worker 
67*795d594fSAndroid Build Coastguard Worker     return norma;
68*795d594fSAndroid Build Coastguard Worker   }
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker 
test01()71*795d594fSAndroid Build Coastguard Worker   static void test01() {
72*795d594fSAndroid Build Coastguard Worker     double a[] = new double[1024];
73*795d594fSAndroid Build Coastguard Worker     double norma = $noinline$vecgen(a, a, a.length);
74*795d594fSAndroid Build Coastguard Worker     System.out.println((int)norma);
75*795d594fSAndroid Build Coastguard Worker     System.out.println((int)a[1023]);
76*795d594fSAndroid Build Coastguard Worker   }
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker   // Check LSE works when a function has SIMD code.
79*795d594fSAndroid Build Coastguard Worker   //
80*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.$noinline$test02(double[], int) load_store_elimination (before)
81*795d594fSAndroid Build Coastguard Worker   /// CHECK:      BoundsCheck loop:none
82*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArrayGet
83*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Mul
84*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArraySet
85*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArrayGet
86*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArrayLength
87*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: BelowOrEqual
88*795d594fSAndroid Build Coastguard Worker   //
89*795d594fSAndroid Build Coastguard Worker   /// CHECK:      ArrayGet loop:none
90*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Return
91*795d594fSAndroid Build Coastguard Worker 
92*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.$noinline$test02(double[], int) load_store_elimination (after)
93*795d594fSAndroid Build Coastguard Worker   /// CHECK:      BoundsCheck loop:none
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArrayGet
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Mul
96*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArraySet
97*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
98*795d594fSAndroid Build Coastguard Worker   //
99*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NEXT: ArrayGet
100*795d594fSAndroid Build Coastguard Worker   //
101*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
102*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: ArrayLength
103*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: BelowOrEqual
104*795d594fSAndroid Build Coastguard Worker   //
105*795d594fSAndroid Build Coastguard Worker   /// CHECK:      Return
106*795d594fSAndroid Build Coastguard Worker   //
107*795d594fSAndroid Build Coastguard Worker   // TODO: reenable LSE for graphs with Predicated SIMD.
$noinline$test02(double a[], int n)108*795d594fSAndroid Build Coastguard Worker   static double $noinline$test02(double a[], int n) {
109*795d594fSAndroid Build Coastguard Worker     double b[] = new double[n];
110*795d594fSAndroid Build Coastguard Worker     a[0] = a[0] / 2;
111*795d594fSAndroid Build Coastguard Worker 
112*795d594fSAndroid Build Coastguard Worker     double norma = a[0]; // ArrayGet should be removed by LSE.
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker     // The following loop is vectorized.
115*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 128; ++i) {
116*795d594fSAndroid Build Coastguard Worker       b[i] += a[i];
117*795d594fSAndroid Build Coastguard Worker     }
118*795d594fSAndroid Build Coastguard Worker 
119*795d594fSAndroid Build Coastguard Worker     norma = a[0]; // ArrayGet should be removed by LSE.
120*795d594fSAndroid Build Coastguard Worker     return norma;
121*795d594fSAndroid Build Coastguard Worker   }
122*795d594fSAndroid Build Coastguard Worker 
test02()123*795d594fSAndroid Build Coastguard Worker   static void test02() {
124*795d594fSAndroid Build Coastguard Worker     double a[] = new double[128];
125*795d594fSAndroid Build Coastguard Worker     java.util.Arrays.fill(a, 2.0);
126*795d594fSAndroid Build Coastguard Worker     double norma = $noinline$test02(a, a.length);
127*795d594fSAndroid Build Coastguard Worker     System.out.println((int)norma);
128*795d594fSAndroid Build Coastguard Worker   }
129*795d594fSAndroid Build Coastguard Worker 
130*795d594fSAndroid Build Coastguard Worker   // Check LSE works when a function has SIMD code.
131*795d594fSAndroid Build Coastguard Worker   //
132*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.$noinline$test03(int) load_store_elimination (before)
133*795d594fSAndroid Build Coastguard Worker   /// CHECK:      ArrayGet loop:none
134*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: Return
135*795d594fSAndroid Build Coastguard Worker 
136*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.$noinline$test03(int) load_store_elimination (after)
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true')
138*795d594fSAndroid Build Coastguard Worker   //
139*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT:  ArrayGet loop:none
140*795d594fSAndroid Build Coastguard Worker   //
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
142*795d594fSAndroid Build Coastguard Worker   //
143*795d594fSAndroid Build Coastguard Worker   // TODO: reenable LSE for graphs with Predicated SIMD.
$noinline$test03(int n)144*795d594fSAndroid Build Coastguard Worker   static double $noinline$test03(int n) {
145*795d594fSAndroid Build Coastguard Worker     double a[] = new double[n];
146*795d594fSAndroid Build Coastguard Worker     double b[] = new double[n];
147*795d594fSAndroid Build Coastguard Worker 
148*795d594fSAndroid Build Coastguard Worker     a[0] = 2.0;
149*795d594fSAndroid Build Coastguard Worker 
150*795d594fSAndroid Build Coastguard Worker     // The following loop is vectorized.
151*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 128; ++i) {
152*795d594fSAndroid Build Coastguard Worker       b[i] += a[i];
153*795d594fSAndroid Build Coastguard Worker     }
154*795d594fSAndroid Build Coastguard Worker 
155*795d594fSAndroid Build Coastguard Worker     a[0] = 2.0;
156*795d594fSAndroid Build Coastguard Worker     return a[0]; // ArrayGet should be removed by LSE.
157*795d594fSAndroid Build Coastguard Worker   }
158*795d594fSAndroid Build Coastguard Worker 
test03()159*795d594fSAndroid Build Coastguard Worker   static void test03() {
160*795d594fSAndroid Build Coastguard Worker     double norma = $noinline$test03(128);
161*795d594fSAndroid Build Coastguard Worker     System.out.println((int)norma);
162*795d594fSAndroid Build Coastguard Worker   }
163*795d594fSAndroid Build Coastguard Worker 
164*795d594fSAndroid Build Coastguard Worker   // Check LSE eliminates VecLoad.
165*795d594fSAndroid Build Coastguard Worker   //
166*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: double[] Main.$noinline$test04(int) load_store_elimination (before)
167*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
168*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecLoad
169*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecAdd
170*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
171*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Add
172*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Goto loop:{{B\d+}}
173*795d594fSAndroid Build Coastguard Worker 
174*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: double[] Main.$noinline$test04(int) load_store_elimination (after)
175*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true')
176*795d594fSAndroid Build Coastguard Worker   //
177*795d594fSAndroid Build Coastguard Worker   //      In NEON case there is a post-loop which prevents the store to be removed.
178*795d594fSAndroid Build Coastguard Worker   ///     CHECK:        VecStore
179*795d594fSAndroid Build Coastguard Worker   //
180*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
181*795d594fSAndroid Build Coastguard Worker   //
182*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecAdd
183*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
184*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Add
185*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Goto loop:{{B\d+}}
186*795d594fSAndroid Build Coastguard Worker   //
187*795d594fSAndroid Build Coastguard Worker 
188*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true')
189*795d594fSAndroid Build Coastguard Worker   //
190*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT:    VecStore
191*795d594fSAndroid Build Coastguard Worker   //
192*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
193*795d594fSAndroid Build Coastguard Worker   //
194*795d594fSAndroid Build Coastguard Worker   // TODO: reenable LSE for graphs with Predicated SIMD.
$noinline$test04(int n)195*795d594fSAndroid Build Coastguard Worker   static double[] $noinline$test04(int n) {
196*795d594fSAndroid Build Coastguard Worker     double a[] = new double[n];
197*795d594fSAndroid Build Coastguard Worker     double b[] = new double[n];
198*795d594fSAndroid Build Coastguard Worker 
199*795d594fSAndroid Build Coastguard Worker     // The following loop is vectorized.
200*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
201*795d594fSAndroid Build Coastguard Worker       a[i] = 1;
202*795d594fSAndroid Build Coastguard Worker       b[i] = a[i] + a[i]; // VecLoad should be removed by LSE.
203*795d594fSAndroid Build Coastguard Worker     }
204*795d594fSAndroid Build Coastguard Worker 
205*795d594fSAndroid Build Coastguard Worker     return b;
206*795d594fSAndroid Build Coastguard Worker   }
207*795d594fSAndroid Build Coastguard Worker 
test04()208*795d594fSAndroid Build Coastguard Worker   static void test04() {
209*795d594fSAndroid Build Coastguard Worker     double norma = $noinline$test04(128)[0];
210*795d594fSAndroid Build Coastguard Worker     System.out.println((int)norma);
211*795d594fSAndroid Build Coastguard Worker   }
212*795d594fSAndroid Build Coastguard Worker 
213*795d594fSAndroid Build Coastguard Worker   // Check LSE eliminates VecLoad.
214*795d594fSAndroid Build Coastguard Worker   //
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: double[] Main.$noinline$test05(int) load_store_elimination (before)
216*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
217*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecLoad
218*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
219*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
220*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Add
221*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Goto loop:{{B\d+}}
222*795d594fSAndroid Build Coastguard Worker 
223*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: double[] Main.$noinline$test05(int) load_store_elimination (after)
224*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
225*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
226*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Add
227*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Goto loop:{{B\d+}}
228*795d594fSAndroid Build Coastguard Worker   //
229*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:    VecStore
230*795d594fSAndroid Build Coastguard Worker   //
231*795d594fSAndroid Build Coastguard Worker   // TODO: reenable LSE for graphs with Predicated SIMD.
$noinline$test05(int n)232*795d594fSAndroid Build Coastguard Worker   static double[] $noinline$test05(int n) {
233*795d594fSAndroid Build Coastguard Worker     double a[] = new double[n];
234*795d594fSAndroid Build Coastguard Worker     double b[] = new double[n];
235*795d594fSAndroid Build Coastguard Worker 
236*795d594fSAndroid Build Coastguard Worker     // The following loop is vectorized.
237*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
238*795d594fSAndroid Build Coastguard Worker       a[i] = 1;
239*795d594fSAndroid Build Coastguard Worker       b[i] = a[i];
240*795d594fSAndroid Build Coastguard Worker       a[i] = 1;
241*795d594fSAndroid Build Coastguard Worker     }
242*795d594fSAndroid Build Coastguard Worker 
243*795d594fSAndroid Build Coastguard Worker     return b;
244*795d594fSAndroid Build Coastguard Worker   }
245*795d594fSAndroid Build Coastguard Worker 
test05()246*795d594fSAndroid Build Coastguard Worker   static void test05() {
247*795d594fSAndroid Build Coastguard Worker     double norma = $noinline$test05(128)[0];
248*795d594fSAndroid Build Coastguard Worker     System.out.println((int)norma);
249*795d594fSAndroid Build Coastguard Worker   }
250*795d594fSAndroid Build Coastguard Worker 
251*795d594fSAndroid Build Coastguard Worker   // Check LSE eliminates VecLoad and ArrayGet in case of singletons and default values.
252*795d594fSAndroid Build Coastguard Worker   //
253*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: double[] Main.$noinline$test06(int) load_store_elimination (before)
254*795d594fSAndroid Build Coastguard Worker   /// CHECK:        BoundsCheck loop:none
255*795d594fSAndroid Build Coastguard Worker   /// CHECK:        ArrayGet
256*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Add
257*795d594fSAndroid Build Coastguard Worker   //
258*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecLoad loop:{{B\d+}}
259*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
260*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecLoad
261*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecLoad
262*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecAdd
263*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecAdd
264*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
265*795d594fSAndroid Build Coastguard Worker 
266*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: double[] Main.$noinline$test06(int) load_store_elimination (after)
267*795d594fSAndroid Build Coastguard Worker   /// CHECK:        BoundsCheck loop:none
268*795d594fSAndroid Build Coastguard Worker   /// CHECK:        Add
269*795d594fSAndroid Build Coastguard Worker   //
270*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecLoad loop:{{B\d+}}
271*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecAdd
272*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecAdd
273*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecStore
274*795d594fSAndroid Build Coastguard Worker   //
275*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true')
276*795d594fSAndroid Build Coastguard Worker   //
277*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT:    VecStore
278*795d594fSAndroid Build Coastguard Worker   //
279*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
280*795d594fSAndroid Build Coastguard Worker   //
281*795d594fSAndroid Build Coastguard Worker   // TODO: reenable LSE for graphs with Predicated SIMD.
$noinline$test06(int n)282*795d594fSAndroid Build Coastguard Worker   static double[] $noinline$test06(int n) {
283*795d594fSAndroid Build Coastguard Worker     double a[] = new double[n];
284*795d594fSAndroid Build Coastguard Worker     double b[] = new double[n];
285*795d594fSAndroid Build Coastguard Worker 
286*795d594fSAndroid Build Coastguard Worker     double r = a[0] + 1.0; // ArrayGet:a[0] is eliminated and default 0.0 is used.
287*795d594fSAndroid Build Coastguard Worker     // The following loop is vectorized.
288*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
289*795d594fSAndroid Build Coastguard Worker       b[i] = a[i]; // VecLoad:a[i] is not eliminated.
290*795d594fSAndroid Build Coastguard Worker       b[i] += a[i] + r; // VecLoad:a[i] and VecLoad:b[i] are eliminated.
291*795d594fSAndroid Build Coastguard Worker     }
292*795d594fSAndroid Build Coastguard Worker 
293*795d594fSAndroid Build Coastguard Worker     return b;
294*795d594fSAndroid Build Coastguard Worker   }
295*795d594fSAndroid Build Coastguard Worker 
test06()296*795d594fSAndroid Build Coastguard Worker   static void test06() {
297*795d594fSAndroid Build Coastguard Worker     double norma = $noinline$test06(128)[0];
298*795d594fSAndroid Build Coastguard Worker     System.out.println((int)norma);
299*795d594fSAndroid Build Coastguard Worker   }
300*795d594fSAndroid Build Coastguard Worker 
main(String[] args)301*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
302*795d594fSAndroid Build Coastguard Worker     test01();
303*795d594fSAndroid Build Coastguard Worker     test02();
304*795d594fSAndroid Build Coastguard Worker     test03();
305*795d594fSAndroid Build Coastguard Worker     test04();
306*795d594fSAndroid Build Coastguard Worker     test05();
307*795d594fSAndroid Build Coastguard Worker     test06();
308*795d594fSAndroid Build Coastguard Worker   }
309*795d594fSAndroid Build Coastguard Worker }
310*795d594fSAndroid Build Coastguard Worker 
311