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 public class Main { 18*795d594fSAndroid Build Coastguard Worker assertIntEquals(int expected, int result)19*795d594fSAndroid Build Coastguard Worker public static void assertIntEquals(int expected, int result) { 20*795d594fSAndroid Build Coastguard Worker if (expected != result) { 21*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 22*795d594fSAndroid Build Coastguard Worker } 23*795d594fSAndroid Build Coastguard Worker } 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkIntCase(int[]) instruction_simplifier_arm64 (before) 26*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:l\d+>> ParameterValue 27*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5 28*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 29*795d594fSAndroid Build Coastguard Worker // 30*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}] 31*795d594fSAndroid Build Coastguard Worker // -------------- Loop 32*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 33*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 34*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 35*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Index>>,<<LoopP>>] 36*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>] 37*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Add>>,<<LoopP>>] 38*795d594fSAndroid Build Coastguard Worker // 39*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 40*795d594fSAndroid Build Coastguard Worker // 41*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>] 42*795d594fSAndroid Build Coastguard Worker // -------------- Loop 43*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 44*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 45*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Index>>] 46*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] 47*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Add>>] 48*795d594fSAndroid Build Coastguard Worker // 49*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkIntCase(int[]) instruction_simplifier_arm64 (after) 52*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:l\d+>> ParameterValue 53*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5 54*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 55*795d594fSAndroid Build Coastguard Worker // 56*795d594fSAndroid Build Coastguard Worker // IntermediateAddressIndex is not supported for SVE. 57*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}] 58*795d594fSAndroid Build Coastguard Worker // -------------- Loop 59*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 60*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 61*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 62*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}] 63*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr1>>,<<Index>>,<<LoopP>>] 64*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>] 65*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr2:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}] 66*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<IntAddr2>>,<<Index>>,<<Add>>,<<LoopP>>] 67*795d594fSAndroid Build Coastguard Worker // 68*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 69*795d594fSAndroid Build Coastguard Worker // 70*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 71*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 72*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>] 73*795d594fSAndroid Build Coastguard Worker // -------------- Loop 74*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 75*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 76*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>] 77*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Address1>>] 78*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] 79*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>] 80*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Address2>>,<<Add>>] 81*795d594fSAndroid Build Coastguard Worker // 82*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 83*795d594fSAndroid Build Coastguard Worker 84*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkIntCase(int[]) GVN$after_arch (after) 85*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:l\d+>> ParameterValue 86*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5 87*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 88*795d594fSAndroid Build Coastguard Worker // 89*795d594fSAndroid Build Coastguard Worker // IntermediateAddressIndex is not supported for SVE. 90*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}] 91*795d594fSAndroid Build Coastguard Worker // -------------- Loop 92*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 93*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 94*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 95*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}] 96*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr>>,<<Index>>,<<LoopP>>] 97*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>] 98*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<IntAddr>>,<<Index>>,<<Add>>,<<LoopP>>] 99*795d594fSAndroid Build Coastguard Worker // 100*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 101*795d594fSAndroid Build Coastguard Worker // 102*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 103*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 104*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>] 105*795d594fSAndroid Build Coastguard Worker // -------------- Loop 106*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 107*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 108*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>] 109*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Address1>>] 110*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] 111*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 112*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Address1>>,<<Add>>] 113*795d594fSAndroid Build Coastguard Worker // 114*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkIntCase(int[]) disassembly (after) 117*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 118*795d594fSAndroid Build Coastguard Worker // 119*795d594fSAndroid Build Coastguard Worker // IntermediateAddressIndex is not supported for SVE. 120*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddressIndex 121*795d594fSAndroid Build Coastguard Worker // 122*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 123*795d594fSAndroid Build Coastguard Worker // 124*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddressIndex 125*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{[0-9]+}}, w{{[0-9]+}}, w{{[0-9]+}}, lsl #2 126*795d594fSAndroid Build Coastguard Worker // 127*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: checkIntCase(int[] a)128*795d594fSAndroid Build Coastguard Worker public static void checkIntCase(int[] a) { 129*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 128; i++) { 130*795d594fSAndroid Build Coastguard Worker a[i] += 5; 131*795d594fSAndroid Build Coastguard Worker } 132*795d594fSAndroid Build Coastguard Worker } 133*795d594fSAndroid Build Coastguard Worker 134*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkByteCase(byte[]) instruction_simplifier_arm64 (before) 135*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:l\d+>> ParameterValue 136*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5 137*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 138*795d594fSAndroid Build Coastguard Worker // 139*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}] 140*795d594fSAndroid Build Coastguard Worker // -------------- Loop 141*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 142*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 143*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 144*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Index>>,<<LoopP>>] 145*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>] 146*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Add>>,<<LoopP>>] 147*795d594fSAndroid Build Coastguard Worker // 148*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 149*795d594fSAndroid Build Coastguard Worker // 150*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>] 151*795d594fSAndroid Build Coastguard Worker // -------------- Loop 152*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 153*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 154*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Index>>] 155*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] 156*795d594fSAndroid Build Coastguard Worker 157*795d594fSAndroid Build Coastguard Worker // 158*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 159*795d594fSAndroid Build Coastguard Worker 160*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkByteCase(byte[]) instruction_simplifier_arm64 (after) 161*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:l\d+>> ParameterValue 162*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 163*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5 164*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 165*795d594fSAndroid Build Coastguard Worker // 166*795d594fSAndroid Build Coastguard Worker // IntermediateAddressIndex is not supported for SVE. 167*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}] 168*795d594fSAndroid Build Coastguard Worker // -------------- Loop 169*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 170*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 171*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 172*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}] 173*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr1>>,<<Index>>,<<LoopP>>] 174*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>] 175*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr2:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}] 176*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<IntAddr2>>,<<Index>>,<<Add>>,<<LoopP>>] 177*795d594fSAndroid Build Coastguard Worker // 178*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 179*795d594fSAndroid Build Coastguard Worker // 180*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 181*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>] 182*795d594fSAndroid Build Coastguard Worker // -------------- Loop 183*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 184*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 185*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const0>>] 186*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Address1>>] 187*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] 188*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const0>>] 189*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Address2>>,<<Add>>] 190*795d594fSAndroid Build Coastguard Worker // 191*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkByteCase(byte[]) GVN$after_arch (after) 194*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:l\d+>> ParameterValue 195*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 196*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5 197*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 198*795d594fSAndroid Build Coastguard Worker // 199*795d594fSAndroid Build Coastguard Worker // IntermediateAddressIndex is not supported for SVE. 200*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}] 201*795d594fSAndroid Build Coastguard Worker // -------------- Loop 202*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 203*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 204*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 205*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}] 206*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr>>,<<Index>>,<<LoopP>>] 207*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>] 208*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<IntAddr>>,<<Index>>,<<Add>>,<<LoopP>>] 209*795d594fSAndroid Build Coastguard Worker // 210*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 211*795d594fSAndroid Build Coastguard Worker // 212*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 213*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>] 214*795d594fSAndroid Build Coastguard Worker // -------------- Loop 215*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 216*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 217*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const0>>] 218*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Address1>>] 219*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>] 220*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 221*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Address1>>,<<Add>>] 222*795d594fSAndroid Build Coastguard Worker // 223*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkByteCase(byte[]) disassembly (after) 226*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 227*795d594fSAndroid Build Coastguard Worker // 228*795d594fSAndroid Build Coastguard Worker // IntermediateAddressIndex is not supported for SVE. 229*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddressIndex 230*795d594fSAndroid Build Coastguard Worker // 231*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 232*795d594fSAndroid Build Coastguard Worker // 233*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddressIndex 234*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{[0-9]+}}, w{{[0-9]+}}, #0x{{[0-9a-fA-F]+}} 235*795d594fSAndroid Build Coastguard Worker /// CHECK: VecLoad 236*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ldr q{{[0-9]+}}, [x{{[0-9]+}}, x{{[0-9]+}}] 237*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 238*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: str q{{[0-9]+}}, [x{{[0-9]+}}, x{{[0-9]+}}] 239*795d594fSAndroid Build Coastguard Worker // 240*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: checkByteCase(byte[] a)241*795d594fSAndroid Build Coastguard Worker public static void checkByteCase(byte[] a) { 242*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 128; i++) { 243*795d594fSAndroid Build Coastguard Worker a[i] += 5; 244*795d594fSAndroid Build Coastguard Worker } 245*795d594fSAndroid Build Coastguard Worker } 246*795d594fSAndroid Build Coastguard Worker 247*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkSingleAccess(int[]) instruction_simplifier_arm64 (before) 248*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:l\d+>> ParameterValue 249*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5 250*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 251*795d594fSAndroid Build Coastguard Worker // 252*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}] 253*795d594fSAndroid Build Coastguard Worker // -------------- Loop 254*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 255*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 256*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 257*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Repl>>,<<LoopP>>] 258*795d594fSAndroid Build Coastguard Worker // 259*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 260*795d594fSAndroid Build Coastguard Worker // 261*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>] 262*795d594fSAndroid Build Coastguard Worker // -------------- Loop 263*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 264*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 265*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Repl>>] 266*795d594fSAndroid Build Coastguard Worker // 267*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 268*795d594fSAndroid Build Coastguard Worker 269*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkSingleAccess(int[]) instruction_simplifier_arm64 (after) 270*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:l\d+>> ParameterValue 271*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 272*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5 273*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 274*795d594fSAndroid Build Coastguard Worker // 275*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}] 276*795d594fSAndroid Build Coastguard Worker // -------------- Loop 277*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 278*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 279*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 280*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}] 281*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<IntAddr>>,<<Index>>,<<Repl>>,<<LoopP>>] 282*795d594fSAndroid Build Coastguard Worker // 283*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 284*795d594fSAndroid Build Coastguard Worker // 285*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>] 286*795d594fSAndroid Build Coastguard Worker // -------------- Loop 287*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 288*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 289*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Repl>>] 290*795d594fSAndroid Build Coastguard Worker // 291*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 292*795d594fSAndroid Build Coastguard Worker // 293*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress checkSingleAccess(int[] a)294*795d594fSAndroid Build Coastguard Worker public static void checkSingleAccess(int[] a) { 295*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 128; i++) { 296*795d594fSAndroid Build Coastguard Worker a[i] = 5; 297*795d594fSAndroid Build Coastguard Worker } 298*795d594fSAndroid Build Coastguard Worker } 299*795d594fSAndroid Build Coastguard Worker 300*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkInt2Float(int[], float[]) instruction_simplifier_arm64 (before) 301*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array1:l\d+>> ParameterValue 302*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array2:l\d+>> ParameterValue 303*795d594fSAndroid Build Coastguard Worker // -------------- Loop 304*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 305*795d594fSAndroid Build Coastguard Worker // 306*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 307*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 308*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 309*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array1>>,<<Index>>,<<LoopP>>] 310*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>,<<LoopP>>] 311*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array2>>,<<Index>>,<<Cnv>>,<<LoopP>>] 312*795d594fSAndroid Build Coastguard Worker // 313*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 314*795d594fSAndroid Build Coastguard Worker // 315*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 316*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 317*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array1>>,<<Index>>] 318*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>] 319*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array2>>,<<Index>>,<<Cnv>>] 320*795d594fSAndroid Build Coastguard Worker // 321*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 322*795d594fSAndroid Build Coastguard Worker 323*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkInt2Float(int[], float[]) instruction_simplifier_arm64 (after) 324*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array1:l\d+>> ParameterValue 325*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array2:l\d+>> ParameterValue 326*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 327*795d594fSAndroid Build Coastguard Worker // 328*795d594fSAndroid Build Coastguard Worker // IntermediateAddressIndex is not supported for SVE. 329*795d594fSAndroid Build Coastguard Worker // -------------- Loop 330*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 331*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 332*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 333*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [<<Array1>>,{{i\d+}}] 334*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr1>>,<<Index>>,<<LoopP>>] 335*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>,<<LoopP>>] 336*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr2:i\d+>> IntermediateAddress [<<Array2>>,{{i\d+}}] 337*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<IntAddr2>>,<<Index>>,<<Cnv>>,<<LoopP>>] 338*795d594fSAndroid Build Coastguard Worker // 339*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 340*795d594fSAndroid Build Coastguard Worker // 341*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 342*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 343*795d594fSAndroid Build Coastguard Worker // -------------- Loop 344*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 345*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 346*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>] 347*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array1>>,<<Address1>>] 348*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>] 349*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>] 350*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array2>>,<<Address2>>,<<Cnv>>] 351*795d594fSAndroid Build Coastguard Worker // 352*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 353*795d594fSAndroid Build Coastguard Worker 354*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkInt2Float(int[], float[]) GVN$after_arch (after) 355*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array1:l\d+>> ParameterValue 356*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array2:l\d+>> ParameterValue 357*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 358*795d594fSAndroid Build Coastguard Worker // 359*795d594fSAndroid Build Coastguard Worker // IntermediateAddressIndex is not supported for SVE. 360*795d594fSAndroid Build Coastguard Worker // -------------- Loop 361*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile 362*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 363*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 364*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [<<Array1>>,{{i\d+}}] 365*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr1>>,<<Index>>,<<LoopP>>] 366*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>,<<LoopP>>] 367*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr2:i\d+>> IntermediateAddress [<<Array2>>,{{i\d+}}] 368*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<IntAddr2>>,<<Index>>,<<Cnv>>,<<LoopP>>] 369*795d594fSAndroid Build Coastguard Worker // 370*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 371*795d594fSAndroid Build Coastguard Worker // 372*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 373*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 374*795d594fSAndroid Build Coastguard Worker // -------------- Loop 375*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 376*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: If 377*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>] 378*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array1>>,<<Address1>>] 379*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>] 380*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 381*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<Array2>>,<<Address1>>,<<Cnv>>] 382*795d594fSAndroid Build Coastguard Worker // 383*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 384*795d594fSAndroid Build Coastguard Worker 385*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.checkInt2Float(int[], float[]) disassembly (after) 386*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 387*795d594fSAndroid Build Coastguard Worker // 388*795d594fSAndroid Build Coastguard Worker // IntermediateAddressIndex is not supported for SVE. 389*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddressIndex 390*795d594fSAndroid Build Coastguard Worker // 391*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 392*795d594fSAndroid Build Coastguard Worker // 393*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddressIndex 394*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: add w{{[0-9]+}}, w{{[0-9]+}}, w{{[0-9]+}}, lsl #2 395*795d594fSAndroid Build Coastguard Worker // 396*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: checkInt2Float(int[] a, float[] b)397*795d594fSAndroid Build Coastguard Worker public static void checkInt2Float(int[] a, float[] b) { 398*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 128; i++) { 399*795d594fSAndroid Build Coastguard Worker b[i] = (float) a[i]; 400*795d594fSAndroid Build Coastguard Worker } 401*795d594fSAndroid Build Coastguard Worker } 402*795d594fSAndroid Build Coastguard Worker 403*795d594fSAndroid Build Coastguard Worker public static final int ARRAY_SIZE = 1024; 404*795d594fSAndroid Build Coastguard Worker calcArraySum(int[] a, byte[] b, float[] c)405*795d594fSAndroid Build Coastguard Worker public static int calcArraySum(int[] a, byte[] b, float[] c) { 406*795d594fSAndroid Build Coastguard Worker int sum = 0; 407*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 128; i++) { 408*795d594fSAndroid Build Coastguard Worker sum += a[i] + b[i] + (int) c[i]; 409*795d594fSAndroid Build Coastguard Worker } 410*795d594fSAndroid Build Coastguard Worker return sum; 411*795d594fSAndroid Build Coastguard Worker } 412*795d594fSAndroid Build Coastguard Worker main(String[] args)413*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 414*795d594fSAndroid Build Coastguard Worker byte[] ba = new byte[ARRAY_SIZE]; 415*795d594fSAndroid Build Coastguard Worker int[] ia = new int[ARRAY_SIZE]; 416*795d594fSAndroid Build Coastguard Worker float[] fa = new float[ARRAY_SIZE]; 417*795d594fSAndroid Build Coastguard Worker 418*795d594fSAndroid Build Coastguard Worker checkSingleAccess(ia); 419*795d594fSAndroid Build Coastguard Worker checkIntCase(ia); 420*795d594fSAndroid Build Coastguard Worker checkByteCase(ba); 421*795d594fSAndroid Build Coastguard Worker checkInt2Float(ia, fa); 422*795d594fSAndroid Build Coastguard Worker 423*795d594fSAndroid Build Coastguard Worker assertIntEquals(3200, calcArraySum(ia, ba, fa)); 424*795d594fSAndroid Build Coastguard Worker } 425*795d594fSAndroid Build Coastguard Worker } 426