xref: /aosp_15_r20/art/test/661-checker-simd-cf-loops/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2023 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 /**
18*795d594fSAndroid Build Coastguard Worker  * Tests for autovectorization of loops with control flow.
19*795d594fSAndroid Build Coastguard Worker  */
20*795d594fSAndroid Build Coastguard Worker public class Main {
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker   public static final int ARRAY_LENGTH = 128;
23*795d594fSAndroid Build Coastguard Worker   public static final int USED_ARRAY_LENGTH = ARRAY_LENGTH - 1;
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker   public static boolean[] booleanArray = new boolean[ARRAY_LENGTH];
26*795d594fSAndroid Build Coastguard Worker   public static boolean[] booleanArray2 = new boolean[ARRAY_LENGTH];
27*795d594fSAndroid Build Coastguard Worker   public static byte[] byteArray = new byte[ARRAY_LENGTH];
28*795d594fSAndroid Build Coastguard Worker   public static short[] shortArray = new short[ARRAY_LENGTH];
29*795d594fSAndroid Build Coastguard Worker   public static char[] charArray = new char[ARRAY_LENGTH];
30*795d594fSAndroid Build Coastguard Worker   public static int[] intArray = new int[ARRAY_LENGTH];
31*795d594fSAndroid Build Coastguard Worker   public static long[] longArray = new long[ARRAY_LENGTH];
32*795d594fSAndroid Build Coastguard Worker   public static float[] floatArray = new float[ARRAY_LENGTH];
33*795d594fSAndroid Build Coastguard Worker   public static double[] doubleArray = new double[ARRAY_LENGTH];
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker   public static final int MAGIC_VALUE_A = 2;
36*795d594fSAndroid Build Coastguard Worker   public static final int MAGIC_VALUE_B = 10;
37*795d594fSAndroid Build Coastguard Worker   public static final int MAGIC_VALUE_C = 100;
38*795d594fSAndroid Build Coastguard Worker 
39*795d594fSAndroid Build Coastguard Worker   public static final int MAGIC_ADD_CONST = 99;
40*795d594fSAndroid Build Coastguard Worker 
41*795d594fSAndroid Build Coastguard Worker   public static final float MAGIC_FLOAT_VALUE_A = 2.0f;
42*795d594fSAndroid Build Coastguard Worker   public static final float MAGIC_FLOAT_VALUE_B = 10.0f;
43*795d594fSAndroid Build Coastguard Worker   public static final float MAGIC_FLOAT_VALUE_C = 100.0f;
44*795d594fSAndroid Build Coastguard Worker 
45*795d594fSAndroid Build Coastguard Worker   public static final float MAGIC_FLOAT_ADD_CONST = 99.0f;
46*795d594fSAndroid Build Coastguard Worker 
47*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int Main.$compile$noinline$FullDiamond(int[]) loop_optimization (after)
48*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
49*795d594fSAndroid Build Coastguard Worker   //
50*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C0:i\d+>>      IntConstant 0                                         loop:none
51*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C4:i\d+>>      IntConstant 4                                         loop:none
52*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C99:i\d+>>     IntConstant 99                                        loop:none
53*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C100:i\d+>>    IntConstant 100                                       loop:none
54*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Vec4:d\d+>>    VecReplicateScalar [<<C4>>,{{j\d+}}]                  loop:none
55*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Vec99:d\d+>>   VecReplicateScalar [<<C99>>,{{j\d+}}]                 loop:none
56*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Vec100:d\d+>>  VecReplicateScalar [<<C100>>,{{j\d+}}]                loop:none
57*795d594fSAndroid Build Coastguard Worker   //
58*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>     Phi [<<C0>>,{{i\d+}}]                                 loop:<<Loop:B\d+>> outer_loop:none
59*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>   VecPredWhile [<<Phi>>,{{i\d+}}]                       loop:<<Loop>>      outer_loop:none
60*795d594fSAndroid Build Coastguard Worker   //
61*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [<<Arr:l\d+>>,<<Phi>>,<<LoopP>>]              loop:<<Loop>>      outer_loop:none
62*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cond:j\d+>>    VecEqual [<<Load1>>,<<Vec100>>,<<LoopP>>]             loop:<<Loop>>      outer_loop:none
63*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<CondR:j\d+>>   VecPredNot [<<Cond>>,<<LoopP>>]                       loop:<<Loop>>      outer_loop:none
64*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<AddT:d\d+>>    VecAdd [<<Load1>>,<<Vec99>>,<<CondR>>]                loop:<<Loop>>      outer_loop:none
65*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<StT:d\d+>>     VecStore [<<Arr>>,<<Phi>>,<<AddT>>,<<CondR>>]         loop:<<Loop>>      outer_loop:none
66*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<StF:d\d+>>     VecStore [<<Arr>>,<<Phi>>,{{d\d+}},<<Cond>>]          loop:<<Loop>>      outer_loop:none
67*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Ld2:d\d+>>     VecLoad [<<Arr>>,<<Phi>>,<<LoopP>>]                   loop:<<Loop>>      outer_loop:none
68*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add2:d\d+>>    VecAdd [<<Ld2>>,<<Vec4>>,<<LoopP>>]                   loop:<<Loop>>      outer_loop:none
69*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<St21:d\d+>>    VecStore [<<Arr>>,<<Phi>>,<<Add2>>,<<LoopP>>]         loop:<<Loop>>      outer_loop:none
70*795d594fSAndroid Build Coastguard Worker   //
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
72*795d594fSAndroid Build Coastguard Worker   //
73*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT:                      VecLoad
74*795d594fSAndroid Build Coastguard Worker   //
75*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
$compile$noinline$FullDiamond(int[] x)76*795d594fSAndroid Build Coastguard Worker   public static int $compile$noinline$FullDiamond(int[] x) {
77*795d594fSAndroid Build Coastguard Worker     int i = 0;
78*795d594fSAndroid Build Coastguard Worker     for (; i < USED_ARRAY_LENGTH; i++) {
79*795d594fSAndroid Build Coastguard Worker       int val = x[i];
80*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
81*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
82*795d594fSAndroid Build Coastguard Worker       } else {
83*795d594fSAndroid Build Coastguard Worker         x[i] += 3;
84*795d594fSAndroid Build Coastguard Worker       }
85*795d594fSAndroid Build Coastguard Worker       x[i] += 4;
86*795d594fSAndroid Build Coastguard Worker     }
87*795d594fSAndroid Build Coastguard Worker     return i;
88*795d594fSAndroid Build Coastguard Worker   }
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker   //
91*795d594fSAndroid Build Coastguard Worker   // Test various types.
92*795d594fSAndroid Build Coastguard Worker   //
93*795d594fSAndroid Build Coastguard Worker 
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleBoolean(boolean[], boolean[]) loop_optimization (after)
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
96*795d594fSAndroid Build Coastguard Worker   //
97*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
98*795d594fSAndroid Build Coastguard Worker   //
99*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
100*795d594fSAndroid Build Coastguard Worker   //
101*795d594fSAndroid Build Coastguard Worker   // TODO: Support extra condition types and boolean comparisons.
$compile$noinline$SimpleBoolean(boolean[] x, boolean[] y)102*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleBoolean(boolean[] x, boolean[] y) {
103*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
104*795d594fSAndroid Build Coastguard Worker       boolean val = x[i];
105*795d594fSAndroid Build Coastguard Worker       if (val != y[i]) {
106*795d594fSAndroid Build Coastguard Worker         x[i] |= y[i];
107*795d594fSAndroid Build Coastguard Worker       }
108*795d594fSAndroid Build Coastguard Worker     }
109*795d594fSAndroid Build Coastguard Worker   }
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleByte(byte[]) loop_optimization (after)
112*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
113*795d594fSAndroid Build Coastguard Worker   //
114*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: VecLoad
115*795d594fSAndroid Build Coastguard Worker   //
116*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
$compile$noinline$SimpleByte(byte[] x)117*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleByte(byte[] x) {
118*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
119*795d594fSAndroid Build Coastguard Worker       byte val = x[i];
120*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
121*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
122*795d594fSAndroid Build Coastguard Worker       }
123*795d594fSAndroid Build Coastguard Worker     }
124*795d594fSAndroid Build Coastguard Worker   }
125*795d594fSAndroid Build Coastguard Worker 
126*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleUByte(byte[]) loop_optimization (after)
127*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
128*795d594fSAndroid Build Coastguard Worker   //
129*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: VecLoad
130*795d594fSAndroid Build Coastguard Worker   //
131*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
$compile$noinline$SimpleUByte(byte[] x)132*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleUByte(byte[] x) {
133*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
134*795d594fSAndroid Build Coastguard Worker       if ((x[i] & 0xFF) != MAGIC_VALUE_C) {
135*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
136*795d594fSAndroid Build Coastguard Worker       }
137*795d594fSAndroid Build Coastguard Worker     }
138*795d594fSAndroid Build Coastguard Worker   }
139*795d594fSAndroid Build Coastguard Worker 
140*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleShort(short[]) loop_optimization (after)
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
142*795d594fSAndroid Build Coastguard Worker   //
143*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: VecLoad
144*795d594fSAndroid Build Coastguard Worker   //
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
$compile$noinline$SimpleShort(short[] x)146*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleShort(short[] x) {
147*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
148*795d594fSAndroid Build Coastguard Worker       short val = x[i];
149*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
150*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
151*795d594fSAndroid Build Coastguard Worker       }
152*795d594fSAndroid Build Coastguard Worker     }
153*795d594fSAndroid Build Coastguard Worker   }
154*795d594fSAndroid Build Coastguard Worker 
155*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleChar(char[]) loop_optimization (after)
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
157*795d594fSAndroid Build Coastguard Worker   //
158*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: VecLoad
159*795d594fSAndroid Build Coastguard Worker   //
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
$compile$noinline$SimpleChar(char[] x)161*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleChar(char[] x) {
162*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
163*795d594fSAndroid Build Coastguard Worker       char val = x[i];
164*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
165*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
166*795d594fSAndroid Build Coastguard Worker       }
167*795d594fSAndroid Build Coastguard Worker     }
168*795d594fSAndroid Build Coastguard Worker   }
169*795d594fSAndroid Build Coastguard Worker 
170*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleInt(int[]) loop_optimization (after)
171*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
172*795d594fSAndroid Build Coastguard Worker   //
173*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: VecLoad
174*795d594fSAndroid Build Coastguard Worker   //
175*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
$compile$noinline$SimpleInt(int[] x)176*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleInt(int[] x) {
177*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
178*795d594fSAndroid Build Coastguard Worker       int val = x[i];
179*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
180*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
181*795d594fSAndroid Build Coastguard Worker       }
182*795d594fSAndroid Build Coastguard Worker     }
183*795d594fSAndroid Build Coastguard Worker   }
184*795d594fSAndroid Build Coastguard Worker 
185*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleLong(long[]) loop_optimization (after)
186*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
187*795d594fSAndroid Build Coastguard Worker   //
188*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
189*795d594fSAndroid Build Coastguard Worker   //
190*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
191*795d594fSAndroid Build Coastguard Worker   //
192*795d594fSAndroid Build Coastguard Worker   // TODO: Support long comparisons.
$compile$noinline$SimpleLong(long[] x)193*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleLong(long[] x) {
194*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
195*795d594fSAndroid Build Coastguard Worker       long val = x[i];
196*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
197*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
198*795d594fSAndroid Build Coastguard Worker       }
199*795d594fSAndroid Build Coastguard Worker     }
200*795d594fSAndroid Build Coastguard Worker   }
201*795d594fSAndroid Build Coastguard Worker 
202*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleFloat(float[]) loop_optimization (after)
203*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
204*795d594fSAndroid Build Coastguard Worker   //
205*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
206*795d594fSAndroid Build Coastguard Worker   //
207*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
208*795d594fSAndroid Build Coastguard Worker   //
209*795d594fSAndroid Build Coastguard Worker   // TODO: Support FP comparisons.
$compile$noinline$SimpleFloat(float[] x)210*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleFloat(float[] x) {
211*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
212*795d594fSAndroid Build Coastguard Worker       float val = x[i];
213*795d594fSAndroid Build Coastguard Worker       if (val > 10.0f) {
214*795d594fSAndroid Build Coastguard Worker         x[i] += 99.1f;
215*795d594fSAndroid Build Coastguard Worker       }
216*795d594fSAndroid Build Coastguard Worker     }
217*795d594fSAndroid Build Coastguard Worker   }
218*795d594fSAndroid Build Coastguard Worker 
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleDouble(double[]) loop_optimization (after)
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
221*795d594fSAndroid Build Coastguard Worker   //
222*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
223*795d594fSAndroid Build Coastguard Worker   //
224*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
225*795d594fSAndroid Build Coastguard Worker   //
226*795d594fSAndroid Build Coastguard Worker   // TODO: Support FP comparisons.
$compile$noinline$SimpleDouble(double[] x)227*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleDouble(double[] x) {
228*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
229*795d594fSAndroid Build Coastguard Worker       double val = x[i];
230*795d594fSAndroid Build Coastguard Worker       if (val != 10.0) {
231*795d594fSAndroid Build Coastguard Worker         x[i] += 99.1;
232*795d594fSAndroid Build Coastguard Worker       }
233*795d594fSAndroid Build Coastguard Worker     }
234*795d594fSAndroid Build Coastguard Worker   }
235*795d594fSAndroid Build Coastguard Worker 
236*795d594fSAndroid Build Coastguard Worker   //
237*795d594fSAndroid Build Coastguard Worker   // Narrowing types.
238*795d594fSAndroid Build Coastguard Worker   //
239*795d594fSAndroid Build Coastguard Worker 
240*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$ByteConv(byte[], byte[]) loop_optimization (after)
241*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
242*795d594fSAndroid Build Coastguard Worker   //
243*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: VecLoad
244*795d594fSAndroid Build Coastguard Worker   //
245*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
$compile$noinline$ByteConv(byte[] x, byte[] y)246*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$ByteConv(byte[] x, byte[] y) {
247*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
248*795d594fSAndroid Build Coastguard Worker       byte val = (byte)(x[i] + 1);
249*795d594fSAndroid Build Coastguard Worker       if (val != y[i]) {
250*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
251*795d594fSAndroid Build Coastguard Worker       }
252*795d594fSAndroid Build Coastguard Worker     }
253*795d594fSAndroid Build Coastguard Worker   }
254*795d594fSAndroid Build Coastguard Worker 
255*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$UByteAndWrongConst(byte[]) loop_optimization (after)
256*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
257*795d594fSAndroid Build Coastguard Worker   //
258*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
259*795d594fSAndroid Build Coastguard Worker   //
260*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
261*795d594fSAndroid Build Coastguard Worker   //
262*795d594fSAndroid Build Coastguard Worker   // 'NarrowerOperands' not met: the constant is not a ubyte one.
$compile$noinline$UByteAndWrongConst(byte[] x)263*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$UByteAndWrongConst(byte[] x) {
264*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
265*795d594fSAndroid Build Coastguard Worker       if ((x[i] & 0xFF) != (MAGIC_VALUE_C | 0x100)) {
266*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
267*795d594fSAndroid Build Coastguard Worker       }
268*795d594fSAndroid Build Coastguard Worker     }
269*795d594fSAndroid Build Coastguard Worker   }
270*795d594fSAndroid Build Coastguard Worker 
271*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$ByteNoHiBits(byte[], byte[]) loop_optimization (after)
272*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
273*795d594fSAndroid Build Coastguard Worker   //
274*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
275*795d594fSAndroid Build Coastguard Worker   //
276*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
277*795d594fSAndroid Build Coastguard Worker   //
278*795d594fSAndroid Build Coastguard Worker   // Check kNoHiBits case when "wider" operations cannot bring in higher order bits.
$compile$noinline$ByteNoHiBits(byte[] x, byte[] y)279*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$ByteNoHiBits(byte[] x, byte[] y) {
280*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
281*795d594fSAndroid Build Coastguard Worker       byte val = x[i];
282*795d594fSAndroid Build Coastguard Worker       if ((val >>> 3) != y[i]) {
283*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
284*795d594fSAndroid Build Coastguard Worker       }
285*795d594fSAndroid Build Coastguard Worker     }
286*795d594fSAndroid Build Coastguard Worker   }
287*795d594fSAndroid Build Coastguard Worker 
288*795d594fSAndroid Build Coastguard Worker   //
289*795d594fSAndroid Build Coastguard Worker   // Test condition types.
290*795d594fSAndroid Build Coastguard Worker   //
291*795d594fSAndroid Build Coastguard Worker 
292*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleCondition(int[]) loop_optimization (before)
293*795d594fSAndroid Build Coastguard Worker   //
294*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C0:i\d+>>      IntConstant 0                                                           loop:none
295*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C100:i\d+>>    IntConstant 100                                                         loop:none
296*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C199:i\d+>>    IntConstant 199                                                         loop:none
297*795d594fSAndroid Build Coastguard Worker   //
298*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>     Phi [<<C0>>,{{i\d+}}]                                                   loop:<<Loop:B\d+>>
299*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:i\d+>>    ArrayGet [<<Arr:l\d+>>,<<Phi>>]                                         loop:<<Loop>>
300*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cond:z\d+>>    NotEqual [<<Load>>,<<C100>>]                                            loop:<<Loop>>
301*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  If [<<Cond>>]                                                           loop:<<Loop>>
302*795d594fSAndroid Build Coastguard Worker   //
303*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  ArraySet [<<Arr>>,<<Phi>>,<<C199>>]                                     loop:<<Loop>>
304*795d594fSAndroid Build Coastguard Worker   //
305*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SimpleCondition(int[]) loop_optimization (after)
306*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
307*795d594fSAndroid Build Coastguard Worker   //
308*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C0:i\d+>>      IntConstant 0                                                           loop:none
309*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C100:i\d+>>    IntConstant 100                                                         loop:none
310*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<C199:i\d+>>    IntConstant 199                                                         loop:none
311*795d594fSAndroid Build Coastguard Worker   //
312*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Vec100:d\d+>>  VecReplicateScalar [<<C100>>,{{j\d+}}]           packed_type:Int32      loop:none
313*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Vec199:d\d+>>  VecReplicateScalar [<<C199>>,{{j\d+}}]           packed_type:Int32      loop:none
314*795d594fSAndroid Build Coastguard Worker   //
315*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi:i\d+>>     Phi [<<C0>>,{{i\d+}}]                                                   loop:<<Loop:B\d+>>
316*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>   VecPredWhile [<<Phi>>,{{i\d+}}]                                         loop:<<Loop>>
317*795d594fSAndroid Build Coastguard Worker   //
318*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>    VecLoad [<<Arr:l\d+>>,<<Phi>>,<<LoopP>>]         packed_type:Int32      loop:<<Loop>>
319*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cond:j\d+>>    VecNotEqual [<<Load>>,<<Vec100>>,<<LoopP>>]      packed_type:Int32      loop:<<Loop>>
320*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<CondR:j\d+>>   VecPredNot [<<Cond>>,<<LoopP>>]                  packed_type:Int32      loop:<<Loop>>
321*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecStore [<<Arr>>,<<Phi>>,<<Vec199>>,<<CondR>>]  packed_type:Int32      loop:<<Loop>>
322*795d594fSAndroid Build Coastguard Worker   //
323*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
324*795d594fSAndroid Build Coastguard Worker   //
325*795d594fSAndroid Build Coastguard Worker   // Example of a condition being vectorized. See loop_optimization_test.cc and codegen_test.cc for
326*795d594fSAndroid Build Coastguard Worker   // full testing of vector conditions.
$compile$noinline$SimpleCondition(int[] x)327*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SimpleCondition(int[] x) {
328*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
329*795d594fSAndroid Build Coastguard Worker       int val = x[i];
330*795d594fSAndroid Build Coastguard Worker       if (val == MAGIC_VALUE_C) {
331*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
332*795d594fSAndroid Build Coastguard Worker       }
333*795d594fSAndroid Build Coastguard Worker     }
334*795d594fSAndroid Build Coastguard Worker   }
335*795d594fSAndroid Build Coastguard Worker 
336*795d594fSAndroid Build Coastguard Worker   //
337*795d594fSAndroid Build Coastguard Worker   // Test vectorization idioms.
338*795d594fSAndroid Build Coastguard Worker   //
339*795d594fSAndroid Build Coastguard Worker 
340*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$Select(int[]) loop_optimization (after)
341*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
342*795d594fSAndroid Build Coastguard Worker   //
343*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
344*795d594fSAndroid Build Coastguard Worker   //
345*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
346*795d594fSAndroid Build Coastguard Worker   //
347*795d594fSAndroid Build Coastguard Worker   // TODO: vectorize loops with select in the body.
$compile$noinline$Select(int[] x)348*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$Select(int[] x) {
349*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
350*795d594fSAndroid Build Coastguard Worker       int val = x[i];
351*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
352*795d594fSAndroid Build Coastguard Worker         val += MAGIC_ADD_CONST;
353*795d594fSAndroid Build Coastguard Worker       }
354*795d594fSAndroid Build Coastguard Worker       x[i] = val;
355*795d594fSAndroid Build Coastguard Worker     }
356*795d594fSAndroid Build Coastguard Worker   }
357*795d594fSAndroid Build Coastguard Worker 
358*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$Phi(int[]) loop_optimization (after)
359*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
360*795d594fSAndroid Build Coastguard Worker   //
361*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
362*795d594fSAndroid Build Coastguard Worker   //
363*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
364*795d594fSAndroid Build Coastguard Worker   //
365*795d594fSAndroid Build Coastguard Worker   // TODO: vectorize loops with phis in the body.
$compile$noinline$Phi(int[] x)366*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$Phi(int[] x) {
367*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
368*795d594fSAndroid Build Coastguard Worker       int val = x[i];
369*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
370*795d594fSAndroid Build Coastguard Worker         val += MAGIC_ADD_CONST;
371*795d594fSAndroid Build Coastguard Worker         x[i] += val;
372*795d594fSAndroid Build Coastguard Worker       }
373*795d594fSAndroid Build Coastguard Worker       x[i] += val;
374*795d594fSAndroid Build Coastguard Worker     }
375*795d594fSAndroid Build Coastguard Worker   }
376*795d594fSAndroid Build Coastguard Worker 
377*795d594fSAndroid Build Coastguard Worker   // TODO: when Phis are supported, test dotprod and sad idioms.
378*795d594fSAndroid Build Coastguard Worker 
379*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int Main.$compile$noinline$Reduction(int[]) loop_optimization (after)
380*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
381*795d594fSAndroid Build Coastguard Worker   //
382*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
383*795d594fSAndroid Build Coastguard Worker   //
384*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
385*795d594fSAndroid Build Coastguard Worker   //
386*795d594fSAndroid Build Coastguard Worker   // TODO: vectorize loops with phis and reductions in the body.
$compile$noinline$Reduction(int[] x)387*795d594fSAndroid Build Coastguard Worker   private static int $compile$noinline$Reduction(int[] x) {
388*795d594fSAndroid Build Coastguard Worker     int sum = 0;
389*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ARRAY_LENGTH; i++) {
390*795d594fSAndroid Build Coastguard Worker       int val = x[i];
391*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
392*795d594fSAndroid Build Coastguard Worker         sum += val + x[i];
393*795d594fSAndroid Build Coastguard Worker       }
394*795d594fSAndroid Build Coastguard Worker     }
395*795d594fSAndroid Build Coastguard Worker     return sum;
396*795d594fSAndroid Build Coastguard Worker   }
397*795d594fSAndroid Build Coastguard Worker 
398*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int Main.$compile$noinline$ReductionBackEdge(int[]) loop_optimization (after)
399*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
400*795d594fSAndroid Build Coastguard Worker   //
401*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: VecLoad
402*795d594fSAndroid Build Coastguard Worker   //
403*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
404*795d594fSAndroid Build Coastguard Worker   //
405*795d594fSAndroid Build Coastguard Worker   // Reduction in the back edge block, non-CF-dependent.
$compile$noinline$ReductionBackEdge(int[] x)406*795d594fSAndroid Build Coastguard Worker   public static int $compile$noinline$ReductionBackEdge(int[] x) {
407*795d594fSAndroid Build Coastguard Worker     int sum = 0;
408*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
409*795d594fSAndroid Build Coastguard Worker       int val = x[i];
410*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
411*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
412*795d594fSAndroid Build Coastguard Worker       }
413*795d594fSAndroid Build Coastguard Worker       sum += x[i];
414*795d594fSAndroid Build Coastguard Worker     }
415*795d594fSAndroid Build Coastguard Worker     return sum;
416*795d594fSAndroid Build Coastguard Worker   }
417*795d594fSAndroid Build Coastguard Worker 
418*795d594fSAndroid Build Coastguard Worker   //
419*795d594fSAndroid Build Coastguard Worker   // Negative compile tests.
420*795d594fSAndroid Build Coastguard Worker   //
421*795d594fSAndroid Build Coastguard Worker 
422*795d594fSAndroid Build Coastguard Worker   public static final int STENCIL_ARRAY_SIZE = 130;
423*795d594fSAndroid Build Coastguard Worker 
424*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$stencilAlike(int[], int[]) loop_optimization (after)
425*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
426*795d594fSAndroid Build Coastguard Worker   //
427*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
428*795d594fSAndroid Build Coastguard Worker   //
429*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
430*795d594fSAndroid Build Coastguard Worker   //
431*795d594fSAndroid Build Coastguard Worker   // This loop needs a runtime test for array references disambiguation and a scalar cleanup loop.
432*795d594fSAndroid Build Coastguard Worker   // Currently we can't generate a scalar clean up loop with control flow.
$compile$noinline$stencilAlike(int[] a, int[] b)433*795d594fSAndroid Build Coastguard Worker   private static void $compile$noinline$stencilAlike(int[] a, int[] b) {
434*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) {
435*795d594fSAndroid Build Coastguard Worker       int val0 = b[i - 1];
436*795d594fSAndroid Build Coastguard Worker       int val1 = b[i];
437*795d594fSAndroid Build Coastguard Worker       int val2 = b[i + 1];
438*795d594fSAndroid Build Coastguard Worker       int un = a[i];
439*795d594fSAndroid Build Coastguard Worker       if (val1 != MAGIC_VALUE_C) {
440*795d594fSAndroid Build Coastguard Worker         a[i] = val0 + val1 + val2;
441*795d594fSAndroid Build Coastguard Worker       }
442*795d594fSAndroid Build Coastguard Worker     }
443*795d594fSAndroid Build Coastguard Worker   }
444*795d594fSAndroid Build Coastguard Worker 
445*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$NotDiamondCf(int[]) loop_optimization (after)
446*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
447*795d594fSAndroid Build Coastguard Worker   //
448*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
449*795d594fSAndroid Build Coastguard Worker   //
450*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
451*795d594fSAndroid Build Coastguard Worker   //
452*795d594fSAndroid Build Coastguard Worker   // Loops with complex CF are not supported.
$compile$noinline$NotDiamondCf(int[] x)453*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$NotDiamondCf(int[] x) {
454*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
455*795d594fSAndroid Build Coastguard Worker       int val = x[i];
456*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
457*795d594fSAndroid Build Coastguard Worker         if (val != 1234) {
458*795d594fSAndroid Build Coastguard Worker           x[i] += MAGIC_ADD_CONST;
459*795d594fSAndroid Build Coastguard Worker         }
460*795d594fSAndroid Build Coastguard Worker       }
461*795d594fSAndroid Build Coastguard Worker     }
462*795d594fSAndroid Build Coastguard Worker   }
463*795d594fSAndroid Build Coastguard Worker 
464*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$BrokenInduction(int[]) loop_optimization (after)
465*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
466*795d594fSAndroid Build Coastguard Worker   //
467*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
468*795d594fSAndroid Build Coastguard Worker   //
469*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
$compile$noinline$BrokenInduction(int[] x)470*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$BrokenInduction(int[] x) {
471*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
472*795d594fSAndroid Build Coastguard Worker       int val = x[i];
473*795d594fSAndroid Build Coastguard Worker       if (val != MAGIC_VALUE_C) {
474*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
475*795d594fSAndroid Build Coastguard Worker         i++;
476*795d594fSAndroid Build Coastguard Worker       }
477*795d594fSAndroid Build Coastguard Worker     }
478*795d594fSAndroid Build Coastguard Worker   }
479*795d594fSAndroid Build Coastguard Worker 
480*795d594fSAndroid Build Coastguard Worker   //
481*795d594fSAndroid Build Coastguard Worker   // Non-condition if statements.
482*795d594fSAndroid Build Coastguard Worker   //
483*795d594fSAndroid Build Coastguard Worker 
484*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$SingleBoolean(int[], boolean) loop_optimization (after)
485*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
486*795d594fSAndroid Build Coastguard Worker   //
487*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
488*795d594fSAndroid Build Coastguard Worker   //
489*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
490*795d594fSAndroid Build Coastguard Worker   //
491*795d594fSAndroid Build Coastguard Worker   // Check that single boolean if statements are not vectorized because only binary condition if
492*795d594fSAndroid Build Coastguard Worker   // statements are supported.
$compile$noinline$SingleBoolean(int[] x, boolean y)493*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$SingleBoolean(int[] x, boolean y) {
494*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
495*795d594fSAndroid Build Coastguard Worker       if (y) {
496*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
497*795d594fSAndroid Build Coastguard Worker       }
498*795d594fSAndroid Build Coastguard Worker     }
499*795d594fSAndroid Build Coastguard Worker   }
500*795d594fSAndroid Build Coastguard Worker 
501*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void Main.$compile$noinline$InstanceOf(int[], java.lang.Object) loop_optimization (after)
502*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
503*795d594fSAndroid Build Coastguard Worker   //
504*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecLoad
505*795d594fSAndroid Build Coastguard Worker   //
506*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
507*795d594fSAndroid Build Coastguard Worker   //
508*795d594fSAndroid Build Coastguard Worker   // Check that control flow without a condition is not vectorized because only binary condition if
509*795d594fSAndroid Build Coastguard Worker   // statements are supported.
$compile$noinline$InstanceOf(int[] x, Object y)510*795d594fSAndroid Build Coastguard Worker   public static void $compile$noinline$InstanceOf(int[] x, Object y) {
511*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < USED_ARRAY_LENGTH; i++) {
512*795d594fSAndroid Build Coastguard Worker       if (y instanceof Main) {
513*795d594fSAndroid Build Coastguard Worker         x[i] += MAGIC_ADD_CONST;
514*795d594fSAndroid Build Coastguard Worker       }
515*795d594fSAndroid Build Coastguard Worker     }
516*795d594fSAndroid Build Coastguard Worker   }
517*795d594fSAndroid Build Coastguard Worker 
518*795d594fSAndroid Build Coastguard Worker   //
519*795d594fSAndroid Build Coastguard Worker   // Main driver.
520*795d594fSAndroid Build Coastguard Worker   //
521*795d594fSAndroid Build Coastguard Worker 
main(String[] args)522*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
523*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
524*795d594fSAndroid Build Coastguard Worker     int final_ind_value = $compile$noinline$FullDiamond(intArray);
525*795d594fSAndroid Build Coastguard Worker     expectIntEquals(23755, IntArraySum(intArray));
526*795d594fSAndroid Build Coastguard Worker     expectIntEquals(USED_ARRAY_LENGTH, final_ind_value);
527*795d594fSAndroid Build Coastguard Worker 
528*795d594fSAndroid Build Coastguard Worker     // Types.
529*795d594fSAndroid Build Coastguard Worker     initBooleanArray(booleanArray);
530*795d594fSAndroid Build Coastguard Worker     booleanArray2[12] = true;
531*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleBoolean(booleanArray, booleanArray2);
532*795d594fSAndroid Build Coastguard Worker     expectIntEquals(86, BooleanArraySum(booleanArray));
533*795d594fSAndroid Build Coastguard Worker 
534*795d594fSAndroid Build Coastguard Worker     initByteArray(byteArray);
535*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleByte(byteArray);
536*795d594fSAndroid Build Coastguard Worker     expectIntEquals(-64, ByteArraySum(byteArray));
537*795d594fSAndroid Build Coastguard Worker 
538*795d594fSAndroid Build Coastguard Worker     initByteArray(byteArray);
539*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleUByte(byteArray);
540*795d594fSAndroid Build Coastguard Worker     expectIntEquals(-64, ByteArraySum(byteArray));
541*795d594fSAndroid Build Coastguard Worker 
542*795d594fSAndroid Build Coastguard Worker     initShortArray(shortArray);
543*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleShort(shortArray);
544*795d594fSAndroid Build Coastguard Worker     expectIntEquals(23121, ShortArraySum(shortArray));
545*795d594fSAndroid Build Coastguard Worker 
546*795d594fSAndroid Build Coastguard Worker     initCharArray(charArray);
547*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleChar(charArray);
548*795d594fSAndroid Build Coastguard Worker     expectIntEquals(23121, CharArraySum(charArray));
549*795d594fSAndroid Build Coastguard Worker 
550*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
551*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleInt(intArray);
552*795d594fSAndroid Build Coastguard Worker     expectIntEquals(23121, IntArraySum(intArray));
553*795d594fSAndroid Build Coastguard Worker 
554*795d594fSAndroid Build Coastguard Worker     initLongArray(longArray);
555*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleLong(longArray);
556*795d594fSAndroid Build Coastguard Worker     expectLongEquals(23121, LongArraySum(longArray));
557*795d594fSAndroid Build Coastguard Worker 
558*795d594fSAndroid Build Coastguard Worker     initFloatArray(floatArray);
559*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleFloat(floatArray);
560*795d594fSAndroid Build Coastguard Worker     expectFloatEquals(18868.2f, FloatArraySum(floatArray));
561*795d594fSAndroid Build Coastguard Worker 
562*795d594fSAndroid Build Coastguard Worker     initDoubleArray(doubleArray);
563*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleDouble(doubleArray);
564*795d594fSAndroid Build Coastguard Worker     expectDoubleEquals(23129.5, DoubleArraySum(doubleArray));
565*795d594fSAndroid Build Coastguard Worker 
566*795d594fSAndroid Build Coastguard Worker     // Narrowing types.
567*795d594fSAndroid Build Coastguard Worker     initByteArray(byteArray);
568*795d594fSAndroid Build Coastguard Worker     $compile$noinline$ByteConv(byteArray, byteArray);
569*795d594fSAndroid Build Coastguard Worker     expectIntEquals(-2, ByteArraySum(byteArray));
570*795d594fSAndroid Build Coastguard Worker 
571*795d594fSAndroid Build Coastguard Worker     initByteArray(byteArray);
572*795d594fSAndroid Build Coastguard Worker     $compile$noinline$UByteAndWrongConst(byteArray);
573*795d594fSAndroid Build Coastguard Worker     expectIntEquals(-2, ByteArraySum(byteArray));
574*795d594fSAndroid Build Coastguard Worker 
575*795d594fSAndroid Build Coastguard Worker     initByteArray(byteArray);
576*795d594fSAndroid Build Coastguard Worker     $compile$noinline$ByteNoHiBits(byteArray, byteArray);
577*795d594fSAndroid Build Coastguard Worker     expectIntEquals(-2, ByteArraySum(byteArray));
578*795d594fSAndroid Build Coastguard Worker 
579*795d594fSAndroid Build Coastguard Worker     // Conditions.
580*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
581*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SimpleCondition(intArray);
582*795d594fSAndroid Build Coastguard Worker     expectIntEquals(18864, IntArraySum(intArray));
583*795d594fSAndroid Build Coastguard Worker 
584*795d594fSAndroid Build Coastguard Worker     // Idioms.
585*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
586*795d594fSAndroid Build Coastguard Worker     $compile$noinline$Select(intArray);
587*795d594fSAndroid Build Coastguard Worker     expectIntEquals(23121, IntArraySum(intArray));
588*795d594fSAndroid Build Coastguard Worker 
589*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
590*795d594fSAndroid Build Coastguard Worker     $compile$noinline$Phi(intArray);
591*795d594fSAndroid Build Coastguard Worker     expectIntEquals(36748, IntArraySum(intArray));
592*795d594fSAndroid Build Coastguard Worker 
593*795d594fSAndroid Build Coastguard Worker     int reduction_result = 0;
594*795d594fSAndroid Build Coastguard Worker 
595*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
596*795d594fSAndroid Build Coastguard Worker     reduction_result = $compile$noinline$Reduction(intArray);
597*795d594fSAndroid Build Coastguard Worker     expectIntEquals(14706, IntArraySum(intArray));
598*795d594fSAndroid Build Coastguard Worker     expectIntEquals(21012, reduction_result);
599*795d594fSAndroid Build Coastguard Worker 
600*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
601*795d594fSAndroid Build Coastguard Worker     reduction_result = $compile$noinline$ReductionBackEdge(intArray);
602*795d594fSAndroid Build Coastguard Worker     expectIntEquals(23121, IntArraySum(intArray));
603*795d594fSAndroid Build Coastguard Worker     expectIntEquals(13121, reduction_result);
604*795d594fSAndroid Build Coastguard Worker 
605*795d594fSAndroid Build Coastguard Worker     int[] stencilArrayA = new int[STENCIL_ARRAY_SIZE];
606*795d594fSAndroid Build Coastguard Worker     int[] stencilArrayB = new int[STENCIL_ARRAY_SIZE];
607*795d594fSAndroid Build Coastguard Worker     initIntArray(stencilArrayA);
608*795d594fSAndroid Build Coastguard Worker     initIntArray(stencilArrayB);
609*795d594fSAndroid Build Coastguard Worker     $compile$noinline$stencilAlike(stencilArrayA, stencilArrayB);
610*795d594fSAndroid Build Coastguard Worker     expectIntEquals(43602, IntArraySum(stencilArrayA));
611*795d594fSAndroid Build Coastguard Worker 
612*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
613*795d594fSAndroid Build Coastguard Worker     $compile$noinline$NotDiamondCf(intArray);
614*795d594fSAndroid Build Coastguard Worker     expectIntEquals(23121, IntArraySum(intArray));
615*795d594fSAndroid Build Coastguard Worker 
616*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
617*795d594fSAndroid Build Coastguard Worker     $compile$noinline$BrokenInduction(intArray);
618*795d594fSAndroid Build Coastguard Worker     expectIntEquals(18963, IntArraySum(intArray));
619*795d594fSAndroid Build Coastguard Worker 
620*795d594fSAndroid Build Coastguard Worker     // Non-condition if statements.
621*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
622*795d594fSAndroid Build Coastguard Worker     $compile$noinline$SingleBoolean(intArray, true);
623*795d594fSAndroid Build Coastguard Worker     expectIntEquals(27279, IntArraySum(intArray));
624*795d594fSAndroid Build Coastguard Worker 
625*795d594fSAndroid Build Coastguard Worker     initIntArray(intArray);
626*795d594fSAndroid Build Coastguard Worker     Main instance = new Main();
627*795d594fSAndroid Build Coastguard Worker     $compile$noinline$InstanceOf(intArray, instance);
628*795d594fSAndroid Build Coastguard Worker     expectIntEquals(27279, IntArraySum(intArray));
629*795d594fSAndroid Build Coastguard Worker 
630*795d594fSAndroid Build Coastguard Worker     System.out.println("passed");
631*795d594fSAndroid Build Coastguard Worker   }
632*795d594fSAndroid Build Coastguard Worker 
initBooleanArray(boolean[] a)633*795d594fSAndroid Build Coastguard Worker   public static void initBooleanArray(boolean[] a) {
634*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ARRAY_LENGTH; i++) {
635*795d594fSAndroid Build Coastguard Worker       if (i % 3 != 0) {
636*795d594fSAndroid Build Coastguard Worker         a[i] = true;
637*795d594fSAndroid Build Coastguard Worker       }
638*795d594fSAndroid Build Coastguard Worker     }
639*795d594fSAndroid Build Coastguard Worker   }
640*795d594fSAndroid Build Coastguard Worker 
initByteArray(byte[] a)641*795d594fSAndroid Build Coastguard Worker   public static void initByteArray(byte[] a) {
642*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ARRAY_LENGTH; i++) {
643*795d594fSAndroid Build Coastguard Worker       if (i % 3 == 0) {
644*795d594fSAndroid Build Coastguard Worker         a[i] = (byte)MAGIC_VALUE_A;
645*795d594fSAndroid Build Coastguard Worker       } else if (i % 3 == 1) {
646*795d594fSAndroid Build Coastguard Worker         a[i] = (byte)MAGIC_VALUE_B;
647*795d594fSAndroid Build Coastguard Worker       } else {
648*795d594fSAndroid Build Coastguard Worker         a[i] = (byte)MAGIC_VALUE_C;
649*795d594fSAndroid Build Coastguard Worker       }
650*795d594fSAndroid Build Coastguard Worker     }
651*795d594fSAndroid Build Coastguard Worker     a[USED_ARRAY_LENGTH] = 127;
652*795d594fSAndroid Build Coastguard Worker   }
653*795d594fSAndroid Build Coastguard Worker 
initShortArray(short[] a)654*795d594fSAndroid Build Coastguard Worker   public static void initShortArray(short[] a) {
655*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ARRAY_LENGTH; i++) {
656*795d594fSAndroid Build Coastguard Worker       if (i % 3 == 0) {
657*795d594fSAndroid Build Coastguard Worker         a[i] = (short)MAGIC_VALUE_A;
658*795d594fSAndroid Build Coastguard Worker       } else if (i % 3 == 1) {
659*795d594fSAndroid Build Coastguard Worker         a[i] = (short)MAGIC_VALUE_B;
660*795d594fSAndroid Build Coastguard Worker       } else {
661*795d594fSAndroid Build Coastguard Worker         a[i] = (short)MAGIC_VALUE_C;
662*795d594fSAndroid Build Coastguard Worker       }
663*795d594fSAndroid Build Coastguard Worker     }
664*795d594fSAndroid Build Coastguard Worker     a[USED_ARRAY_LENGTH] = 10000;
665*795d594fSAndroid Build Coastguard Worker   }
666*795d594fSAndroid Build Coastguard Worker 
initCharArray(char[] a)667*795d594fSAndroid Build Coastguard Worker   public static void initCharArray(char[] a) {
668*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ARRAY_LENGTH; i++) {
669*795d594fSAndroid Build Coastguard Worker       if (i % 3 == 0) {
670*795d594fSAndroid Build Coastguard Worker         a[i] = (char)MAGIC_VALUE_A;
671*795d594fSAndroid Build Coastguard Worker       } else if (i % 3 == 1) {
672*795d594fSAndroid Build Coastguard Worker         a[i] = (char)MAGIC_VALUE_B;
673*795d594fSAndroid Build Coastguard Worker       } else {
674*795d594fSAndroid Build Coastguard Worker         a[i] = (char)MAGIC_VALUE_C;
675*795d594fSAndroid Build Coastguard Worker       }
676*795d594fSAndroid Build Coastguard Worker     }
677*795d594fSAndroid Build Coastguard Worker     a[USED_ARRAY_LENGTH] = 10000;
678*795d594fSAndroid Build Coastguard Worker   }
679*795d594fSAndroid Build Coastguard Worker 
initIntArray(int[] a)680*795d594fSAndroid Build Coastguard Worker   public static void initIntArray(int[] a) {
681*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ARRAY_LENGTH; i++) {
682*795d594fSAndroid Build Coastguard Worker       if (i % 3 == 0) {
683*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_VALUE_A;
684*795d594fSAndroid Build Coastguard Worker       } else if (i % 3 == 1) {
685*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_VALUE_B;
686*795d594fSAndroid Build Coastguard Worker       } else {
687*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_VALUE_C;
688*795d594fSAndroid Build Coastguard Worker       }
689*795d594fSAndroid Build Coastguard Worker     }
690*795d594fSAndroid Build Coastguard Worker     a[USED_ARRAY_LENGTH] = 10000;
691*795d594fSAndroid Build Coastguard Worker   }
692*795d594fSAndroid Build Coastguard Worker 
initLongArray(long[] a)693*795d594fSAndroid Build Coastguard Worker   public static void initLongArray(long[] a) {
694*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ARRAY_LENGTH; i++) {
695*795d594fSAndroid Build Coastguard Worker       if (i % 3 == 0) {
696*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_VALUE_A;
697*795d594fSAndroid Build Coastguard Worker       } else if (i % 3 == 1) {
698*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_VALUE_B;
699*795d594fSAndroid Build Coastguard Worker       } else {
700*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_VALUE_C;
701*795d594fSAndroid Build Coastguard Worker       }
702*795d594fSAndroid Build Coastguard Worker     }
703*795d594fSAndroid Build Coastguard Worker     a[USED_ARRAY_LENGTH] = 10000;
704*795d594fSAndroid Build Coastguard Worker   }
705*795d594fSAndroid Build Coastguard Worker 
initFloatArray(float[] a)706*795d594fSAndroid Build Coastguard Worker   public static void initFloatArray(float[] a) {
707*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ARRAY_LENGTH; i++) {
708*795d594fSAndroid Build Coastguard Worker       if (i % 3 == 0) {
709*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_FLOAT_VALUE_A;
710*795d594fSAndroid Build Coastguard Worker       } else if (i % 3 == 1) {
711*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_FLOAT_VALUE_B;
712*795d594fSAndroid Build Coastguard Worker       } else {
713*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_FLOAT_VALUE_C;
714*795d594fSAndroid Build Coastguard Worker       }
715*795d594fSAndroid Build Coastguard Worker     }
716*795d594fSAndroid Build Coastguard Worker     a[USED_ARRAY_LENGTH] = 10000.0f;
717*795d594fSAndroid Build Coastguard Worker   }
718*795d594fSAndroid Build Coastguard Worker 
initDoubleArray(double[] a)719*795d594fSAndroid Build Coastguard Worker   public static void initDoubleArray(double[] a) {
720*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < ARRAY_LENGTH; i++) {
721*795d594fSAndroid Build Coastguard Worker       if (i % 3 == 0) {
722*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_FLOAT_VALUE_A;
723*795d594fSAndroid Build Coastguard Worker       } else if (i % 3 == 1) {
724*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_FLOAT_VALUE_B;
725*795d594fSAndroid Build Coastguard Worker       } else {
726*795d594fSAndroid Build Coastguard Worker         a[i] = MAGIC_FLOAT_VALUE_C;
727*795d594fSAndroid Build Coastguard Worker       }
728*795d594fSAndroid Build Coastguard Worker     }
729*795d594fSAndroid Build Coastguard Worker     a[USED_ARRAY_LENGTH] = 10000.0f;
730*795d594fSAndroid Build Coastguard Worker   }
731*795d594fSAndroid Build Coastguard Worker 
BooleanArraySum(boolean[] a)732*795d594fSAndroid Build Coastguard Worker   public static byte BooleanArraySum(boolean[] a) {
733*795d594fSAndroid Build Coastguard Worker     byte sum = 0;
734*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
735*795d594fSAndroid Build Coastguard Worker       sum += a[i] ? 1 : 0;
736*795d594fSAndroid Build Coastguard Worker     }
737*795d594fSAndroid Build Coastguard Worker     return sum;
738*795d594fSAndroid Build Coastguard Worker   }
739*795d594fSAndroid Build Coastguard Worker 
ByteArraySum(byte[] a)740*795d594fSAndroid Build Coastguard Worker   public static byte ByteArraySum(byte[] a) {
741*795d594fSAndroid Build Coastguard Worker     byte sum = 0;
742*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
743*795d594fSAndroid Build Coastguard Worker       sum += a[i];
744*795d594fSAndroid Build Coastguard Worker     }
745*795d594fSAndroid Build Coastguard Worker     return sum;
746*795d594fSAndroid Build Coastguard Worker   }
747*795d594fSAndroid Build Coastguard Worker 
ShortArraySum(short[] a)748*795d594fSAndroid Build Coastguard Worker   public static short ShortArraySum(short[] a) {
749*795d594fSAndroid Build Coastguard Worker     short sum = 0;
750*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
751*795d594fSAndroid Build Coastguard Worker       sum += a[i];
752*795d594fSAndroid Build Coastguard Worker     }
753*795d594fSAndroid Build Coastguard Worker     return sum;
754*795d594fSAndroid Build Coastguard Worker   }
755*795d594fSAndroid Build Coastguard Worker 
CharArraySum(char[] a)756*795d594fSAndroid Build Coastguard Worker   public static char CharArraySum(char[] a) {
757*795d594fSAndroid Build Coastguard Worker     char sum = 0;
758*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
759*795d594fSAndroid Build Coastguard Worker       sum += a[i];
760*795d594fSAndroid Build Coastguard Worker     }
761*795d594fSAndroid Build Coastguard Worker     return sum;
762*795d594fSAndroid Build Coastguard Worker   }
763*795d594fSAndroid Build Coastguard Worker 
IntArraySum(int[] a)764*795d594fSAndroid Build Coastguard Worker   public static int IntArraySum(int[] a) {
765*795d594fSAndroid Build Coastguard Worker     int sum = 0;
766*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
767*795d594fSAndroid Build Coastguard Worker       sum += a[i];
768*795d594fSAndroid Build Coastguard Worker     }
769*795d594fSAndroid Build Coastguard Worker     return sum;
770*795d594fSAndroid Build Coastguard Worker   }
771*795d594fSAndroid Build Coastguard Worker 
LongArraySum(long[] a)772*795d594fSAndroid Build Coastguard Worker   public static long LongArraySum(long[] a) {
773*795d594fSAndroid Build Coastguard Worker     long sum = 0;
774*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
775*795d594fSAndroid Build Coastguard Worker       sum += a[i];
776*795d594fSAndroid Build Coastguard Worker     }
777*795d594fSAndroid Build Coastguard Worker     return sum;
778*795d594fSAndroid Build Coastguard Worker   }
779*795d594fSAndroid Build Coastguard Worker 
FloatArraySum(float[] a)780*795d594fSAndroid Build Coastguard Worker   public static float FloatArraySum(float[] a) {
781*795d594fSAndroid Build Coastguard Worker     float sum = 0.0f;
782*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
783*795d594fSAndroid Build Coastguard Worker       sum += a[i];
784*795d594fSAndroid Build Coastguard Worker     }
785*795d594fSAndroid Build Coastguard Worker     return sum;
786*795d594fSAndroid Build Coastguard Worker   }
787*795d594fSAndroid Build Coastguard Worker 
DoubleArraySum(double[] a)788*795d594fSAndroid Build Coastguard Worker   public static double DoubleArraySum(double[] a) {
789*795d594fSAndroid Build Coastguard Worker     double sum = 0.0;
790*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
791*795d594fSAndroid Build Coastguard Worker       sum += a[i];
792*795d594fSAndroid Build Coastguard Worker     }
793*795d594fSAndroid Build Coastguard Worker     return sum;
794*795d594fSAndroid Build Coastguard Worker   }
795*795d594fSAndroid Build Coastguard Worker 
expectIntEquals(int expected, int result)796*795d594fSAndroid Build Coastguard Worker   private static void expectIntEquals(int expected, int result) {
797*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
798*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
799*795d594fSAndroid Build Coastguard Worker     }
800*795d594fSAndroid Build Coastguard Worker   }
801*795d594fSAndroid Build Coastguard Worker 
expectLongEquals(long expected, long result)802*795d594fSAndroid Build Coastguard Worker   private static void expectLongEquals(long expected, long result) {
803*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
804*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
805*795d594fSAndroid Build Coastguard Worker     }
806*795d594fSAndroid Build Coastguard Worker   }
807*795d594fSAndroid Build Coastguard Worker 
expectFloatEquals(float expected, float result)808*795d594fSAndroid Build Coastguard Worker   private static void expectFloatEquals(float expected, float result) {
809*795d594fSAndroid Build Coastguard Worker     final float THRESHOLD = .1f;
810*795d594fSAndroid Build Coastguard Worker     if (Math.abs(expected - result) >= THRESHOLD) {
811*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
812*795d594fSAndroid Build Coastguard Worker     }
813*795d594fSAndroid Build Coastguard Worker   }
814*795d594fSAndroid Build Coastguard Worker 
expectDoubleEquals(double expected, double result)815*795d594fSAndroid Build Coastguard Worker   private static void expectDoubleEquals(double expected, double result) {
816*795d594fSAndroid Build Coastguard Worker     final double THRESHOLD = .1;
817*795d594fSAndroid Build Coastguard Worker     if (Math.abs(expected - result) >= THRESHOLD) {
818*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
819*795d594fSAndroid Build Coastguard Worker     }
820*795d594fSAndroid Build Coastguard Worker   }
821*795d594fSAndroid Build Coastguard Worker }
822