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