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 zero vectorization. 19*795d594fSAndroid Build Coastguard Worker */ 20*795d594fSAndroid Build Coastguard Worker public class Main { 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.staticallyAligned(int[]) loop_optimization (before) 23*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> ParameterValue loop:none 24*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 25*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 26*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<Phi>>] loop:<<Loop>> outer_loop:none 27*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:i\d+>> Add [<<Get>>,<<One>>] loop:<<Loop>> outer_loop:none 28*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<Phi>>,<<Add>>] loop:<<Loop>> outer_loop:none 29*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<One>>] loop:<<Loop>> outer_loop:none 30*795d594fSAndroid Build Coastguard Worker // 31*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.staticallyAligned(int[]) loop_optimization (after) 32*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> ParameterValue loop:none 33*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 34*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 35*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Vl:i\d+>> IntConstant 2 loop:none 36*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<One>>] loop:none 37*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<Zero>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 38*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nrm:i\d+>> Add [<<Phi>>,<<One>>] loop:<<Loop>> outer_loop:none 39*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Par>>,<<Nrm>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 40*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] loop:<<Loop>> outer_loop:none 41*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Par>>,<<Nrm>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 42*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<Vl>>] loop:<<Loop>> outer_loop:none 43*795d594fSAndroid Build Coastguard Worker // 44*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 45*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArraySet staticallyAligned(int[] a)46*795d594fSAndroid Build Coastguard Worker static void staticallyAligned(int[] a) { 47*795d594fSAndroid Build Coastguard Worker // Starts at offset 12 (hidden) + 1 * 4 relative to base alignment. 48*795d594fSAndroid Build Coastguard Worker // So no peeling, aligned vector, no cleanup. 49*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < 9; i++) { 50*795d594fSAndroid Build Coastguard Worker a[i] += 1; 51*795d594fSAndroid Build Coastguard Worker } 52*795d594fSAndroid Build Coastguard Worker } 53*795d594fSAndroid Build Coastguard Worker 54*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.staticallyAlignedN(int[]) loop_optimization (before) 55*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 56*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> NullCheck loop:none 57*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 58*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<Phi>>] loop:<<Loop>> outer_loop:none 59*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:i\d+>> Add [<<Get>>,<<One>>] loop:<<Loop>> outer_loop:none 60*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<Phi>>,<<Add>>] loop:<<Loop>> outer_loop:none 61*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<One>>] loop:<<Loop>> outer_loop:none 62*795d594fSAndroid Build Coastguard Worker // 63*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.staticallyAlignedN(int[]) loop_optimization (after) 64*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 65*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 66*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Vl:i\d+>> IntConstant 2 loop:none 67*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> NullCheck loop:none 68*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<One>>] loop:none 69*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<Zero>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 70*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nrm:i\d+>> Add [<<Phi>>,<<One>>] loop:<<Loop>> outer_loop:none 71*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Par>>,<<Nrm>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 72*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] loop:<<Loop>> outer_loop:none 73*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Par>>,<<Nrm>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 74*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<Vl>>] loop:<<Loop>> outer_loop:none 75*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiC:i\d+>> Phi [<<Phi>>,<<AddIC:i\d+>>] loop:<<Clean:B\d+>> outer_loop:none 76*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<NrmC:i\d+>> Add [<<PhiC>>,<<One>>] loop:<<Clean>> outer_loop:none 77*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<NrmC>>] loop:<<Clean>> outer_loop:none 78*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddC:i\d+>> Add [<<Get>>,<<One>>] loop:<<Clean>> outer_loop:none 79*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<NrmC>>,<<AddC>>] loop:<<Clean>> outer_loop:none 80*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddIC>> Add [<<PhiC>>,<<One>>] loop:<<Clean>> outer_loop:none staticallyAlignedN(int[] a)81*795d594fSAndroid Build Coastguard Worker static void staticallyAlignedN(int[] a) { 82*795d594fSAndroid Build Coastguard Worker // Starts at offset 12 (hidden) + 1 * 4 relative to base alignment. 83*795d594fSAndroid Build Coastguard Worker // So no peeling, aligned vector, cleanup. 84*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < a.length; i++) { 85*795d594fSAndroid Build Coastguard Worker a[i] += 1; 86*795d594fSAndroid Build Coastguard Worker } 87*795d594fSAndroid Build Coastguard Worker } 88*795d594fSAndroid Build Coastguard Worker 89*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.staticallyMisaligned(int[]) loop_optimization (before) 90*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> ParameterValue loop:none 91*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 92*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 93*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<Zero>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 94*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<Phi>>] loop:<<Loop>> outer_loop:none 95*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:i\d+>> Add [<<Get>>,<<One>>] loop:<<Loop>> outer_loop:none 96*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<Phi>>,<<Add>>] loop:<<Loop>> outer_loop:none 97*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<One>>] loop:<<Loop>> outer_loop:none 98*795d594fSAndroid Build Coastguard Worker // 99*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.staticallyMisaligned(int[]) loop_optimization (after) 100*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> ParameterValue loop:none 101*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 102*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 103*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Vl:i\d+>> IntConstant 2 loop:none 104*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiP:i\d+>> Phi [<<Zero>>,<<AddIP:i\d+>>] loop:<<Peel:B\d+>> outer_loop:none 105*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<PhiP>>] loop:<<Peel>> outer_loop:none 106*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddP:i\d+>> Add [<<Get>>,<<One>>] loop:<<Peel>> outer_loop:none 107*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<PhiP>>,<<AddP>>] loop:<<Peel>> outer_loop:none 108*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddIP>> Add [<<PhiP>>,<<One>>] loop:<<Peel>> outer_loop:none 109*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<One>>] loop:none 110*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<PhiP>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 111*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Par>>,<<Phi>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 112*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] loop:<<Loop>> outer_loop:none 113*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Par>>,<<Phi>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 114*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<Vl>>] loop:<<Loop>> outer_loop:none 115*795d594fSAndroid Build Coastguard Worker // 116*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 117*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArraySet staticallyMisaligned(int[] a)118*795d594fSAndroid Build Coastguard Worker static void staticallyMisaligned(int[] a) { 119*795d594fSAndroid Build Coastguard Worker // Starts at offset 12 (hidden) + 0 * 4 relative to base alignment. 120*795d594fSAndroid Build Coastguard Worker // Yes, Art runtime misaligns the most common access pattern :-( 121*795d594fSAndroid Build Coastguard Worker // Static peeling to the rescue, aligned vector, no cleanup. 122*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 9; i++) { 123*795d594fSAndroid Build Coastguard Worker a[i] += 1; 124*795d594fSAndroid Build Coastguard Worker } 125*795d594fSAndroid Build Coastguard Worker } 126*795d594fSAndroid Build Coastguard Worker 127*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.staticallyMisalignedN(int[]) loop_optimization (before) 128*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 129*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 130*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> NullCheck loop:none 131*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<Zero>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 132*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<Phi>>] loop:<<Loop>> outer_loop:none 133*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:i\d+>> Add [<<Get>>,<<One>>] loop:<<Loop>> outer_loop:none 134*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<Phi>>,<<Add>>] loop:<<Loop>> outer_loop:none 135*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<One>>] loop:<<Loop>> outer_loop:none 136*795d594fSAndroid Build Coastguard Worker // 137*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.staticallyMisalignedN(int[]) loop_optimization (after) 138*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 139*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 140*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Vl:i\d+>> IntConstant 2 loop:none 141*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> NullCheck loop:none 142*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiP:i\d+>> Phi [<<Zero>>,<<AddIP:i\d+>>] loop:<<Peel:B\d+>> outer_loop:none 143*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<GetP:i\d+>> ArrayGet [<<Par>>,<<PhiP>>] loop:<<Peel>> outer_loop:none 144*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddP:i\d+>> Add [<<GetP>>,<<One>>] loop:<<Peel>> outer_loop:none 145*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<PhiP>>,<<AddP>>] loop:<<Peel>> outer_loop:none 146*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddIP>> Add [<<PhiP>>,<<One>>] loop:<<Peel>> outer_loop:none 147*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<One>>] loop:none 148*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<PhiP>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 149*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Par>>,<<Phi>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 150*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] loop:<<Loop>> outer_loop:none 151*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Par>>,<<Phi>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 152*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<Vl>>] loop:<<Loop>> outer_loop:none 153*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiC:i\d+>> Phi [<<Phi>>,<<AddIC:i\d+>>] loop:<<Clean:B\d+>> outer_loop:none 154*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<GetC:i\d+>> ArrayGet [<<Par>>,<<PhiC>>] loop:<<Clean>> outer_loop:none 155*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddC:i\d+>> Add [<<GetC>>,<<One>>] loop:<<Clean>> outer_loop:none 156*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<PhiC>>,<<AddC>>] loop:<<Clean>> outer_loop:none 157*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddIC>> Add [<<PhiC>>,<<One>>] loop:<<Clean>> outer_loop:none staticallyMisalignedN(int[] a)158*795d594fSAndroid Build Coastguard Worker static void staticallyMisalignedN(int[] a) { 159*795d594fSAndroid Build Coastguard Worker // Starts at offset 12 (hidden) + 0 * 4 relative to base alignment. 160*795d594fSAndroid Build Coastguard Worker // Yes, Art runtime misaligns the most common access pattern :-( 161*795d594fSAndroid Build Coastguard Worker // Static peeling to the rescue, aligned vector, cleanup. 162*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 163*795d594fSAndroid Build Coastguard Worker a[i] += 1; 164*795d594fSAndroid Build Coastguard Worker } 165*795d594fSAndroid Build Coastguard Worker } 166*795d594fSAndroid Build Coastguard Worker 167*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.staticallyUnknownAligned(int[], int) loop_optimization (before) 168*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> ParameterValue loop:none 169*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Off:i\d+>> ParameterValue loop:none 170*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 171*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 172*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<Zero>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 173*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nrm:i\d+>> Add [<<Off>>,<<Phi>>] loop:<<Loop>> outer_loop:none 174*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<Nrm>>] loop:<<Loop>> outer_loop:none 175*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:i\d+>> Add [<<Get>>,<<One>>] loop:<<Loop>> outer_loop:none 176*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<Nrm>>,<<Add>>] loop:<<Loop>> outer_loop:none 177*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<One>>] loop:<<Loop>> outer_loop:none 178*795d594fSAndroid Build Coastguard Worker // 179*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.staticallyUnknownAligned(int[], int) loop_optimization (after) 180*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> ParameterValue loop:none 181*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Off:i\d+>> ParameterValue loop:none 182*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 183*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 184*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Vl:i\d+>> IntConstant 2 loop:none 185*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiP:i\d+>> Phi [<<Zero>>,<<AddIP:i\d+>>] loop:<<Peel:B\d+>> outer_loop:none 186*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<NrmP:i\d+>> Add [<<PhiP>>,<<Off>>] loop:<<Peel>> outer_loop:none 187*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<NrmP>>] loop:<<Peel>> outer_loop:none 188*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddP:i\d+>> Add [<<Get>>,<<One>>] loop:<<Peel>> outer_loop:none 189*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<NrmP>>,<<AddP>>] loop:<<Peel>> outer_loop:none 190*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddIP>> Add [<<PhiP>>,<<One>>] loop:<<Peel>> outer_loop:none 191*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<One>>] loop:none 192*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<PhiP>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 193*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nrm:i\d+>> Add [<<Phi>>,<<Off>>] loop:<<Loop>> outer_loop:none 194*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Par>>,<<Nrm>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 195*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] loop:<<Loop>> outer_loop:none 196*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Par>>,<<Nrm>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 197*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<Vl>>] loop:<<Loop>> outer_loop:none 198*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiC:i\d+>> Phi [<<Phi>>,<<AddIC:i\d+>>] loop:<<Clean:B\d+>> outer_loop:none 199*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<NrmC:i\d+>> Add [<<PhiC>>,<<Off>>] loop:<<Clean>> outer_loop:none 200*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<GetC:i\d+>> ArrayGet [<<Par>>,<<NrmC>>] loop:<<Clean>> outer_loop:none 201*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddC:i\d+>> Add [<<GetC>>,<<One>>] loop:<<Clean>> outer_loop:none 202*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<NrmC>>,<<AddC>>] loop:<<Clean>> outer_loop:none 203*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddIC>> Add [<<PhiC>>,<<One>>] loop:<<Clean>> outer_loop:none staticallyUnknownAligned(int[] a, int off)204*795d594fSAndroid Build Coastguard Worker static void staticallyUnknownAligned(int[] a, int off) { 205*795d594fSAndroid Build Coastguard Worker // Starts at an unknown offset due to parameter off. 206*795d594fSAndroid Build Coastguard Worker // Dynamic peeling to the rescue, aligned vector, cleanup. 207*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 9; i++) { 208*795d594fSAndroid Build Coastguard Worker a[off + i] += 1; 209*795d594fSAndroid Build Coastguard Worker } 210*795d594fSAndroid Build Coastguard Worker } 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.staticallyUnknownAlignedN(int[], int, int) loop_optimization (before) 213*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> ParameterValue loop:none 214*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Off:i\d+>> ParameterValue loop:none 215*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 216*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 217*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<Zero>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 218*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nrm:i\d+>> Add [<<Off>>,<<Phi>>] loop:<<Loop>> outer_loop:none 219*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<Nrm>>] loop:<<Loop>> outer_loop:none 220*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:i\d+>> Add [<<Get>>,<<One>>] loop:<<Loop>> outer_loop:none 221*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<Nrm>>,<<Add>>] loop:<<Loop>> outer_loop:none 222*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<One>>] loop:<<Loop>> outer_loop:none 223*795d594fSAndroid Build Coastguard Worker // 224*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.staticallyUnknownAlignedN(int[], int, int) loop_optimization (after) 225*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:l\d+>> ParameterValue loop:none 226*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Off:i\d+>> ParameterValue loop:none 227*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 loop:none 228*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 loop:none 229*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Vl:i\d+>> IntConstant 2 loop:none 230*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiP:i\d+>> Phi [<<Zero>>,<<AddIP:i\d+>>] loop:<<Peel:B\d+>> outer_loop:none 231*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<NrmP:i\d+>> Add [<<PhiP>>,<<Off>>] loop:<<Peel>> outer_loop:none 232*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get:i\d+>> ArrayGet [<<Par>>,<<NrmP>>] loop:<<Peel>> outer_loop:none 233*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddP:i\d+>> Add [<<Get>>,<<One>>] loop:<<Peel>> outer_loop:none 234*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<NrmP>>,<<AddP>>] loop:<<Peel>> outer_loop:none 235*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddIP>> Add [<<PhiP>>,<<One>>] loop:<<Peel>> outer_loop:none 236*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<One>>] loop:none 237*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<PhiP>>,<<AddI:i\d+>>] loop:<<Loop:B\d+>> outer_loop:none 238*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nrm:i\d+>> Add [<<Phi>>,<<Off>>] loop:<<Loop>> outer_loop:none 239*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Par>>,<<Nrm>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 240*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] loop:<<Loop>> outer_loop:none 241*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Par>>,<<Nrm>>,<<Add>>] alignment:ALIGN(8,0) loop:<<Loop>> outer_loop:none 242*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddI>> Add [<<Phi>>,<<Vl>>] loop:<<Loop>> outer_loop:none 243*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<PhiC:i\d+>> Phi [<<Phi>>,<<AddIC:i\d+>>] loop:<<Clean:B\d+>> outer_loop:none 244*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<NrmC:i\d+>> Add [<<PhiC>>,<<Off>>] loop:<<Clean>> outer_loop:none 245*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<GetC:i\d+>> ArrayGet [<<Par>>,<<NrmC>>] loop:<<Clean>> outer_loop:none 246*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddC:i\d+>> Add [<<GetC>>,<<One>>] loop:<<Clean>> outer_loop:none 247*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Par>>,<<NrmC>>,<<AddC>>] loop:<<Clean>> outer_loop:none 248*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddIC>> Add [<<PhiC>>,<<One>>] loop:<<Clean>> outer_loop:none staticallyUnknownAlignedN(int[] a, int off, int n)249*795d594fSAndroid Build Coastguard Worker static void staticallyUnknownAlignedN(int[] a, int off, int n) { 250*795d594fSAndroid Build Coastguard Worker // Starts at an unknown offset due to parameter off. 251*795d594fSAndroid Build Coastguard Worker // Dynamic peeling to the rescue, aligned vector, cleanup. 252*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; i++) { 253*795d594fSAndroid Build Coastguard Worker a[off + i] += 1; 254*795d594fSAndroid Build Coastguard Worker } 255*795d594fSAndroid Build Coastguard Worker } 256*795d594fSAndroid Build Coastguard Worker 257*795d594fSAndroid Build Coastguard Worker // 258*795d594fSAndroid Build Coastguard Worker // Test drivers. 259*795d594fSAndroid Build Coastguard Worker // 260*795d594fSAndroid Build Coastguard Worker test1()261*795d594fSAndroid Build Coastguard Worker private static void test1() { 262*795d594fSAndroid Build Coastguard Worker int[] a = new int[9]; 263*795d594fSAndroid Build Coastguard Worker staticallyAligned(a); 264*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 265*795d594fSAndroid Build Coastguard Worker int e = i > 0 ? 1 : 0; 266*795d594fSAndroid Build Coastguard Worker expectEquals(e, a[i]); 267*795d594fSAndroid Build Coastguard Worker } 268*795d594fSAndroid Build Coastguard Worker } 269*795d594fSAndroid Build Coastguard Worker test2()270*795d594fSAndroid Build Coastguard Worker private static void test2() { 271*795d594fSAndroid Build Coastguard Worker for (int n = 0; n <= 71; n++) { 272*795d594fSAndroid Build Coastguard Worker int[] a = new int[n]; 273*795d594fSAndroid Build Coastguard Worker staticallyAlignedN(a); 274*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 275*795d594fSAndroid Build Coastguard Worker int e = i > 0 ? 1 : 0; 276*795d594fSAndroid Build Coastguard Worker expectEquals(e, a[i]); 277*795d594fSAndroid Build Coastguard Worker } 278*795d594fSAndroid Build Coastguard Worker } 279*795d594fSAndroid Build Coastguard Worker } 280*795d594fSAndroid Build Coastguard Worker test3()281*795d594fSAndroid Build Coastguard Worker private static void test3() { 282*795d594fSAndroid Build Coastguard Worker int[] a = new int[9]; 283*795d594fSAndroid Build Coastguard Worker staticallyMisaligned(a); 284*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 285*795d594fSAndroid Build Coastguard Worker expectEquals(1, a[i]); 286*795d594fSAndroid Build Coastguard Worker } 287*795d594fSAndroid Build Coastguard Worker } 288*795d594fSAndroid Build Coastguard Worker test4()289*795d594fSAndroid Build Coastguard Worker private static void test4() { 290*795d594fSAndroid Build Coastguard Worker for (int n = 0; n <= 71; n++) { 291*795d594fSAndroid Build Coastguard Worker int[] a = new int[n]; 292*795d594fSAndroid Build Coastguard Worker staticallyMisalignedN(a); 293*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 294*795d594fSAndroid Build Coastguard Worker expectEquals(1, a[i]); 295*795d594fSAndroid Build Coastguard Worker } 296*795d594fSAndroid Build Coastguard Worker } 297*795d594fSAndroid Build Coastguard Worker } 298*795d594fSAndroid Build Coastguard Worker test5()299*795d594fSAndroid Build Coastguard Worker private static void test5() { 300*795d594fSAndroid Build Coastguard Worker for (int off = 0; off <= 8; off++) { 301*795d594fSAndroid Build Coastguard Worker int[] a = new int[17]; 302*795d594fSAndroid Build Coastguard Worker staticallyUnknownAligned(a, off); 303*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 304*795d594fSAndroid Build Coastguard Worker int e = (off <= i && i < off + 9) ? 1 : 0; 305*795d594fSAndroid Build Coastguard Worker expectEquals(e, a[i]); 306*795d594fSAndroid Build Coastguard Worker } 307*795d594fSAndroid Build Coastguard Worker } 308*795d594fSAndroid Build Coastguard Worker } 309*795d594fSAndroid Build Coastguard Worker test6()310*795d594fSAndroid Build Coastguard Worker private static void test6() { 311*795d594fSAndroid Build Coastguard Worker for (int off = 0; off <= 8; off++) { 312*795d594fSAndroid Build Coastguard Worker for (int n = 0; n <= 9; n++) { 313*795d594fSAndroid Build Coastguard Worker int[] a = new int[17]; 314*795d594fSAndroid Build Coastguard Worker staticallyUnknownAlignedN(a, off, n); 315*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 316*795d594fSAndroid Build Coastguard Worker int e = (off <= i && i < off + n) ? 1 : 0; 317*795d594fSAndroid Build Coastguard Worker expectEquals(e, a[i]); 318*795d594fSAndroid Build Coastguard Worker } 319*795d594fSAndroid Build Coastguard Worker } 320*795d594fSAndroid Build Coastguard Worker } 321*795d594fSAndroid Build Coastguard Worker } 322*795d594fSAndroid Build Coastguard Worker main(String[] args)323*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 324*795d594fSAndroid Build Coastguard Worker test1(); 325*795d594fSAndroid Build Coastguard Worker test2(); 326*795d594fSAndroid Build Coastguard Worker test4(); 327*795d594fSAndroid Build Coastguard Worker test5(); 328*795d594fSAndroid Build Coastguard Worker test6(); 329*795d594fSAndroid Build Coastguard Worker System.out.println("passed"); 330*795d594fSAndroid Build Coastguard Worker } 331*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)332*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 333*795d594fSAndroid Build Coastguard Worker if (expected != result) { 334*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 335*795d594fSAndroid Build Coastguard Worker } 336*795d594fSAndroid Build Coastguard Worker } 337*795d594fSAndroid Build Coastguard Worker } 338