1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2017 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 import java.lang.reflect.Array; 17*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker /** 20*795d594fSAndroid Build Coastguard Worker * Tests for SIMD related optimizations. 21*795d594fSAndroid Build Coastguard Worker */ 22*795d594fSAndroid Build Coastguard Worker public class Main { 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.unroll(float[], float[]) loop_optimization (before) 25*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:f\d+>> FloatConstant 2.5 loop:none 26*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 27*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:f\d+>> ArrayGet loop:<<Loop>> outer_loop:none 28*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul:f\d+>> Mul [<<Get>>,<<Cons>>] loop:<<Loop>> outer_loop:none 29*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [{{l\d+}},<<Phi>>,<<Mul>>] loop:<<Loop>> outer_loop:none 30*795d594fSAndroid Build Coastguard Worker // 31*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86_64,ARM64}: void Main.unroll(float[], float[]) loop_optimization (after) 32*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:f\d+>> FloatConstant 2.5 loop:none 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 35*795d594fSAndroid Build Coastguard Worker // 36*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Cons>>,{{j\d+}}] loop:none 37*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecReplicateScalar 38*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 39*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 40*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 41*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul1:d\d+>> VecMul [<<Get1>>,<<Repl>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 42*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Phi>>,<<Mul1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 43*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:i\d+>> Add [<<Phi>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 44*795d594fSAndroid Build Coastguard Worker // No unroll for SVE yet. 45*795d594fSAndroid Build Coastguard Worker // 46*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 47*795d594fSAndroid Build Coastguard Worker // 48*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Incr:i\d+>> IntConstant 4 loop:none 49*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Cons>>] loop:none 50*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecReplicateScalar 51*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 52*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<Phi>>] loop:<<Loop>> outer_loop:none 53*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul1:d\d+>> VecMul [<<Get1>>,<<Repl>>] loop:<<Loop>> outer_loop:none 54*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Phi>>,<<Mul1>>] loop:<<Loop>> outer_loop:none 55*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:i\d+>> Add [<<Phi>>,<<Incr>>] loop:<<Loop>> outer_loop:none 56*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add>>] loop:<<Loop>> outer_loop:none 57*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul2:d\d+>> VecMul [<<Get2>>,<<Repl>>] loop:<<Loop>> outer_loop:none 58*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Add>>,<<Mul2>>] loop:<<Loop>> outer_loop:none 59*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Add>>,<<Incr>>] loop:<<Loop>> outer_loop:none 60*795d594fSAndroid Build Coastguard Worker // 61*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: unroll(float[] x, float[] y)62*795d594fSAndroid Build Coastguard Worker private static void unroll(float[] x, float[] y) { 63*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) { 64*795d594fSAndroid Build Coastguard Worker x[i] = y[i] * 2.5f; 65*795d594fSAndroid Build Coastguard Worker } 66*795d594fSAndroid Build Coastguard Worker } 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86_64,ARM64}: void Main.stencil(int[], int[], int) loop_optimization (after) 69*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP1:i\d+>> IntConstant 1 loop:none 70*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP2:i\d+>> IntConstant 2 loop:none 71*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 72*795d594fSAndroid Build Coastguard Worker // 73*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 74*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 75*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Phi>>,<<CP1>>] loop:<<Loop>> outer_loop:none 76*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 77*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 78*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 79*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Phi>>,<<CP2>>] loop:<<Loop>> outer_loop:none 80*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 81*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 82*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 83*795d594fSAndroid Build Coastguard Worker // 84*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 85*795d594fSAndroid Build Coastguard Worker // 86*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 87*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Phi>>,<<CP1>>] loop:<<Loop>> outer_loop:none 88*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<Phi>>] loop:<<Loop>> outer_loop:none 89*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>] loop:<<Loop>> outer_loop:none 90*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>] loop:<<Loop>> outer_loop:none 91*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Phi>>,<<CP2>>] loop:<<Loop>> outer_loop:none 92*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>] loop:<<Loop>> outer_loop:none 93*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>] loop:<<Loop>> outer_loop:none 94*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>] loop:<<Loop>> outer_loop:none 95*795d594fSAndroid Build Coastguard Worker // 96*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: stencil(int[] a, int[] b, int n)97*795d594fSAndroid Build Coastguard Worker private static void stencil(int[] a, int[] b, int n) { 98*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < n - 1; i++) { 99*795d594fSAndroid Build Coastguard Worker a[i] = b[i - 1] + b[i] + b[i + 1]; 100*795d594fSAndroid Build Coastguard Worker } 101*795d594fSAndroid Build Coastguard Worker } 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker // Array size is chosen to be such a constant, that the loop trip count (in the test below) 104*795d594fSAndroid Build Coastguard Worker // is a multiple of vector length and unroll factor; hence clean up is needed exclusively for 105*795d594fSAndroid Build Coastguard Worker // the array references test. 106*795d594fSAndroid Build Coastguard Worker public static final int STENCIL_ARRAY_SIZE = 130; 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86_64,ARM64}: void Main.$noinline$stencilConstSize(int[], int[]) loop_optimization (after) 109*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<C0:i\d+>> IntConstant 0 110*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP1:i\d+>> IntConstant 1 111*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP2:i\d+>> IntConstant 2 112*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr0:l\d+>> ParameterValue 113*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr1:l\d+>> ParameterValue 114*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrCh:z\d+>> NotEqual [<<Arr0>>,<<Arr1>>] loop:none 115*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<TCSel:i\d+>> Select [<<C0>>,{{i\d+}},<<ArrCh>>] loop:none 116*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiV:i\d+>> Phi [<<C0>>,{{i\d+}}] loop:<<LoopV:B\d+>> outer_loop:none 117*795d594fSAndroid Build Coastguard Worker // 118*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 119*795d594fSAndroid Build Coastguard Worker // 120*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<PhiV>>,{{i\d+}}] loop:<<LoopV>> outer_loop:none 121*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<PhiV>>,<<CP1>>] loop:<<LoopV>> outer_loop:none 122*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<PhiV>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none 123*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none 124*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none 125*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<PhiV>>,<<CP2>>] loop:<<LoopV>> outer_loop:none 126*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none 127*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none 128*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>,<<LoopP>>] loop:<<LoopV>> outer_loop:none 129*795d594fSAndroid Build Coastguard Worker // 130*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 131*795d594fSAndroid Build Coastguard Worker // 132*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<PhiV>>,<<CP1>>] loop:<<LoopV>> outer_loop:none 133*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<PhiV>>] loop:<<LoopV>> outer_loop:none 134*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>] loop:<<LoopV>> outer_loop:none 135*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>] loop:<<LoopV>> outer_loop:none 136*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<PhiV>>,<<CP2>>] loop:<<LoopV>> outer_loop:none 137*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>] loop:<<LoopV>> outer_loop:none 138*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>] loop:<<LoopV>> outer_loop:none 139*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>] loop:<<LoopV>> outer_loop:none 140*795d594fSAndroid Build Coastguard Worker // 141*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 142*795d594fSAndroid Build Coastguard Worker // 143*795d594fSAndroid Build Coastguard Worker // Cleanup loop. 144*795d594fSAndroid Build Coastguard Worker // 145*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiS:i\d+>> Phi [<<PhiV>>,{{i\d+}}] loop:<<LoopS:B\d+>> outer_loop:none 146*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<LoopS>> outer_loop:none 147*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<LoopS>> outer_loop:none 148*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<LoopS>> outer_loop:none 149*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<LoopS>> outer_loop:none 150*795d594fSAndroid Build Coastguard Worker // 151*795d594fSAndroid Build Coastguard Worker // Checks the disambiguation runtime test for array references. 152*795d594fSAndroid Build Coastguard Worker // $noinline$stencilConstSize(int[] a, int[] b)153*795d594fSAndroid Build Coastguard Worker private static void $noinline$stencilConstSize(int[] a, int[] b) { 154*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) { 155*795d594fSAndroid Build Coastguard Worker a[i] = b[i - 1] + b[i] + b[i + 1]; 156*795d594fSAndroid Build Coastguard Worker } 157*795d594fSAndroid Build Coastguard Worker } 158*795d594fSAndroid Build Coastguard Worker 159*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.stencilAddInt(int[], int[], int) loop_optimization (before) 160*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP1:i\d+>> IntConstant 1 loop:none 161*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CM1:i\d+>> IntConstant -1 loop:none 162*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 163*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Phi>>,<<CM1>>] loop:<<Loop>> outer_loop:none 164*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:i\d+>> ArrayGet [{{l\d+}},<<Add1>>] loop:<<Loop>> outer_loop:none 165*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:i\d+>> ArrayGet [{{l\d+}},<<Phi>>] loop:<<Loop>> outer_loop:none 166*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:i\d+>> Add [<<Get1>>,<<Get2>>] loop:<<Loop>> outer_loop:none 167*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Phi>>,<<CP1>>] loop:<<Loop>> outer_loop:none 168*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:i\d+>> ArrayGet [{{l\d+}},<<Add3>>] loop:<<Loop>> outer_loop:none 169*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:i\d+>> Add [<<Add2>>,<<Get3>>] loop:<<Loop>> outer_loop:none 170*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [{{l\d+}},<<Phi>>,<<Add4>>] loop:<<Loop>> outer_loop:none 171*795d594fSAndroid Build Coastguard Worker 172*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86_64,ARM64}: void Main.stencilAddInt(int[], int[], int) loop_optimization (after) 173*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP1:i\d+>> IntConstant 1 loop:none 174*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP2:i\d+>> IntConstant 2 loop:none 175*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 176*795d594fSAndroid Build Coastguard Worker // 177*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 178*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 179*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Phi>>,<<CP1>>] loop:<<Loop>> outer_loop:none 180*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 181*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 182*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 183*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Phi>>,<<CP2>>] loop:<<Loop>> outer_loop:none 184*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 185*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 186*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 187*795d594fSAndroid Build Coastguard Worker // 188*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 189*795d594fSAndroid Build Coastguard Worker // 190*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 191*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Phi>>,<<CP1>>] loop:<<Loop>> outer_loop:none 192*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<Phi>>] loop:<<Loop>> outer_loop:none 193*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>] loop:<<Loop>> outer_loop:none 194*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>] loop:<<Loop>> outer_loop:none 195*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Phi>>,<<CP2>>] loop:<<Loop>> outer_loop:none 196*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>] loop:<<Loop>> outer_loop:none 197*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>] loop:<<Loop>> outer_loop:none 198*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>] loop:<<Loop>> outer_loop:none 199*795d594fSAndroid Build Coastguard Worker // 200*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: stencilAddInt(int[] a, int[] b, int n)201*795d594fSAndroid Build Coastguard Worker private static void stencilAddInt(int[] a, int[] b, int n) { 202*795d594fSAndroid Build Coastguard Worker int minus1 = $inline$constMinus1(); 203*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < n + minus1; i++) { 204*795d594fSAndroid Build Coastguard Worker a[i] = b[i + minus1] + b[i] + b[i + 1]; 205*795d594fSAndroid Build Coastguard Worker } 206*795d594fSAndroid Build Coastguard Worker } 207*795d594fSAndroid Build Coastguard Worker $inline$constMinus1()208*795d594fSAndroid Build Coastguard Worker private static int $inline$constMinus1() { 209*795d594fSAndroid Build Coastguard Worker return -1; 210*795d594fSAndroid Build Coastguard Worker } 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.stencilSubInt(int[], int[], int) loop_optimization (before) 213*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PAR3:i\d+>> ParameterValue loop:none 214*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP1:i\d+>> IntConstant 1 loop:none 215*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sub1:i\d+>> Sub [<<PAR3>>,<<CP1>>] loop:none 216*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 217*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sub2:i\d+>> Sub [<<Phi>>,<<CP1>>] loop:<<Loop>> outer_loop:none 218*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:i\d+>> ArrayGet [{{l\d+}},<<Sub2>>] loop:<<Loop>> outer_loop:none 219*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:i\d+>> ArrayGet [{{l\d+}},<<Phi>>] loop:<<Loop>> outer_loop:none 220*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Get1>>,<<Get2>>] loop:<<Loop>> outer_loop:none 221*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:i\d+>> Add [<<Phi>>,<<CP1>>] loop:<<Loop>> outer_loop:none 222*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:i\d+>> ArrayGet [{{l\d+}},<<Add2>>] loop:<<Loop>> outer_loop:none 223*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Add1>>,<<Get3>>] loop:<<Loop>> outer_loop:none 224*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [{{l\d+}},<<Phi>>,<<Add3>>] loop:<<Loop>> outer_loop:none 225*795d594fSAndroid Build Coastguard Worker 226*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86_64,ARM64}: void Main.stencilSubInt(int[], int[], int) loop_optimization (after) 227*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP1:i\d+>> IntConstant 1 loop:none 228*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<CP2:i\d+>> IntConstant 2 loop:none 229*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 230*795d594fSAndroid Build Coastguard Worker // 231*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 232*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 233*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Phi>>,<<CP1>>] loop:<<Loop>> outer_loop:none 234*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 235*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 236*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 237*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Phi>>,<<CP2>>] loop:<<Loop>> outer_loop:none 238*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 239*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 240*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 241*795d594fSAndroid Build Coastguard Worker // 242*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 243*795d594fSAndroid Build Coastguard Worker // 244*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 245*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Phi>>,<<CP1>>] loop:<<Loop>> outer_loop:none 246*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:d\d+>> VecLoad [{{l\d+}},<<Phi>>] loop:<<Loop>> outer_loop:none 247*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:d\d+>> VecLoad [{{l\d+}},<<Add1>>] loop:<<Loop>> outer_loop:none 248*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:d\d+>> VecAdd [<<Get1>>,<<Get2>>] loop:<<Loop>> outer_loop:none 249*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Phi>>,<<CP2>>] loop:<<Loop>> outer_loop:none 250*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get3:d\d+>> VecLoad [{{l\d+}},<<Add3>>] loop:<<Loop>> outer_loop:none 251*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:d\d+>> VecAdd [<<Add2>>,<<Get3>>] loop:<<Loop>> outer_loop:none 252*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Add1>>,<<Add4>>] loop:<<Loop>> outer_loop:none 253*795d594fSAndroid Build Coastguard Worker // 254*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: stencilSubInt(int[] a, int[] b, int n)255*795d594fSAndroid Build Coastguard Worker private static void stencilSubInt(int[] a, int[] b, int n) { 256*795d594fSAndroid Build Coastguard Worker int plus1 = $inline$constPlus1(); 257*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < n - plus1; i++) { 258*795d594fSAndroid Build Coastguard Worker a[i] = b[i - plus1] + b[i] + b[i + 1]; 259*795d594fSAndroid Build Coastguard Worker } 260*795d594fSAndroid Build Coastguard Worker } 261*795d594fSAndroid Build Coastguard Worker $inline$constPlus1()262*795d594fSAndroid Build Coastguard Worker private static int $inline$constPlus1() { 263*795d594fSAndroid Build Coastguard Worker return 1; 264*795d594fSAndroid Build Coastguard Worker } 265*795d594fSAndroid Build Coastguard Worker 266*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.longInductionReduction(long[]) loop_optimization (before) 267*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<L0:j\d+>> LongConstant 0 loop:none 268*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<L1:j\d+>> LongConstant 1 loop:none 269*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I0:i\d+>> IntConstant 0 loop:none 270*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:j\d+>> ArrayGet [{{l\d+}},<<I0>>] loop:none 271*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:j\d+>> Phi [<<L0>>,<<Add1:j\d+>>] loop:<<Loop:B\d+>> outer_loop:none 272*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:j\d+>> Phi [<<L1>>,<<Add2:j\d+>>] loop:<<Loop>> outer_loop:none 273*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2>> Add [<<Phi2>>,<<Get>>] loop:<<Loop>> outer_loop:none 274*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1>> Add [<<Phi1>>,<<L1>>] loop:<<Loop>> outer_loop:none 275*795d594fSAndroid Build Coastguard Worker // 276*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86_64,ARM64}: long Main.longInductionReduction(long[]) loop_optimization (after) 277*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<L0:j\d+>> LongConstant 0 loop:none 278*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<L1:j\d+>> LongConstant 1 loop:none 279*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I0:i\d+>> IntConstant 0 loop:none 280*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:j\d+>> ArrayGet [{{l\d+}},<<I0>>] loop:none 281*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 282*795d594fSAndroid Build Coastguard Worker // 283*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Rep:d\d+>> VecReplicateScalar [<<Get>>,{{j\d+}}] loop:none 284*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<L1>>,{{j\d+}}] loop:none 285*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:j\d+>> Phi [<<L0>>,{{j\d+}}] loop:<<Loop:B\d+>> outer_loop:none 286*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 287*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi1>>,{{j\d+}}] loop:<<Loop>> outer_loop:none 288*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi2>>,<<Rep>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 289*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,{{j\d+}}] loop:<<Loop>> outer_loop:none 290*795d594fSAndroid Build Coastguard Worker // 291*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 292*795d594fSAndroid Build Coastguard Worker // 293*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<L2:j\d+>> LongConstant 2 loop:none 294*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Rep:d\d+>> VecReplicateScalar [<<Get>>] loop:none 295*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<L1>>] loop:none 296*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:j\d+>> Phi [<<L0>>,{{j\d+}}] loop:<<Loop:B\d+>> outer_loop:none 297*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 298*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi2>>,<<Rep>>] loop:<<Loop>> outer_loop:none 299*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<L2>>] loop:<<Loop>> outer_loop:none 300*795d594fSAndroid Build Coastguard Worker // 301*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: longInductionReduction(long[] y)302*795d594fSAndroid Build Coastguard Worker static long longInductionReduction(long[] y) { 303*795d594fSAndroid Build Coastguard Worker long x = 1; 304*795d594fSAndroid Build Coastguard Worker for (long i = 0; i < 10; i++) { 305*795d594fSAndroid Build Coastguard Worker x += y[0]; 306*795d594fSAndroid Build Coastguard Worker } 307*795d594fSAndroid Build Coastguard Worker return x; 308*795d594fSAndroid Build Coastguard Worker } 309*795d594fSAndroid Build Coastguard Worker 310*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.intVectorLongInvariant(int[], long[]) loop_optimization (before) 311*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I0:i\d+>> IntConstant 0 loop:none 312*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I1:i\d+>> IntConstant 1 loop:none 313*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:j\d+>> ArrayGet [{{l\d+}},<<I0>>] loop:none 314*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<I0>>,<<Add:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 315*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:i\d+>> TypeConversion [<<Get>>] loop:<<Loop>> outer_loop:none 316*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [{{l\d+}},<<Phi>>,<<Cnv>>] loop:<<Loop>> outer_loop:none 317*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add>> Add [<<Phi>>,<<I1>>] loop:<<Loop>> outer_loop:none 318*795d594fSAndroid Build Coastguard Worker // 319*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86_64,ARM64}: void Main.intVectorLongInvariant(int[], long[]) loop_optimization (after) 320*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I0:i\d+>> IntConstant 0 loop:none 321*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I1:i\d+>> IntConstant 1 loop:none 322*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:j\d+>> ArrayGet [{{l\d+}},<<I0>>] loop:none 323*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:i\d+>> TypeConversion [<<Get>>] loop:none 324*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 325*795d594fSAndroid Build Coastguard Worker // 326*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Rep:d\d+>> VecReplicateScalar [<<Cnv>>,{{j\d+}}] loop:none 327*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<I0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 328*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 329*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Phi>>,<<Rep>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 330*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 331*795d594fSAndroid Build Coastguard Worker // 332*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 333*795d594fSAndroid Build Coastguard Worker // 334*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I4:i\d+>> IntConstant 4 loop:none 335*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Rep:d\d+>> VecReplicateScalar [<<Cnv>>] loop:none 336*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<I0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 337*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Phi>>,<<Rep>>] loop:<<Loop>> outer_loop:none 338*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi>>,<<I4>>] loop:<<Loop>> outer_loop:none 339*795d594fSAndroid Build Coastguard Worker // 340*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: intVectorLongInvariant(int[] x, long[] y)341*795d594fSAndroid Build Coastguard Worker static void intVectorLongInvariant(int[] x, long[] y) { 342*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) { 343*795d594fSAndroid Build Coastguard Worker x[i] = (int) y[0]; 344*795d594fSAndroid Build Coastguard Worker } 345*795d594fSAndroid Build Coastguard Worker } 346*795d594fSAndroid Build Coastguard Worker 347*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.longCanBeDoneWithInt(int[], int[]) loop_optimization (before) 348*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I0:i\d+>> IntConstant 0 loop:none 349*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I1:i\d+>> IntConstant 1 loop:none 350*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<L1:j\d+>> LongConstant 1 loop:none 351*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<I0>>,<<Add:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 352*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [{{l\d+}},<<Phi>>] loop:<<Loop>> outer_loop:none 353*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv1:j\d+>> TypeConversion [<<Get>>] loop:<<Loop>> outer_loop:none 354*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddL:j\d+>> Add [<<Cnv1>>,<<L1>>] loop:<<Loop>> outer_loop:none 355*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv2:i\d+>> TypeConversion [<<AddL>>] loop:<<Loop>> outer_loop:none 356*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [{{l\d+}},<<Phi>>,<<Cnv2>>] loop:<<Loop>> outer_loop:none 357*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add>> Add [<<Phi>>,<<I1>>] loop:<<Loop>> outer_loop:none 358*795d594fSAndroid Build Coastguard Worker // 359*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86_64,ARM64}: void Main.longCanBeDoneWithInt(int[], int[]) loop_optimization (after) 360*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I0:i\d+>> IntConstant 0 loop:none 361*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<L1:j\d+>> LongConstant 1 loop:none 362*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:i\d+>> TypeConversion [<<L1>>] loop:none 363*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 364*795d594fSAndroid Build Coastguard Worker // 365*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Rep:d\d+>> VecReplicateScalar [<<Cnv>>,{{j\d+}}] loop:none 366*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<I0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 367*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 368*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<Phi>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 369*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Rep>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 370*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Phi>>,<<Add>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 371*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 372*795d594fSAndroid Build Coastguard Worker // 373*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 374*795d594fSAndroid Build Coastguard Worker // 375*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<I4:i\d+>> IntConstant 4 loop:none 376*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Rep:d\d+>> VecReplicateScalar [<<Cnv>>] loop:none 377*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<I0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 378*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<Phi>>] loop:<<Loop>> outer_loop:none 379*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Rep>>] loop:<<Loop>> outer_loop:none 380*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [{{l\d+}},<<Phi>>,<<Add>>] loop:<<Loop>> outer_loop:none 381*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi>>,<<I4>>] loop:<<Loop>> outer_loop:none 382*795d594fSAndroid Build Coastguard Worker // 383*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: longCanBeDoneWithInt(int[] x, int[] y)384*795d594fSAndroid Build Coastguard Worker static void longCanBeDoneWithInt(int[] x, int[] y) { 385*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) { 386*795d594fSAndroid Build Coastguard Worker x[i] = (int) (y[i] + 1L); 387*795d594fSAndroid Build Coastguard Worker } 388*795d594fSAndroid Build Coastguard Worker } 389*795d594fSAndroid Build Coastguard Worker testUnroll()390*795d594fSAndroid Build Coastguard Worker static void testUnroll() { 391*795d594fSAndroid Build Coastguard Worker float[] x = new float[100]; 392*795d594fSAndroid Build Coastguard Worker float[] y = new float[100]; 393*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) { 394*795d594fSAndroid Build Coastguard Worker x[i] = 0.0f; 395*795d594fSAndroid Build Coastguard Worker y[i] = 2.0f; 396*795d594fSAndroid Build Coastguard Worker } 397*795d594fSAndroid Build Coastguard Worker unroll(x, y); 398*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) { 399*795d594fSAndroid Build Coastguard Worker expectEquals(5.0f, x[i]); 400*795d594fSAndroid Build Coastguard Worker expectEquals(2.0f, y[i]); 401*795d594fSAndroid Build Coastguard Worker } 402*795d594fSAndroid Build Coastguard Worker } 403*795d594fSAndroid Build Coastguard Worker initArrayStencil(int[] arr)404*795d594fSAndroid Build Coastguard Worker private static void initArrayStencil(int[] arr) { 405*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < arr.length; i++) { 406*795d594fSAndroid Build Coastguard Worker arr[i] = i; 407*795d594fSAndroid Build Coastguard Worker } 408*795d594fSAndroid Build Coastguard Worker } 409*795d594fSAndroid Build Coastguard Worker testStencil1()410*795d594fSAndroid Build Coastguard Worker static void testStencil1() { 411*795d594fSAndroid Build Coastguard Worker int[] a = new int[100]; 412*795d594fSAndroid Build Coastguard Worker int[] b = new int[100]; 413*795d594fSAndroid Build Coastguard Worker initArrayStencil(b); 414*795d594fSAndroid Build Coastguard Worker 415*795d594fSAndroid Build Coastguard Worker stencil(a, b, 100); 416*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < 99; i++) { 417*795d594fSAndroid Build Coastguard Worker int e = i + i + i; 418*795d594fSAndroid Build Coastguard Worker expectEquals(e, a[i]); 419*795d594fSAndroid Build Coastguard Worker expectEquals(i, b[i]); 420*795d594fSAndroid Build Coastguard Worker } 421*795d594fSAndroid Build Coastguard Worker } 422*795d594fSAndroid Build Coastguard Worker 423*795d594fSAndroid Build Coastguard Worker // Checks the disambiguation runtime test for array references. testStencilConstSize()424*795d594fSAndroid Build Coastguard Worker static void testStencilConstSize() { 425*795d594fSAndroid Build Coastguard Worker int[] a = new int[STENCIL_ARRAY_SIZE]; 426*795d594fSAndroid Build Coastguard Worker int[] b = new int[STENCIL_ARRAY_SIZE]; 427*795d594fSAndroid Build Coastguard Worker initArrayStencil(b); 428*795d594fSAndroid Build Coastguard Worker 429*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) { 430*795d594fSAndroid Build Coastguard Worker $noinline$stencilConstSize(a, b); 431*795d594fSAndroid Build Coastguard Worker // (i - 1) + i + (i + 1) = 3 * i. 432*795d594fSAndroid Build Coastguard Worker int e = i + i + i; 433*795d594fSAndroid Build Coastguard Worker expectEquals(e, a[i]); 434*795d594fSAndroid Build Coastguard Worker expectEquals(i, b[i]); 435*795d594fSAndroid Build Coastguard Worker } 436*795d594fSAndroid Build Coastguard Worker 437*795d594fSAndroid Build Coastguard Worker initArrayStencil(b); 438*795d594fSAndroid Build Coastguard Worker $noinline$stencilConstSize(b, b); 439*795d594fSAndroid Build Coastguard Worker 440*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < STENCIL_ARRAY_SIZE - 1; i++) { 441*795d594fSAndroid Build Coastguard Worker // The formula of the ith member of recurrent def: b[i] = b[i-1] + (i) + (i+1). 442*795d594fSAndroid Build Coastguard Worker int e = i * (i + 2); 443*795d594fSAndroid Build Coastguard Worker expectEquals(e, b[i]); 444*795d594fSAndroid Build Coastguard Worker } 445*795d594fSAndroid Build Coastguard Worker } 446*795d594fSAndroid Build Coastguard Worker testStencil2()447*795d594fSAndroid Build Coastguard Worker static void testStencil2() { 448*795d594fSAndroid Build Coastguard Worker int[] a = new int[100]; 449*795d594fSAndroid Build Coastguard Worker int[] b = new int[100]; 450*795d594fSAndroid Build Coastguard Worker initArrayStencil(b); 451*795d594fSAndroid Build Coastguard Worker 452*795d594fSAndroid Build Coastguard Worker stencilSubInt(a, b, 100); 453*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < 99; i++) { 454*795d594fSAndroid Build Coastguard Worker int e = i + i + i; 455*795d594fSAndroid Build Coastguard Worker expectEquals(e, a[i]); 456*795d594fSAndroid Build Coastguard Worker expectEquals(i, b[i]); 457*795d594fSAndroid Build Coastguard Worker } 458*795d594fSAndroid Build Coastguard Worker } 459*795d594fSAndroid Build Coastguard Worker testStencil3()460*795d594fSAndroid Build Coastguard Worker static void testStencil3() { 461*795d594fSAndroid Build Coastguard Worker int[] a = new int[100]; 462*795d594fSAndroid Build Coastguard Worker int[] b = new int[100]; 463*795d594fSAndroid Build Coastguard Worker initArrayStencil(b); 464*795d594fSAndroid Build Coastguard Worker 465*795d594fSAndroid Build Coastguard Worker stencilAddInt(a, b, 100); 466*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < 99; i++) { 467*795d594fSAndroid Build Coastguard Worker int e = i + i + i; 468*795d594fSAndroid Build Coastguard Worker expectEquals(e, a[i]); 469*795d594fSAndroid Build Coastguard Worker expectEquals(i, b[i]); 470*795d594fSAndroid Build Coastguard Worker } 471*795d594fSAndroid Build Coastguard Worker } 472*795d594fSAndroid Build Coastguard Worker testTypes()473*795d594fSAndroid Build Coastguard Worker static void testTypes() { 474*795d594fSAndroid Build Coastguard Worker int[] a = new int[100]; 475*795d594fSAndroid Build Coastguard Worker int[] b = new int[100]; 476*795d594fSAndroid Build Coastguard Worker long[] l = { 3 }; 477*795d594fSAndroid Build Coastguard Worker expectEquals(31, longInductionReduction(l)); 478*795d594fSAndroid Build Coastguard Worker intVectorLongInvariant(a, l); 479*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) { 480*795d594fSAndroid Build Coastguard Worker expectEquals(3, a[i]); 481*795d594fSAndroid Build Coastguard Worker } 482*795d594fSAndroid Build Coastguard Worker longCanBeDoneWithInt(b, a); 483*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) { 484*795d594fSAndroid Build Coastguard Worker expectEquals(4, b[i]); 485*795d594fSAndroid Build Coastguard Worker } 486*795d594fSAndroid Build Coastguard Worker } 487*795d594fSAndroid Build Coastguard Worker main(String[] args)488*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 489*795d594fSAndroid Build Coastguard Worker testUnroll(); 490*795d594fSAndroid Build Coastguard Worker testStencil1(); 491*795d594fSAndroid Build Coastguard Worker testStencilConstSize(); 492*795d594fSAndroid Build Coastguard Worker testStencil2(); 493*795d594fSAndroid Build Coastguard Worker testStencil3(); 494*795d594fSAndroid Build Coastguard Worker testTypes(); 495*795d594fSAndroid Build Coastguard Worker System.out.println("passed"); 496*795d594fSAndroid Build Coastguard Worker } 497*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)498*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 499*795d594fSAndroid Build Coastguard Worker if (expected != result) { 500*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 501*795d594fSAndroid Build Coastguard Worker } 502*795d594fSAndroid Build Coastguard Worker } 503*795d594fSAndroid Build Coastguard Worker expectEquals(long expected, long result)504*795d594fSAndroid Build Coastguard Worker private static void expectEquals(long expected, long result) { 505*795d594fSAndroid Build Coastguard Worker if (expected != result) { 506*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 507*795d594fSAndroid Build Coastguard Worker } 508*795d594fSAndroid Build Coastguard Worker } 509*795d594fSAndroid Build Coastguard Worker expectEquals(float expected, float result)510*795d594fSAndroid Build Coastguard Worker private static void expectEquals(float expected, float result) { 511*795d594fSAndroid Build Coastguard Worker if (expected != result) { 512*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 513*795d594fSAndroid Build Coastguard Worker } 514*795d594fSAndroid Build Coastguard Worker } 515*795d594fSAndroid Build Coastguard Worker } 516