1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2019 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 // Based on Linpack.matgen 19*795d594fSAndroid Build Coastguard Worker // Load-store elimination did not work when a function had SIMD code. 20*795d594fSAndroid Build Coastguard Worker // In the test below loop B is vectorized. 21*795d594fSAndroid Build Coastguard Worker // Check that a redundant ArrayGet is eliminated in loop A. 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker /// CHECK-START: double Main.$noinline$vecgen(double[], double[], int) load_store_elimination (before) 24*795d594fSAndroid Build Coastguard Worker /// CHECK: Rem 25*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: TypeConversion 26*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 27*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 28*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet 29*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 30*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: LessThanOrEqual 31*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Select 32*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 33*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Goto loop:{{B\d+}} 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Worker /// CHECK-START: double Main.$noinline$vecgen(double[], double[], int) load_store_elimination (after) 36*795d594fSAndroid Build Coastguard Worker /// CHECK: Rem 37*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: TypeConversion 38*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 39*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 40*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet 41*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 42*795d594fSAndroid Build Coastguard Worker // 43*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 44*795d594fSAndroid Build Coastguard Worker // 45*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 46*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: LessThanOrEqual 47*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Select 48*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 49*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Goto loop:{{B\d+}} 50*795d594fSAndroid Build Coastguard Worker // 51*795d594fSAndroid Build Coastguard Worker // TODO: reenable LSE for graphs with Predicated SIMD. $noinline$vecgen(double a[], double b[], int n)52*795d594fSAndroid Build Coastguard Worker static double $noinline$vecgen(double a[], double b[], int n) { 53*795d594fSAndroid Build Coastguard Worker double norma = 0.0; 54*795d594fSAndroid Build Coastguard Worker int init = 1325; 55*795d594fSAndroid Build Coastguard Worker // Loop A 56*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; ++i) { 57*795d594fSAndroid Build Coastguard Worker init = 3125*init % 65536; 58*795d594fSAndroid Build Coastguard Worker a[i] = (init - 32768.0)/16384.0; 59*795d594fSAndroid Build Coastguard Worker norma = (a[i] > norma) ? a[i] : norma; // ArrayGet should be removed by LSE. 60*795d594fSAndroid Build Coastguard Worker } 61*795d594fSAndroid Build Coastguard Worker 62*795d594fSAndroid Build Coastguard Worker // Loop B 63*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; ++i) { 64*795d594fSAndroid Build Coastguard Worker b[i] += a[i]; 65*795d594fSAndroid Build Coastguard Worker } 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker return norma; 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker test01()71*795d594fSAndroid Build Coastguard Worker static void test01() { 72*795d594fSAndroid Build Coastguard Worker double a[] = new double[1024]; 73*795d594fSAndroid Build Coastguard Worker double norma = $noinline$vecgen(a, a, a.length); 74*795d594fSAndroid Build Coastguard Worker System.out.println((int)norma); 75*795d594fSAndroid Build Coastguard Worker System.out.println((int)a[1023]); 76*795d594fSAndroid Build Coastguard Worker } 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker // Check LSE works when a function has SIMD code. 79*795d594fSAndroid Build Coastguard Worker // 80*795d594fSAndroid Build Coastguard Worker /// CHECK-START: double Main.$noinline$test02(double[], int) load_store_elimination (before) 81*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck loop:none 82*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 83*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 84*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet 85*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 86*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayLength 87*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BelowOrEqual 88*795d594fSAndroid Build Coastguard Worker // 89*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet loop:none 90*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Return 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker /// CHECK-START: double Main.$noinline$test02(double[], int) load_store_elimination (after) 93*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck loop:none 94*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 95*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 96*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet 97*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 98*795d594fSAndroid Build Coastguard Worker // 99*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 100*795d594fSAndroid Build Coastguard Worker // 101*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 102*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayLength 103*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BelowOrEqual 104*795d594fSAndroid Build Coastguard Worker // 105*795d594fSAndroid Build Coastguard Worker /// CHECK: Return 106*795d594fSAndroid Build Coastguard Worker // 107*795d594fSAndroid Build Coastguard Worker // TODO: reenable LSE for graphs with Predicated SIMD. $noinline$test02(double a[], int n)108*795d594fSAndroid Build Coastguard Worker static double $noinline$test02(double a[], int n) { 109*795d594fSAndroid Build Coastguard Worker double b[] = new double[n]; 110*795d594fSAndroid Build Coastguard Worker a[0] = a[0] / 2; 111*795d594fSAndroid Build Coastguard Worker 112*795d594fSAndroid Build Coastguard Worker double norma = a[0]; // ArrayGet should be removed by LSE. 113*795d594fSAndroid Build Coastguard Worker 114*795d594fSAndroid Build Coastguard Worker // The following loop is vectorized. 115*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 128; ++i) { 116*795d594fSAndroid Build Coastguard Worker b[i] += a[i]; 117*795d594fSAndroid Build Coastguard Worker } 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker norma = a[0]; // ArrayGet should be removed by LSE. 120*795d594fSAndroid Build Coastguard Worker return norma; 121*795d594fSAndroid Build Coastguard Worker } 122*795d594fSAndroid Build Coastguard Worker test02()123*795d594fSAndroid Build Coastguard Worker static void test02() { 124*795d594fSAndroid Build Coastguard Worker double a[] = new double[128]; 125*795d594fSAndroid Build Coastguard Worker java.util.Arrays.fill(a, 2.0); 126*795d594fSAndroid Build Coastguard Worker double norma = $noinline$test02(a, a.length); 127*795d594fSAndroid Build Coastguard Worker System.out.println((int)norma); 128*795d594fSAndroid Build Coastguard Worker } 129*795d594fSAndroid Build Coastguard Worker 130*795d594fSAndroid Build Coastguard Worker // Check LSE works when a function has SIMD code. 131*795d594fSAndroid Build Coastguard Worker // 132*795d594fSAndroid Build Coastguard Worker /// CHECK-START: double Main.$noinline$test03(int) load_store_elimination (before) 133*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet loop:none 134*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Return 135*795d594fSAndroid Build Coastguard Worker 136*795d594fSAndroid Build Coastguard Worker /// CHECK-START: double Main.$noinline$test03(int) load_store_elimination (after) 137*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true') 138*795d594fSAndroid Build Coastguard Worker // 139*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet loop:none 140*795d594fSAndroid Build Coastguard Worker // 141*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 142*795d594fSAndroid Build Coastguard Worker // 143*795d594fSAndroid Build Coastguard Worker // TODO: reenable LSE for graphs with Predicated SIMD. $noinline$test03(int n)144*795d594fSAndroid Build Coastguard Worker static double $noinline$test03(int n) { 145*795d594fSAndroid Build Coastguard Worker double a[] = new double[n]; 146*795d594fSAndroid Build Coastguard Worker double b[] = new double[n]; 147*795d594fSAndroid Build Coastguard Worker 148*795d594fSAndroid Build Coastguard Worker a[0] = 2.0; 149*795d594fSAndroid Build Coastguard Worker 150*795d594fSAndroid Build Coastguard Worker // The following loop is vectorized. 151*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 128; ++i) { 152*795d594fSAndroid Build Coastguard Worker b[i] += a[i]; 153*795d594fSAndroid Build Coastguard Worker } 154*795d594fSAndroid Build Coastguard Worker 155*795d594fSAndroid Build Coastguard Worker a[0] = 2.0; 156*795d594fSAndroid Build Coastguard Worker return a[0]; // ArrayGet should be removed by LSE. 157*795d594fSAndroid Build Coastguard Worker } 158*795d594fSAndroid Build Coastguard Worker test03()159*795d594fSAndroid Build Coastguard Worker static void test03() { 160*795d594fSAndroid Build Coastguard Worker double norma = $noinline$test03(128); 161*795d594fSAndroid Build Coastguard Worker System.out.println((int)norma); 162*795d594fSAndroid Build Coastguard Worker } 163*795d594fSAndroid Build Coastguard Worker 164*795d594fSAndroid Build Coastguard Worker // Check LSE eliminates VecLoad. 165*795d594fSAndroid Build Coastguard Worker // 166*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: double[] Main.$noinline$test04(int) load_store_elimination (before) 167*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 168*795d594fSAndroid Build Coastguard Worker /// CHECK: VecLoad 169*795d594fSAndroid Build Coastguard Worker /// CHECK: VecAdd 170*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 171*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 172*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto loop:{{B\d+}} 173*795d594fSAndroid Build Coastguard Worker 174*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: double[] Main.$noinline$test04(int) load_store_elimination (after) 175*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true') 176*795d594fSAndroid Build Coastguard Worker // 177*795d594fSAndroid Build Coastguard Worker // In NEON case there is a post-loop which prevents the store to be removed. 178*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 179*795d594fSAndroid Build Coastguard Worker // 180*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 181*795d594fSAndroid Build Coastguard Worker // 182*795d594fSAndroid Build Coastguard Worker /// CHECK: VecAdd 183*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 184*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 185*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto loop:{{B\d+}} 186*795d594fSAndroid Build Coastguard Worker // 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true') 189*795d594fSAndroid Build Coastguard Worker // 190*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecStore 191*795d594fSAndroid Build Coastguard Worker // 192*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 193*795d594fSAndroid Build Coastguard Worker // 194*795d594fSAndroid Build Coastguard Worker // TODO: reenable LSE for graphs with Predicated SIMD. $noinline$test04(int n)195*795d594fSAndroid Build Coastguard Worker static double[] $noinline$test04(int n) { 196*795d594fSAndroid Build Coastguard Worker double a[] = new double[n]; 197*795d594fSAndroid Build Coastguard Worker double b[] = new double[n]; 198*795d594fSAndroid Build Coastguard Worker 199*795d594fSAndroid Build Coastguard Worker // The following loop is vectorized. 200*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; ++i) { 201*795d594fSAndroid Build Coastguard Worker a[i] = 1; 202*795d594fSAndroid Build Coastguard Worker b[i] = a[i] + a[i]; // VecLoad should be removed by LSE. 203*795d594fSAndroid Build Coastguard Worker } 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker return b; 206*795d594fSAndroid Build Coastguard Worker } 207*795d594fSAndroid Build Coastguard Worker test04()208*795d594fSAndroid Build Coastguard Worker static void test04() { 209*795d594fSAndroid Build Coastguard Worker double norma = $noinline$test04(128)[0]; 210*795d594fSAndroid Build Coastguard Worker System.out.println((int)norma); 211*795d594fSAndroid Build Coastguard Worker } 212*795d594fSAndroid Build Coastguard Worker 213*795d594fSAndroid Build Coastguard Worker // Check LSE eliminates VecLoad. 214*795d594fSAndroid Build Coastguard Worker // 215*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: double[] Main.$noinline$test05(int) load_store_elimination (before) 216*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 217*795d594fSAndroid Build Coastguard Worker /// CHECK: VecLoad 218*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 219*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 220*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 221*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto loop:{{B\d+}} 222*795d594fSAndroid Build Coastguard Worker 223*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: double[] Main.$noinline$test05(int) load_store_elimination (after) 224*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 225*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 226*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 227*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto loop:{{B\d+}} 228*795d594fSAndroid Build Coastguard Worker // 229*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecStore 230*795d594fSAndroid Build Coastguard Worker // 231*795d594fSAndroid Build Coastguard Worker // TODO: reenable LSE for graphs with Predicated SIMD. $noinline$test05(int n)232*795d594fSAndroid Build Coastguard Worker static double[] $noinline$test05(int n) { 233*795d594fSAndroid Build Coastguard Worker double a[] = new double[n]; 234*795d594fSAndroid Build Coastguard Worker double b[] = new double[n]; 235*795d594fSAndroid Build Coastguard Worker 236*795d594fSAndroid Build Coastguard Worker // The following loop is vectorized. 237*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; ++i) { 238*795d594fSAndroid Build Coastguard Worker a[i] = 1; 239*795d594fSAndroid Build Coastguard Worker b[i] = a[i]; 240*795d594fSAndroid Build Coastguard Worker a[i] = 1; 241*795d594fSAndroid Build Coastguard Worker } 242*795d594fSAndroid Build Coastguard Worker 243*795d594fSAndroid Build Coastguard Worker return b; 244*795d594fSAndroid Build Coastguard Worker } 245*795d594fSAndroid Build Coastguard Worker test05()246*795d594fSAndroid Build Coastguard Worker static void test05() { 247*795d594fSAndroid Build Coastguard Worker double norma = $noinline$test05(128)[0]; 248*795d594fSAndroid Build Coastguard Worker System.out.println((int)norma); 249*795d594fSAndroid Build Coastguard Worker } 250*795d594fSAndroid Build Coastguard Worker 251*795d594fSAndroid Build Coastguard Worker // Check LSE eliminates VecLoad and ArrayGet in case of singletons and default values. 252*795d594fSAndroid Build Coastguard Worker // 253*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: double[] Main.$noinline$test06(int) load_store_elimination (before) 254*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck loop:none 255*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 256*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 257*795d594fSAndroid Build Coastguard Worker // 258*795d594fSAndroid Build Coastguard Worker /// CHECK: VecLoad loop:{{B\d+}} 259*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 260*795d594fSAndroid Build Coastguard Worker /// CHECK: VecLoad 261*795d594fSAndroid Build Coastguard Worker /// CHECK: VecLoad 262*795d594fSAndroid Build Coastguard Worker /// CHECK: VecAdd 263*795d594fSAndroid Build Coastguard Worker /// CHECK: VecAdd 264*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 265*795d594fSAndroid Build Coastguard Worker 266*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: double[] Main.$noinline$test06(int) load_store_elimination (after) 267*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck loop:none 268*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 269*795d594fSAndroid Build Coastguard Worker // 270*795d594fSAndroid Build Coastguard Worker /// CHECK: VecLoad loop:{{B\d+}} 271*795d594fSAndroid Build Coastguard Worker /// CHECK: VecAdd 272*795d594fSAndroid Build Coastguard Worker /// CHECK: VecAdd 273*795d594fSAndroid Build Coastguard Worker /// CHECK: VecStore 274*795d594fSAndroid Build Coastguard Worker // 275*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true') 276*795d594fSAndroid Build Coastguard Worker // 277*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecStore 278*795d594fSAndroid Build Coastguard Worker // 279*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 280*795d594fSAndroid Build Coastguard Worker // 281*795d594fSAndroid Build Coastguard Worker // TODO: reenable LSE for graphs with Predicated SIMD. $noinline$test06(int n)282*795d594fSAndroid Build Coastguard Worker static double[] $noinline$test06(int n) { 283*795d594fSAndroid Build Coastguard Worker double a[] = new double[n]; 284*795d594fSAndroid Build Coastguard Worker double b[] = new double[n]; 285*795d594fSAndroid Build Coastguard Worker 286*795d594fSAndroid Build Coastguard Worker double r = a[0] + 1.0; // ArrayGet:a[0] is eliminated and default 0.0 is used. 287*795d594fSAndroid Build Coastguard Worker // The following loop is vectorized. 288*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; ++i) { 289*795d594fSAndroid Build Coastguard Worker b[i] = a[i]; // VecLoad:a[i] is not eliminated. 290*795d594fSAndroid Build Coastguard Worker b[i] += a[i] + r; // VecLoad:a[i] and VecLoad:b[i] are eliminated. 291*795d594fSAndroid Build Coastguard Worker } 292*795d594fSAndroid Build Coastguard Worker 293*795d594fSAndroid Build Coastguard Worker return b; 294*795d594fSAndroid Build Coastguard Worker } 295*795d594fSAndroid Build Coastguard Worker test06()296*795d594fSAndroid Build Coastguard Worker static void test06() { 297*795d594fSAndroid Build Coastguard Worker double norma = $noinline$test06(128)[0]; 298*795d594fSAndroid Build Coastguard Worker System.out.println((int)norma); 299*795d594fSAndroid Build Coastguard Worker } 300*795d594fSAndroid Build Coastguard Worker main(String[] args)301*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 302*795d594fSAndroid Build Coastguard Worker test01(); 303*795d594fSAndroid Build Coastguard Worker test02(); 304*795d594fSAndroid Build Coastguard Worker test03(); 305*795d594fSAndroid Build Coastguard Worker test04(); 306*795d594fSAndroid Build Coastguard Worker test05(); 307*795d594fSAndroid Build Coastguard Worker test06(); 308*795d594fSAndroid Build Coastguard Worker } 309*795d594fSAndroid Build Coastguard Worker } 310*795d594fSAndroid Build Coastguard Worker 311