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 17*795d594fSAndroid Build Coastguard Worker /** 18*795d594fSAndroid Build Coastguard Worker * Tests for simple integral reductions: same type for accumulator and data. 19*795d594fSAndroid Build Coastguard Worker */ 20*795d594fSAndroid Build Coastguard Worker public class Main { 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker static final int N = 500; 23*795d594fSAndroid Build Coastguard Worker static final int M = 100; 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker // 26*795d594fSAndroid Build Coastguard Worker // Basic reductions in loops. 27*795d594fSAndroid Build Coastguard Worker // 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker // TODO: vectorize these (second step of b/64091002 plan) 30*795d594fSAndroid Build Coastguard Worker reductionByte(byte[] x)31*795d594fSAndroid Build Coastguard Worker private static byte reductionByte(byte[] x) { 32*795d594fSAndroid Build Coastguard Worker byte sum = 0; 33*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 34*795d594fSAndroid Build Coastguard Worker sum += x[i]; 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker return sum; 37*795d594fSAndroid Build Coastguard Worker } 38*795d594fSAndroid Build Coastguard Worker reductionShort(short[] x)39*795d594fSAndroid Build Coastguard Worker private static short reductionShort(short[] x) { 40*795d594fSAndroid Build Coastguard Worker short sum = 0; 41*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 42*795d594fSAndroid Build Coastguard Worker sum += x[i]; 43*795d594fSAndroid Build Coastguard Worker } 44*795d594fSAndroid Build Coastguard Worker return sum; 45*795d594fSAndroid Build Coastguard Worker } 46*795d594fSAndroid Build Coastguard Worker reductionChar(char[] x)47*795d594fSAndroid Build Coastguard Worker private static char reductionChar(char[] x) { 48*795d594fSAndroid Build Coastguard Worker char sum = 0; 49*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 50*795d594fSAndroid Build Coastguard Worker sum += x[i]; 51*795d594fSAndroid Build Coastguard Worker } 52*795d594fSAndroid Build Coastguard Worker return sum; 53*795d594fSAndroid Build Coastguard Worker } 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.reductionInt(int[]) loop_optimization (before) 56*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons0:i\d+>> IntConstant 0 loop:none 57*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons1:i\d+>> IntConstant 1 loop:none 58*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 59*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 60*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 61*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Get>>] loop:<<Loop>> outer_loop:none 62*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Cons1>>] loop:<<Loop>> outer_loop:none 63*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Phi2>>] loop:none 64*795d594fSAndroid Build Coastguard Worker // 65*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.reductionInt(int[]) loop_optimization (after) 66*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:i\d+>> IntConstant 2 loop:none 67*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}}] loop:none 68*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 69*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>> outer_loop:none 70*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>] loop:<<Loop>> outer_loop:none 71*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons>>] loop:<<Loop>> outer_loop:none 72*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 73*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>] loop:none 74*795d594fSAndroid Build Coastguard Worker 75*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.reductionInt(int[]) loop_optimization (after) 76*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 77*795d594fSAndroid Build Coastguard Worker // 78*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<TrueC:i\d+>> IntConstant 1 loop:none 79*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}},{{j\d+}}] loop:none 80*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 81*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile loop:<<Loop>> outer_loop:none 82*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 83*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 84*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 85*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PostLoopP:j\d+>> VecPredSetAll [<<TrueC>>] loop:none 86*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>,<<PostLoopP>>] loop:none 87*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>,{{j\d+}}] loop:none 88*795d594fSAndroid Build Coastguard Worker // 89*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 90*795d594fSAndroid Build Coastguard Worker // 91*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:i\d+>> IntConstant 4 loop:none 92*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}}] loop:none 93*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 94*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>> outer_loop:none 95*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>] loop:<<Loop>> outer_loop:none 96*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons>>] loop:<<Loop>> outer_loop:none 97*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 98*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>] loop:none 99*795d594fSAndroid Build Coastguard Worker // 100*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 101*795d594fSAndroid Build Coastguard Worker // 102*795d594fSAndroid Build Coastguard Worker // Check that full 128-bit Q-Register are saved across SuspendCheck slow path. 103*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.reductionInt(int[]) disassembly (after) 104*795d594fSAndroid Build Coastguard Worker /// CHECK: SuspendCheckSlowPathARM64 105*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 106*795d594fSAndroid Build Coastguard Worker // 107*795d594fSAndroid Build Coastguard Worker /// CHECK: str z<<RegNo:\d+>>, 108*795d594fSAndroid Build Coastguard Worker /// CHECK: ldr z<<RegNo>>, 109*795d594fSAndroid Build Coastguard Worker // 110*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 111*795d594fSAndroid Build Coastguard Worker // 112*795d594fSAndroid Build Coastguard Worker /// CHECK: stur q<<RegNo:\d+>>, [sp, #<<Offset:\d+>>] 113*795d594fSAndroid Build Coastguard Worker /// CHECK: ldur q<<RegNo>>, [sp, #<<Offset>>] 114*795d594fSAndroid Build Coastguard Worker // 115*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: reductionInt(int[] x)116*795d594fSAndroid Build Coastguard Worker private static int reductionInt(int[] x) { 117*795d594fSAndroid Build Coastguard Worker int sum = 0; 118*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 119*795d594fSAndroid Build Coastguard Worker sum += x[i]; 120*795d594fSAndroid Build Coastguard Worker } 121*795d594fSAndroid Build Coastguard Worker return sum; 122*795d594fSAndroid Build Coastguard Worker } 123*795d594fSAndroid Build Coastguard Worker 124*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.reductionIntChain() loop_optimization (before) 125*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons0:i\d+>> IntConstant 0 loop:none 126*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons1:i\d+>> IntConstant 1 loop:none 127*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Cons1>>,{{i\d+}}] loop:<<Loop1:B\d+>> outer_loop:none 128*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop1>> outer_loop:none 129*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:i\d+>> ArrayGet [{{l\d+}},<<Phi2>>] loop:<<Loop1>> outer_loop:none 130*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Get1>>] loop:<<Loop1>> outer_loop:none 131*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Cons1>>] loop:<<Loop1>> outer_loop:none 132*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop2:B\d+>> outer_loop:none 133*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi4:i\d+>> Phi [<<Phi1>>,{{i\d+}}] loop:<<Loop2>> outer_loop:none 134*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:i\d+>> ArrayGet [{{l\d+}},<<Phi3>>] loop:<<Loop2>> outer_loop:none 135*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi4>>,<<Get2>>] loop:<<Loop2>> outer_loop:none 136*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi3>>,<<Cons1>>] loop:<<Loop2>> outer_loop:none 137*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Phi4>>] loop:none 138*795d594fSAndroid Build Coastguard Worker // 139*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 140*795d594fSAndroid Build Coastguard Worker // 141*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.reductionIntChain() loop_optimization (after) 142*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [{{i\d+}}] loop:none 143*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop1:B\d+>> outer_loop:none 144*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<I1:i\d+>>] loop:<<Loop1>> outer_loop:none 145*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi1>>,<<Load1>>] loop:<<Loop1>> outer_loop:none 146*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I1>>,{{i\d+}}] loop:<<Loop1>> outer_loop:none 147*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red1:d\d+>> VecReduce [<<Phi1>>] loop:none 148*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr1:i\d+>> VecExtractScalar [<<Red1>>] loop:none 149*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [{{i\d+}}] loop:none 150*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop2:B\d+>> outer_loop:none 151*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<I2:i\d+>>] loop:<<Loop2>> outer_loop:none 152*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi2>>,<<Load2>>] loop:<<Loop2>> outer_loop:none 153*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I2>>,{{i\d+}}] loop:<<Loop2>> outer_loop:none 154*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red2:d\d+>> VecReduce [<<Phi2>>] loop:none 155*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr2:i\d+>> VecExtractScalar [<<Red2>>] loop:none 156*795d594fSAndroid Build Coastguard Worker // 157*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 158*795d594fSAndroid Build Coastguard Worker // 159*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.reductionIntChain() loop_optimization (after) 160*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 161*795d594fSAndroid Build Coastguard Worker // 162*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [{{i\d+}},{{j\d+}}] loop:none 163*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop1:B\d+>> outer_loop:none 164*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Loop1P:j\d+>> VecPredWhile loop:<<Loop1>> outer_loop:none 165*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<I1:i\d+>>,<<Loop1P>>] loop:<<Loop1>> outer_loop:none 166*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi1>>,<<Load1>>,<<Loop1P>>] loop:<<Loop1>> outer_loop:none 167*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I1>>,{{i\d+}}] loop:<<Loop1>> outer_loop:none 168*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red1:d\d+>> VecReduce [<<Phi1>>,{{j\d+}}] loop:none 169*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr1:i\d+>> VecExtractScalar [<<Red1>>,{{j\d+}}] loop:none 170*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [{{i\d+}},{{j\d+}}] loop:none 171*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop2:B\d+>> outer_loop:none 172*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Loop2P:j\d+>> VecPredWhile loop:<<Loop2>> outer_loop:none 173*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<I2:i\d+>>,<<Loop2P>>] loop:<<Loop2>> outer_loop:none 174*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi2>>,<<Load2>>,<<Loop2P>>] loop:<<Loop2>> outer_loop:none 175*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I2>>,{{i\d+}}] loop:<<Loop2>> outer_loop:none 176*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red2:d\d+>> VecReduce [<<Phi2>>,{{j\d+}}] loop:none 177*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr2:i\d+>> VecExtractScalar [<<Red2>>,{{j\d+}}] loop:none 178*795d594fSAndroid Build Coastguard Worker // 179*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 180*795d594fSAndroid Build Coastguard Worker // 181*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [{{i\d+}}] loop:none 182*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop1:B\d+>> outer_loop:none 183*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<I1:i\d+>>] loop:<<Loop1>> outer_loop:none 184*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi1>>,<<Load1>>] loop:<<Loop1>> outer_loop:none 185*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I1>>,{{i\d+}}] loop:<<Loop1>> outer_loop:none 186*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red1:d\d+>> VecReduce [<<Phi1>>] loop:none 187*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr1:i\d+>> VecExtractScalar [<<Red1>>] loop:none 188*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [{{i\d+}}] loop:none 189*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop2:B\d+>> outer_loop:none 190*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<I2:i\d+>>] loop:<<Loop2>> outer_loop:none 191*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi2>>,<<Load2>>] loop:<<Loop2>> outer_loop:none 192*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I2>>,{{i\d+}}] loop:<<Loop2>> outer_loop:none 193*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red2:d\d+>> VecReduce [<<Phi2>>] loop:none 194*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr2:i\d+>> VecExtractScalar [<<Red2>>] loop:none 195*795d594fSAndroid Build Coastguard Worker // 196*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 197*795d594fSAndroid Build Coastguard Worker // 198*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 199*795d594fSAndroid Build Coastguard Worker // 200*795d594fSAndroid Build Coastguard Worker // NOTE: pattern is robust with respect to vector loop unrolling and peeling. reductionIntChain()201*795d594fSAndroid Build Coastguard Worker private static int reductionIntChain() { 202*795d594fSAndroid Build Coastguard Worker int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; 203*795d594fSAndroid Build Coastguard Worker int r = 1; 204*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 16; i++) { 205*795d594fSAndroid Build Coastguard Worker r += x[i]; 206*795d594fSAndroid Build Coastguard Worker } 207*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 16; i++) { 208*795d594fSAndroid Build Coastguard Worker r += x[i]; 209*795d594fSAndroid Build Coastguard Worker } 210*795d594fSAndroid Build Coastguard Worker return r; 211*795d594fSAndroid Build Coastguard Worker } 212*795d594fSAndroid Build Coastguard Worker 213*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.reductionIntToLoop(int[]) loop_optimization (before) 214*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons0:i\d+>> IntConstant 0 loop:none 215*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons1:i\d+>> IntConstant 1 loop:none 216*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop1:B\d+>> outer_loop:none 217*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop1>> outer_loop:none 218*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop1>> outer_loop:none 219*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Get>>] loop:<<Loop1>> outer_loop:none 220*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Cons1>>] loop:<<Loop1>> outer_loop:none 221*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:i\d+>> Phi [<<Phi2>>,{{i\d+}}] loop:<<Loop2:B\d+>> outer_loop:none 222*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi4:i\d+>> Phi [<<Phi2>>,{{i\d+}}] loop:<<Loop2>> outer_loop:none 223*795d594fSAndroid Build Coastguard Worker // 224*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 225*795d594fSAndroid Build Coastguard Worker // 226*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.reductionIntToLoop(int[]) loop_optimization (after) 227*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:i\d+>> IntConstant 2 loop:none 228*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}}] loop:none 229*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop1:B\d+>> outer_loop:none 230*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop1>> outer_loop:none 231*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>] loop:<<Loop1>> outer_loop:none 232*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons>>] loop:<<Loop1>> outer_loop:none 233*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 234*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>] loop:none 235*795d594fSAndroid Build Coastguard Worker // 236*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.reductionIntToLoop(int[]) loop_optimization (after) 237*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 238*795d594fSAndroid Build Coastguard Worker // 239*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}},{{j\d+}}] loop:none 240*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop1:B\d+>> outer_loop:none 241*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile loop:<<Loop1>> 242*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop1>> outer_loop:none 243*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>,<<LoopP>>] loop:<<Loop1>> outer_loop:none 244*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,{{i\d+}}] loop:<<Loop1>> outer_loop:none 245*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>,{{j\d+}}] loop:none 246*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>,{{j\d+}}] loop:none 247*795d594fSAndroid Build Coastguard Worker // 248*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 249*795d594fSAndroid Build Coastguard Worker // 250*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:i\d+>> IntConstant 4 loop:none 251*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}}] loop:none 252*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop1:B\d+>> outer_loop:none 253*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop1>> outer_loop:none 254*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>] loop:<<Loop1>> outer_loop:none 255*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons>>] loop:<<Loop1>> outer_loop:none 256*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 257*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>] loop:none 258*795d594fSAndroid Build Coastguard Worker // 259*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: reductionIntToLoop(int[] x)260*795d594fSAndroid Build Coastguard Worker private static int reductionIntToLoop(int[] x) { 261*795d594fSAndroid Build Coastguard Worker int r = 0; 262*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 8; i++) { 263*795d594fSAndroid Build Coastguard Worker r += x[i]; 264*795d594fSAndroid Build Coastguard Worker } 265*795d594fSAndroid Build Coastguard Worker for (int i = r; i < 16; i++) { 266*795d594fSAndroid Build Coastguard Worker r += i; 267*795d594fSAndroid Build Coastguard Worker } 268*795d594fSAndroid Build Coastguard Worker return r; 269*795d594fSAndroid Build Coastguard Worker } 270*795d594fSAndroid Build Coastguard Worker 271*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.reductionLong(long[]) loop_optimization (before) 272*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons0:i\d+>> IntConstant 0 loop:none 273*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Long0:j\d+>> LongConstant 0 loop:none 274*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons1:i\d+>> IntConstant 1 loop:none 275*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 276*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:j\d+>> Phi [<<Long0>>,{{j\d+}}] loop:<<Loop>> outer_loop:none 277*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:j\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 278*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Get>>] loop:<<Loop>> outer_loop:none 279*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Cons1>>] loop:<<Loop>> outer_loop:none 280*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Phi2>>] loop:none 281*795d594fSAndroid Build Coastguard Worker // 282*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long Main.reductionLong(long[]) loop_optimization (after) 283*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 284*795d594fSAndroid Build Coastguard Worker // 285*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons2:i\d+>> IntConstant loop:none 286*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{j\d+}},{{j\d+}}] loop:none 287*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 288*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Loop1P:j\d+>> VecPredWhile loop:<<Loop>> outer_loop:none 289*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>,<<Loop1P>>] loop:<<Loop>> outer_loop:none 290*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>,<<Loop1P>>] loop:<<Loop>> outer_loop:none 291*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 292*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>,{{j\d+}}] loop:none 293*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:j\d+>> VecExtractScalar [<<Red>>,{{j\d+}}] loop:none 294*795d594fSAndroid Build Coastguard Worker // 295*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 296*795d594fSAndroid Build Coastguard Worker // 297*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons2:i\d+>> IntConstant 2 loop:none 298*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{j\d+}}] loop:none 299*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 300*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>> outer_loop:none 301*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>] loop:<<Loop>> outer_loop:none 302*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons2>>] loop:<<Loop>> outer_loop:none 303*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 304*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:j\d+>> VecExtractScalar [<<Red>>] loop:none 305*795d594fSAndroid Build Coastguard Worker // 306*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: reductionLong(long[] x)307*795d594fSAndroid Build Coastguard Worker private static long reductionLong(long[] x) { 308*795d594fSAndroid Build Coastguard Worker long sum = 0; 309*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 310*795d594fSAndroid Build Coastguard Worker sum += x[i]; 311*795d594fSAndroid Build Coastguard Worker } 312*795d594fSAndroid Build Coastguard Worker return sum; 313*795d594fSAndroid Build Coastguard Worker } 314*795d594fSAndroid Build Coastguard Worker reductionByteM1(byte[] x)315*795d594fSAndroid Build Coastguard Worker private static byte reductionByteM1(byte[] x) { 316*795d594fSAndroid Build Coastguard Worker byte sum = -1; 317*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 318*795d594fSAndroid Build Coastguard Worker sum += x[i]; 319*795d594fSAndroid Build Coastguard Worker } 320*795d594fSAndroid Build Coastguard Worker return sum; 321*795d594fSAndroid Build Coastguard Worker } 322*795d594fSAndroid Build Coastguard Worker reductionShortM1(short[] x)323*795d594fSAndroid Build Coastguard Worker private static short reductionShortM1(short[] x) { 324*795d594fSAndroid Build Coastguard Worker short sum = -1; 325*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 326*795d594fSAndroid Build Coastguard Worker sum += x[i]; 327*795d594fSAndroid Build Coastguard Worker } 328*795d594fSAndroid Build Coastguard Worker return sum; 329*795d594fSAndroid Build Coastguard Worker } 330*795d594fSAndroid Build Coastguard Worker reductionCharM1(char[] x)331*795d594fSAndroid Build Coastguard Worker private static char reductionCharM1(char[] x) { 332*795d594fSAndroid Build Coastguard Worker char sum = 0xffff; 333*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 334*795d594fSAndroid Build Coastguard Worker sum += x[i]; 335*795d594fSAndroid Build Coastguard Worker } 336*795d594fSAndroid Build Coastguard Worker return sum; 337*795d594fSAndroid Build Coastguard Worker } 338*795d594fSAndroid Build Coastguard Worker 339*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.reductionIntM1(int[]) loop_optimization (before) 340*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons0:i\d+>> IntConstant 0 loop:none 341*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons1:i\d+>> IntConstant 1 loop:none 342*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ConsM1:i\d+>> IntConstant -1 loop:none 343*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 344*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<ConsM1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 345*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 346*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Get>>] loop:<<Loop>> outer_loop:none 347*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Cons1>>] loop:<<Loop>> outer_loop:none 348*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Phi2>>] loop:none 349*795d594fSAndroid Build Coastguard Worker // 350*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.reductionIntM1(int[]) loop_optimization (after) 351*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:i\d+>> IntConstant 2 loop:none 352*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}}] loop:none 353*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 354*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>> outer_loop:none 355*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>] loop:<<Loop>> outer_loop:none 356*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons>>] loop:<<Loop>> outer_loop:none 357*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 358*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>] loop:none 359*795d594fSAndroid Build Coastguard Worker // 360*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.reductionIntM1(int[]) loop_optimization (after) 361*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 362*795d594fSAndroid Build Coastguard Worker // 363*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}},{{j\d+}}] loop:none 364*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 365*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile loop:<<Loop>> outer_loop:none 366*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 367*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 368*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 369*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>,{{j\d+}}] loop:none 370*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>,{{j\d+}}] loop:none 371*795d594fSAndroid Build Coastguard Worker // 372*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 373*795d594fSAndroid Build Coastguard Worker // 374*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:i\d+>> IntConstant 4 loop:none 375*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}}] loop:none 376*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 377*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>> outer_loop:none 378*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>] loop:<<Loop>> outer_loop:none 379*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons>>] loop:<<Loop>> outer_loop:none 380*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 381*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>] loop:none 382*795d594fSAndroid Build Coastguard Worker // 383*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: reductionIntM1(int[] x)384*795d594fSAndroid Build Coastguard Worker private static int reductionIntM1(int[] x) { 385*795d594fSAndroid Build Coastguard Worker int sum = -1; 386*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 387*795d594fSAndroid Build Coastguard Worker sum += x[i]; 388*795d594fSAndroid Build Coastguard Worker } 389*795d594fSAndroid Build Coastguard Worker return sum; 390*795d594fSAndroid Build Coastguard Worker } 391*795d594fSAndroid Build Coastguard Worker 392*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.reductionLongM1(long[]) loop_optimization (before) 393*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons0:i\d+>> IntConstant 0 loop:none 394*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LongM1:j\d+>> LongConstant -1 loop:none 395*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons1:i\d+>> IntConstant 1 loop:none 396*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 397*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:j\d+>> Phi [<<LongM1>>,{{j\d+}}] loop:<<Loop>> outer_loop:none 398*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:j\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 399*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Get>>] loop:<<Loop>> outer_loop:none 400*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Cons1>>] loop:<<Loop>> outer_loop:none 401*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Phi2>>] loop:none 402*795d594fSAndroid Build Coastguard Worker // 403*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long Main.reductionLongM1(long[]) loop_optimization (after) 404*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 405*795d594fSAndroid Build Coastguard Worker // 406*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{j\d+}},{{j\d+}}] loop:none 407*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 408*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile loop:<<Loop>> outer_loop:none 409*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 410*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 411*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 412*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>,{{j\d+}}] loop:none 413*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:j\d+>> VecExtractScalar [<<Red>>,{{j\d+}}] loop:none 414*795d594fSAndroid Build Coastguard Worker // 415*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 416*795d594fSAndroid Build Coastguard Worker // 417*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons2:i\d+>> IntConstant 2 loop:none 418*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{j\d+}}] loop:none 419*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 420*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>> outer_loop:none 421*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi>>,<<Load>>] loop:<<Loop>> outer_loop:none 422*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons2>>] loop:<<Loop>> outer_loop:none 423*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 424*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:j\d+>> VecExtractScalar [<<Red>>] loop:none 425*795d594fSAndroid Build Coastguard Worker // 426*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: reductionLongM1(long[] x)427*795d594fSAndroid Build Coastguard Worker private static long reductionLongM1(long[] x) { 428*795d594fSAndroid Build Coastguard Worker long sum = -1L; 429*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 430*795d594fSAndroid Build Coastguard Worker sum += x[i]; 431*795d594fSAndroid Build Coastguard Worker } 432*795d594fSAndroid Build Coastguard Worker return sum; 433*795d594fSAndroid Build Coastguard Worker } 434*795d594fSAndroid Build Coastguard Worker reductionMinusByte(byte[] x)435*795d594fSAndroid Build Coastguard Worker private static byte reductionMinusByte(byte[] x) { 436*795d594fSAndroid Build Coastguard Worker byte sum = 0; 437*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 438*795d594fSAndroid Build Coastguard Worker sum -= x[i]; 439*795d594fSAndroid Build Coastguard Worker } 440*795d594fSAndroid Build Coastguard Worker return sum; 441*795d594fSAndroid Build Coastguard Worker } 442*795d594fSAndroid Build Coastguard Worker reductionMinusShort(short[] x)443*795d594fSAndroid Build Coastguard Worker private static short reductionMinusShort(short[] x) { 444*795d594fSAndroid Build Coastguard Worker short sum = 0; 445*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 446*795d594fSAndroid Build Coastguard Worker sum -= x[i]; 447*795d594fSAndroid Build Coastguard Worker } 448*795d594fSAndroid Build Coastguard Worker return sum; 449*795d594fSAndroid Build Coastguard Worker } 450*795d594fSAndroid Build Coastguard Worker reductionMinusChar(char[] x)451*795d594fSAndroid Build Coastguard Worker private static char reductionMinusChar(char[] x) { 452*795d594fSAndroid Build Coastguard Worker char sum = 0; 453*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 454*795d594fSAndroid Build Coastguard Worker sum -= x[i]; 455*795d594fSAndroid Build Coastguard Worker } 456*795d594fSAndroid Build Coastguard Worker return sum; 457*795d594fSAndroid Build Coastguard Worker } 458*795d594fSAndroid Build Coastguard Worker 459*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.reductionMinusInt(int[]) loop_optimization (before) 460*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons0:i\d+>> IntConstant 0 loop:none 461*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons1:i\d+>> IntConstant 1 loop:none 462*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 463*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 464*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 465*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Sub [<<Phi2>>,<<Get>>] loop:<<Loop>> outer_loop:none 466*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Cons1>>] loop:<<Loop>> outer_loop:none 467*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Phi2>>] loop:none 468*795d594fSAndroid Build Coastguard Worker // 469*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.reductionMinusInt(int[]) loop_optimization (after) 470*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:i\d+>> IntConstant 2 loop:none 471*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}}] loop:none 472*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 473*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>> outer_loop:none 474*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecSub [<<Phi>>,<<Load>>] loop:<<Loop>> outer_loop:none 475*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons>>] loop:<<Loop>> outer_loop:none 476*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 477*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>] loop:none 478*795d594fSAndroid Build Coastguard Worker // 479*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.reductionMinusInt(int[]) loop_optimization (after) 480*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 481*795d594fSAndroid Build Coastguard Worker // 482*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}},{{j\d+}}] loop:none 483*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 484*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile loop:<<Loop>> outer_loop:none 485*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 486*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecSub [<<Phi>>,<<Load>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 487*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 488*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>,{{j\d+}}] loop:none 489*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>,{{j\d+}}] loop:none 490*795d594fSAndroid Build Coastguard Worker // 491*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 492*795d594fSAndroid Build Coastguard Worker // 493*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons:i\d+>> IntConstant 4 loop:none 494*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{i\d+}}] loop:none 495*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 496*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>> outer_loop:none 497*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecSub [<<Phi>>,<<Load>>] loop:<<Loop>> outer_loop:none 498*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons>>] loop:<<Loop>> outer_loop:none 499*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 500*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:i\d+>> VecExtractScalar [<<Red>>] loop:none 501*795d594fSAndroid Build Coastguard Worker // 502*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: reductionMinusInt(int[] x)503*795d594fSAndroid Build Coastguard Worker private static int reductionMinusInt(int[] x) { 504*795d594fSAndroid Build Coastguard Worker int sum = 0; 505*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 506*795d594fSAndroid Build Coastguard Worker sum -= x[i]; 507*795d594fSAndroid Build Coastguard Worker } 508*795d594fSAndroid Build Coastguard Worker return sum; 509*795d594fSAndroid Build Coastguard Worker } 510*795d594fSAndroid Build Coastguard Worker 511*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.reductionMinusLong(long[]) loop_optimization (before) 512*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons0:i\d+>> IntConstant 0 loop:none 513*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Long0:j\d+>> LongConstant 0 loop:none 514*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons1:i\d+>> IntConstant 1 loop:none 515*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Cons0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 516*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:j\d+>> Phi [<<Long0>>,{{j\d+}}] loop:<<Loop>> outer_loop:none 517*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:j\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 518*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Sub [<<Phi2>>,<<Get>>] loop:<<Loop>> outer_loop:none 519*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Cons1>>] loop:<<Loop>> outer_loop:none 520*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Phi2>>] loop:none 521*795d594fSAndroid Build Coastguard Worker // 522*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long Main.reductionMinusLong(long[]) loop_optimization (after) 523*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 524*795d594fSAndroid Build Coastguard Worker // 525*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{j\d+}},{{j\d+}}] loop:none 526*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 527*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile loop:<<Loop>> outer_loop:none 528*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 529*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecSub [<<Phi>>,<<Load>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 530*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 531*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>,{{j\d+}}] loop:none 532*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:j\d+>> VecExtractScalar [<<Red>>,{{j\d+}}] loop:none 533*795d594fSAndroid Build Coastguard Worker // 534*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 535*795d594fSAndroid Build Coastguard Worker // 536*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cons2:i\d+>> IntConstant 2 loop:none 537*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [{{j\d+}}] loop:none 538*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop:B\d+>> outer_loop:none 539*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [{{l\d+}},<<I:i\d+>>] loop:<<Loop>> outer_loop:none 540*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecSub [<<Phi>>,<<Load>>] loop:<<Loop>> outer_loop:none 541*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<I>>,<<Cons2>>] loop:<<Loop>> outer_loop:none 542*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Red:d\d+>> VecReduce [<<Phi>>] loop:none 543*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Extr:j\d+>> VecExtractScalar [<<Red>>] loop:none 544*795d594fSAndroid Build Coastguard Worker // 545*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: reductionMinusLong(long[] x)546*795d594fSAndroid Build Coastguard Worker private static long reductionMinusLong(long[] x) { 547*795d594fSAndroid Build Coastguard Worker long sum = 0; 548*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 549*795d594fSAndroid Build Coastguard Worker sum -= x[i]; 550*795d594fSAndroid Build Coastguard Worker } 551*795d594fSAndroid Build Coastguard Worker return sum; 552*795d594fSAndroid Build Coastguard Worker } 553*795d594fSAndroid Build Coastguard Worker 554*795d594fSAndroid Build Coastguard Worker // 555*795d594fSAndroid Build Coastguard Worker // A few special cases. 556*795d594fSAndroid Build Coastguard Worker // 557*795d594fSAndroid Build Coastguard Worker 558*795d594fSAndroid Build Coastguard Worker // TODO: consider unrolling 559*795d594fSAndroid Build Coastguard Worker reductionInt10(int[] x)560*795d594fSAndroid Build Coastguard Worker private static int reductionInt10(int[] x) { 561*795d594fSAndroid Build Coastguard Worker int sum = 0; 562*795d594fSAndroid Build Coastguard Worker // Amenable to complete unrolling. 563*795d594fSAndroid Build Coastguard Worker for (int i = 10; i <= 10; i++) { 564*795d594fSAndroid Build Coastguard Worker sum += x[i]; 565*795d594fSAndroid Build Coastguard Worker } 566*795d594fSAndroid Build Coastguard Worker return sum; 567*795d594fSAndroid Build Coastguard Worker } 568*795d594fSAndroid Build Coastguard Worker reductionMinusInt10(int[] x)569*795d594fSAndroid Build Coastguard Worker private static int reductionMinusInt10(int[] x) { 570*795d594fSAndroid Build Coastguard Worker int sum = 0; 571*795d594fSAndroid Build Coastguard Worker // Amenable to complete unrolling. 572*795d594fSAndroid Build Coastguard Worker for (int i = 10; i <= 10; i++) { 573*795d594fSAndroid Build Coastguard Worker sum -= x[i]; 574*795d594fSAndroid Build Coastguard Worker } 575*795d594fSAndroid Build Coastguard Worker return sum; 576*795d594fSAndroid Build Coastguard Worker } 577*795d594fSAndroid Build Coastguard Worker 578*795d594fSAndroid Build Coastguard Worker // 579*795d594fSAndroid Build Coastguard Worker // Main driver. 580*795d594fSAndroid Build Coastguard Worker // 581*795d594fSAndroid Build Coastguard Worker main(String[] args)582*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 583*795d594fSAndroid Build Coastguard Worker byte[] xb = new byte[N]; 584*795d594fSAndroid Build Coastguard Worker short[] xs = new short[N]; 585*795d594fSAndroid Build Coastguard Worker char[] xc = new char[N]; 586*795d594fSAndroid Build Coastguard Worker int[] xi = new int[N]; 587*795d594fSAndroid Build Coastguard Worker long[] xl = new long[N]; 588*795d594fSAndroid Build Coastguard Worker for (int i = 0, k = -17; i < N; i++, k += 3) { 589*795d594fSAndroid Build Coastguard Worker xb[i] = (byte) k; 590*795d594fSAndroid Build Coastguard Worker xs[i] = (short) k; 591*795d594fSAndroid Build Coastguard Worker xc[i] = (char) k; 592*795d594fSAndroid Build Coastguard Worker xi[i] = k; 593*795d594fSAndroid Build Coastguard Worker xl[i] = k; 594*795d594fSAndroid Build Coastguard Worker } 595*795d594fSAndroid Build Coastguard Worker 596*795d594fSAndroid Build Coastguard Worker // Arrays with all positive elements. 597*795d594fSAndroid Build Coastguard Worker byte[] xpb = new byte[M]; 598*795d594fSAndroid Build Coastguard Worker short[] xps = new short[M]; 599*795d594fSAndroid Build Coastguard Worker char[] xpc = new char[M]; 600*795d594fSAndroid Build Coastguard Worker int[] xpi = new int[M]; 601*795d594fSAndroid Build Coastguard Worker long[] xpl = new long[M]; 602*795d594fSAndroid Build Coastguard Worker for (int i = 0, k = 3; i < M; i++, k++) { 603*795d594fSAndroid Build Coastguard Worker xpb[i] = (byte) k; 604*795d594fSAndroid Build Coastguard Worker xps[i] = (short) k; 605*795d594fSAndroid Build Coastguard Worker xpc[i] = (char) k; 606*795d594fSAndroid Build Coastguard Worker xpi[i] = k; 607*795d594fSAndroid Build Coastguard Worker xpl[i] = k; 608*795d594fSAndroid Build Coastguard Worker } 609*795d594fSAndroid Build Coastguard Worker 610*795d594fSAndroid Build Coastguard Worker // Arrays with all negative elements. 611*795d594fSAndroid Build Coastguard Worker byte[] xnb = new byte[M]; 612*795d594fSAndroid Build Coastguard Worker short[] xns = new short[M]; 613*795d594fSAndroid Build Coastguard Worker int[] xni = new int[M]; 614*795d594fSAndroid Build Coastguard Worker long[] xnl = new long[M]; 615*795d594fSAndroid Build Coastguard Worker for (int i = 0, k = -103; i < M; i++, k++) { 616*795d594fSAndroid Build Coastguard Worker xnb[i] = (byte) k; 617*795d594fSAndroid Build Coastguard Worker xns[i] = (short) k; 618*795d594fSAndroid Build Coastguard Worker xni[i] = k; 619*795d594fSAndroid Build Coastguard Worker xnl[i] = k; 620*795d594fSAndroid Build Coastguard Worker } 621*795d594fSAndroid Build Coastguard Worker 622*795d594fSAndroid Build Coastguard Worker // Test various reductions in loops. 623*795d594fSAndroid Build Coastguard Worker int[] x0 = { 0, 0, 0, 0, 0, 0, 0, 0 }; 624*795d594fSAndroid Build Coastguard Worker int[] x1 = { 0, 0, 0, 1, 0, 0, 0, 0 }; 625*795d594fSAndroid Build Coastguard Worker int[] x2 = { 1, 1, 1, 1, 0, 0, 0, 0 }; 626*795d594fSAndroid Build Coastguard Worker expectEquals(-74, reductionByte(xb)); 627*795d594fSAndroid Build Coastguard Worker expectEquals(-27466, reductionShort(xs)); 628*795d594fSAndroid Build Coastguard Worker expectEquals(38070, reductionChar(xc)); 629*795d594fSAndroid Build Coastguard Worker expectEquals(365750, reductionInt(xi)); 630*795d594fSAndroid Build Coastguard Worker expectEquals(273, reductionIntChain()); 631*795d594fSAndroid Build Coastguard Worker expectEquals(120, reductionIntToLoop(x0)); 632*795d594fSAndroid Build Coastguard Worker expectEquals(121, reductionIntToLoop(x1)); 633*795d594fSAndroid Build Coastguard Worker expectEquals(118, reductionIntToLoop(x2)); 634*795d594fSAndroid Build Coastguard Worker expectEquals(-1310, reductionIntToLoop(xi)); 635*795d594fSAndroid Build Coastguard Worker expectEquals(365750L, reductionLong(xl)); 636*795d594fSAndroid Build Coastguard Worker expectEquals(-75, reductionByteM1(xb)); 637*795d594fSAndroid Build Coastguard Worker expectEquals(-27467, reductionShortM1(xs)); 638*795d594fSAndroid Build Coastguard Worker expectEquals(38069, reductionCharM1(xc)); 639*795d594fSAndroid Build Coastguard Worker expectEquals(365749, reductionIntM1(xi)); 640*795d594fSAndroid Build Coastguard Worker expectEquals(365749L, reductionLongM1(xl)); 641*795d594fSAndroid Build Coastguard Worker expectEquals(74, reductionMinusByte(xb)); 642*795d594fSAndroid Build Coastguard Worker expectEquals(27466, reductionMinusShort(xs)); 643*795d594fSAndroid Build Coastguard Worker expectEquals(27466, reductionMinusChar(xc)); 644*795d594fSAndroid Build Coastguard Worker expectEquals(-365750, reductionMinusInt(xi)); 645*795d594fSAndroid Build Coastguard Worker expectEquals(365750L, reductionLong(xl)); 646*795d594fSAndroid Build Coastguard Worker expectEquals(-75, reductionByteM1(xb)); 647*795d594fSAndroid Build Coastguard Worker expectEquals(-27467, reductionShortM1(xs)); 648*795d594fSAndroid Build Coastguard Worker expectEquals(38069, reductionCharM1(xc)); 649*795d594fSAndroid Build Coastguard Worker expectEquals(365749, reductionIntM1(xi)); 650*795d594fSAndroid Build Coastguard Worker expectEquals(365749L, reductionLongM1(xl)); 651*795d594fSAndroid Build Coastguard Worker expectEquals(74, reductionMinusByte(xb)); 652*795d594fSAndroid Build Coastguard Worker expectEquals(27466, reductionMinusShort(xs)); 653*795d594fSAndroid Build Coastguard Worker expectEquals(27466, reductionMinusChar(xc)); 654*795d594fSAndroid Build Coastguard Worker expectEquals(-365750, reductionMinusInt(xi)); 655*795d594fSAndroid Build Coastguard Worker expectEquals(-365750L, reductionMinusLong(xl)); 656*795d594fSAndroid Build Coastguard Worker 657*795d594fSAndroid Build Coastguard Worker // Test special cases. 658*795d594fSAndroid Build Coastguard Worker expectEquals(13, reductionInt10(xi)); 659*795d594fSAndroid Build Coastguard Worker expectEquals(-13, reductionMinusInt10(xi)); 660*795d594fSAndroid Build Coastguard Worker 661*795d594fSAndroid Build Coastguard Worker System.out.println("passed"); 662*795d594fSAndroid Build Coastguard Worker } 663*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)664*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 665*795d594fSAndroid Build Coastguard Worker if (expected != result) { 666*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 667*795d594fSAndroid Build Coastguard Worker } 668*795d594fSAndroid Build Coastguard Worker } 669*795d594fSAndroid Build Coastguard Worker expectEquals(long expected, long result)670*795d594fSAndroid Build Coastguard Worker private static void expectEquals(long expected, long result) { 671*795d594fSAndroid Build Coastguard Worker if (expected != result) { 672*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 673*795d594fSAndroid Build Coastguard Worker } 674*795d594fSAndroid Build Coastguard Worker } 675*795d594fSAndroid Build Coastguard Worker } 676