1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2020 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 { expectEquals(long expected, long result)18*795d594fSAndroid Build Coastguard Worker private static void expectEquals(long expected, long result) { 19*795d594fSAndroid Build Coastguard Worker if (expected != result) { 20*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 21*795d594fSAndroid Build Coastguard Worker } 22*795d594fSAndroid Build Coastguard Worker } 23*795d594fSAndroid Build Coastguard Worker remInt()24*795d594fSAndroid Build Coastguard Worker private static void remInt() { 25*795d594fSAndroid Build Coastguard Worker expectEquals(1L << 32, $noinline$IntRemBy3(3)); 26*795d594fSAndroid Build Coastguard Worker expectEquals((3L << 32) | 6, $noinline$IntRemBy7(27)); 27*795d594fSAndroid Build Coastguard Worker expectEquals((1L << 32) | 1, $noinline$IntRemBy12(13)); 28*795d594fSAndroid Build Coastguard Worker expectEquals((1L << 32) | 1, $noinline$IntRemBy12A(13)); 29*795d594fSAndroid Build Coastguard Worker } 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker // A test case to check: 32*795d594fSAndroid Build Coastguard Worker // BCE detects the optimized 'v % 3' and eliminates bounds checks. 33*795d594fSAndroid Build Coastguard Worker // 34*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$IntRemBy3(int) BCE (before) 35*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 36*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 37*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 38*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 39*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 40*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 41*795d594fSAndroid Build Coastguard Worker // 42*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$IntRemBy3(int) BCE (after) 43*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 44*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 45*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 46*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 47*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 48*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet $noinline$IntRemBy3(int v)49*795d594fSAndroid Build Coastguard Worker private static long $noinline$IntRemBy3(int v) { 50*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 51*795d594fSAndroid Build Coastguard Worker if (v > 0) { 52*795d594fSAndroid Build Coastguard Worker int q = v / 3; 53*795d594fSAndroid Build Coastguard Worker int r = v % 3; 54*795d594fSAndroid Build Coastguard Worker return ((long)q << 32) | values[r]; 55*795d594fSAndroid Build Coastguard Worker } else { 56*795d594fSAndroid Build Coastguard Worker return -1; 57*795d594fSAndroid Build Coastguard Worker } 58*795d594fSAndroid Build Coastguard Worker } 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker // A test case to check: 61*795d594fSAndroid Build Coastguard Worker // BCE detects the optimized 'v % 7' and eliminates bounds checks. 62*795d594fSAndroid Build Coastguard Worker // 63*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$IntRemBy7(int) BCE (before) 64*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 65*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 66*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 67*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 68*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 69*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 70*795d594fSAndroid Build Coastguard Worker // 71*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$IntRemBy7(int) BCE (after) 72*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 73*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 74*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 75*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 76*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 77*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet $noinline$IntRemBy7(int v)78*795d594fSAndroid Build Coastguard Worker private static long $noinline$IntRemBy7(int v) { 79*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2, 3, 4, 5, 6}; 80*795d594fSAndroid Build Coastguard Worker if (v > 0) { 81*795d594fSAndroid Build Coastguard Worker int q = v / 7; 82*795d594fSAndroid Build Coastguard Worker int r = v % 7; 83*795d594fSAndroid Build Coastguard Worker return ((long)q << 32) | values[r]; 84*795d594fSAndroid Build Coastguard Worker } else { 85*795d594fSAndroid Build Coastguard Worker return -1; 86*795d594fSAndroid Build Coastguard Worker } 87*795d594fSAndroid Build Coastguard Worker } 88*795d594fSAndroid Build Coastguard Worker 89*795d594fSAndroid Build Coastguard Worker // A test case to check: 90*795d594fSAndroid Build Coastguard Worker // BCE detects the optimized 'v % 12' and eliminates bounds checks. 91*795d594fSAndroid Build Coastguard Worker // 92*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$IntRemBy12(int) BCE (before) 93*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 94*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 95*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 96*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 97*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 98*795d594fSAndroid Build Coastguard Worker // 99*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$IntRemBy12(int) BCE (after) 100*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 101*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 102*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 103*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 104*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet $noinline$IntRemBy12(int v)105*795d594fSAndroid Build Coastguard Worker private static long $noinline$IntRemBy12(int v) { 106*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; 107*795d594fSAndroid Build Coastguard Worker if (v > 0) { 108*795d594fSAndroid Build Coastguard Worker int q = v / 12; 109*795d594fSAndroid Build Coastguard Worker int r = v % 12; 110*795d594fSAndroid Build Coastguard Worker return ((long)q << 32) | values[r]; 111*795d594fSAndroid Build Coastguard Worker } else { 112*795d594fSAndroid Build Coastguard Worker return -1; 113*795d594fSAndroid Build Coastguard Worker } 114*795d594fSAndroid Build Coastguard Worker } 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker // A test case to check: 117*795d594fSAndroid Build Coastguard Worker // BCE detects the optimized 'v % 12' and eliminates bounds checks. 118*795d594fSAndroid Build Coastguard Worker // 119*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$IntRemBy12A(int) BCE (before) 120*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 121*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 122*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 123*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 124*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 125*795d594fSAndroid Build Coastguard Worker // 126*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.$noinline$IntRemBy12A(int) BCE (after) 127*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 128*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 129*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 130*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 131*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet $noinline$IntRemBy12A(int v)132*795d594fSAndroid Build Coastguard Worker private static long $noinline$IntRemBy12A(int v) { 133*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; 134*795d594fSAndroid Build Coastguard Worker if (v > 0) { 135*795d594fSAndroid Build Coastguard Worker int q = v / 12; 136*795d594fSAndroid Build Coastguard Worker int t = q * 12; 137*795d594fSAndroid Build Coastguard Worker int r = v - t; 138*795d594fSAndroid Build Coastguard Worker return ((long)q << 32) | values[r]; 139*795d594fSAndroid Build Coastguard Worker } else { 140*795d594fSAndroid Build Coastguard Worker return -1; 141*795d594fSAndroid Build Coastguard Worker } 142*795d594fSAndroid Build Coastguard Worker } 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker // A test case to check: 145*795d594fSAndroid Build Coastguard Worker // BCE detects the optimized 'v % Integer.MAX_VALUE' and eliminates bounds checks. 146*795d594fSAndroid Build Coastguard Worker // 147*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$IntRemByMaxInt(int) BCE (before) 148*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 149*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 150*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 151*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 152*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 153*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 154*795d594fSAndroid Build Coastguard Worker // 155*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$IntRemByMaxInt(int) BCE (after) 156*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 157*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 158*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 159*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 160*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 161*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet $noinline$IntRemByMaxInt(int v)162*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntRemByMaxInt(int v) { 163*795d594fSAndroid Build Coastguard Worker int[] values = new int[Integer.MAX_VALUE]; 164*795d594fSAndroid Build Coastguard Worker if (v > 0) { 165*795d594fSAndroid Build Coastguard Worker int q = v / Integer.MAX_VALUE; 166*795d594fSAndroid Build Coastguard Worker int r = v % Integer.MAX_VALUE; 167*795d594fSAndroid Build Coastguard Worker return values[v % Integer.MAX_VALUE] + q; 168*795d594fSAndroid Build Coastguard Worker } else { 169*795d594fSAndroid Build Coastguard Worker return -1; 170*795d594fSAndroid Build Coastguard Worker } 171*795d594fSAndroid Build Coastguard Worker } 172*795d594fSAndroid Build Coastguard Worker 173*795d594fSAndroid Build Coastguard Worker // A test case to check: 174*795d594fSAndroid Build Coastguard Worker // BCE detects the optimized 'v % Integer.MIN_VALUE' and eliminates bounds checks. 175*795d594fSAndroid Build Coastguard Worker // 176*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$IntRemByMinInt(int) BCE (before) 177*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 178*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 179*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 180*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 181*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 182*795d594fSAndroid Build Coastguard Worker // 183*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$IntRemByMinInt(int) BCE (after) 184*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 185*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 186*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 187*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 188*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet $noinline$IntRemByMinInt(int v)189*795d594fSAndroid Build Coastguard Worker private static int $noinline$IntRemByMinInt(int v) { 190*795d594fSAndroid Build Coastguard Worker int[] values = new int[Integer.MAX_VALUE]; 191*795d594fSAndroid Build Coastguard Worker if (v > 0) { 192*795d594fSAndroid Build Coastguard Worker int q = v / Integer.MIN_VALUE; 193*795d594fSAndroid Build Coastguard Worker int t = q * Integer.MIN_VALUE; 194*795d594fSAndroid Build Coastguard Worker int r = v - t; 195*795d594fSAndroid Build Coastguard Worker return values[r - 1]; 196*795d594fSAndroid Build Coastguard Worker } else { 197*795d594fSAndroid Build Coastguard Worker return -1; 198*795d594fSAndroid Build Coastguard Worker } 199*795d594fSAndroid Build Coastguard Worker } 200*795d594fSAndroid Build Coastguard Worker 201*795d594fSAndroid Build Coastguard Worker // A test case to check: 202*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 203*795d594fSAndroid Build Coastguard Worker // 204*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem01(int, int) BCE (before) 205*795d594fSAndroid Build Coastguard Worker /// CHECK: Mul 206*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 207*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 208*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 209*795d594fSAndroid Build Coastguard Worker // 210*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem01(int, int) BCE (after) 211*795d594fSAndroid Build Coastguard Worker /// CHECK: Mul 212*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 213*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 214*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem01(int v, int s)215*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem01(int v, int s) { 216*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 217*795d594fSAndroid Build Coastguard Worker if (v > 0) { 218*795d594fSAndroid Build Coastguard Worker int a = v * 10; 219*795d594fSAndroid Build Coastguard Worker int b = s - a; 220*795d594fSAndroid Build Coastguard Worker return values[b]; 221*795d594fSAndroid Build Coastguard Worker } else { 222*795d594fSAndroid Build Coastguard Worker return -1; 223*795d594fSAndroid Build Coastguard Worker } 224*795d594fSAndroid Build Coastguard Worker } 225*795d594fSAndroid Build Coastguard Worker 226*795d594fSAndroid Build Coastguard Worker // A test case to check: 227*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 228*795d594fSAndroid Build Coastguard Worker // 229*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem02(int, int) BCE (before) 230*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 231*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 232*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 233*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 234*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 235*795d594fSAndroid Build Coastguard Worker // 236*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem02(int, int) BCE (after) 237*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 238*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 239*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 240*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 241*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem02(int v, int s)242*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem02(int v, int s) { 243*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 244*795d594fSAndroid Build Coastguard Worker if (v > 0) { 245*795d594fSAndroid Build Coastguard Worker int q = v / 10; 246*795d594fSAndroid Build Coastguard Worker int a = q * s; 247*795d594fSAndroid Build Coastguard Worker int b = v - a; 248*795d594fSAndroid Build Coastguard Worker return values[b]; 249*795d594fSAndroid Build Coastguard Worker } else { 250*795d594fSAndroid Build Coastguard Worker return -1; 251*795d594fSAndroid Build Coastguard Worker } 252*795d594fSAndroid Build Coastguard Worker } 253*795d594fSAndroid Build Coastguard Worker 254*795d594fSAndroid Build Coastguard Worker // A test case to check: 255*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 256*795d594fSAndroid Build Coastguard Worker // 257*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem03(int, int) BCE (before) 258*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 259*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 260*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 261*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 262*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 263*795d594fSAndroid Build Coastguard Worker // 264*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem03(int, int) BCE (after) 265*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 266*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 267*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 268*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 269*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem03(int v, int s)270*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem03(int v, int s) { 271*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 272*795d594fSAndroid Build Coastguard Worker if (v > 0) { 273*795d594fSAndroid Build Coastguard Worker int q = v / 10; 274*795d594fSAndroid Build Coastguard Worker int a = q + s; 275*795d594fSAndroid Build Coastguard Worker int b = v - a; 276*795d594fSAndroid Build Coastguard Worker return values[b]; 277*795d594fSAndroid Build Coastguard Worker } else { 278*795d594fSAndroid Build Coastguard Worker return -1; 279*795d594fSAndroid Build Coastguard Worker } 280*795d594fSAndroid Build Coastguard Worker } 281*795d594fSAndroid Build Coastguard Worker 282*795d594fSAndroid Build Coastguard Worker // A test case to check: 283*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 284*795d594fSAndroid Build Coastguard Worker // 285*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem04(int, int) BCE (before) 286*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 287*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 288*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 289*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 290*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 291*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 292*795d594fSAndroid Build Coastguard Worker // 293*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem04(int, int) BCE (after) 294*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 295*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 296*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 297*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 298*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 299*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem04(int v, int s)300*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem04(int v, int s) { 301*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 302*795d594fSAndroid Build Coastguard Worker if (v > 0) { 303*795d594fSAndroid Build Coastguard Worker int q = v / 10; 304*795d594fSAndroid Build Coastguard Worker int t = q << s; 305*795d594fSAndroid Build Coastguard Worker int a = q + t; 306*795d594fSAndroid Build Coastguard Worker int b = v - a; 307*795d594fSAndroid Build Coastguard Worker return values[b]; 308*795d594fSAndroid Build Coastguard Worker } else { 309*795d594fSAndroid Build Coastguard Worker return -1; 310*795d594fSAndroid Build Coastguard Worker } 311*795d594fSAndroid Build Coastguard Worker } 312*795d594fSAndroid Build Coastguard Worker 313*795d594fSAndroid Build Coastguard Worker // A test case to check: 314*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 315*795d594fSAndroid Build Coastguard Worker // 316*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem05(int, int) BCE (before) 317*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 318*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 319*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 320*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 321*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 322*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 323*795d594fSAndroid Build Coastguard Worker // 324*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem05(int, int) BCE (after) 325*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 326*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 327*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 328*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 329*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 330*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem05(int v, int s)331*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem05(int v, int s) { 332*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 333*795d594fSAndroid Build Coastguard Worker if (v > 0) { 334*795d594fSAndroid Build Coastguard Worker int q = v / 10; 335*795d594fSAndroid Build Coastguard Worker int t = s << 1; 336*795d594fSAndroid Build Coastguard Worker int a = q + t; 337*795d594fSAndroid Build Coastguard Worker int b = v - a; 338*795d594fSAndroid Build Coastguard Worker return values[b]; 339*795d594fSAndroid Build Coastguard Worker } else { 340*795d594fSAndroid Build Coastguard Worker return -1; 341*795d594fSAndroid Build Coastguard Worker } 342*795d594fSAndroid Build Coastguard Worker } 343*795d594fSAndroid Build Coastguard Worker 344*795d594fSAndroid Build Coastguard Worker // A test case to check: 345*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 346*795d594fSAndroid Build Coastguard Worker // 347*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem06(int, int) BCE (before) 348*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 349*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 350*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 351*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 352*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 353*795d594fSAndroid Build Coastguard Worker // 354*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem06(int, int) BCE (after) 355*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 356*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 357*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 358*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 359*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem06(int v, int s)360*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem06(int v, int s) { 361*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 362*795d594fSAndroid Build Coastguard Worker if (v > 0) { 363*795d594fSAndroid Build Coastguard Worker int q = v / 10; 364*795d594fSAndroid Build Coastguard Worker int a = q * 11; 365*795d594fSAndroid Build Coastguard Worker int b = v - a; 366*795d594fSAndroid Build Coastguard Worker return values[b]; 367*795d594fSAndroid Build Coastguard Worker } else { 368*795d594fSAndroid Build Coastguard Worker return -1; 369*795d594fSAndroid Build Coastguard Worker } 370*795d594fSAndroid Build Coastguard Worker } 371*795d594fSAndroid Build Coastguard Worker 372*795d594fSAndroid Build Coastguard Worker // A test case to check: 373*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 374*795d594fSAndroid Build Coastguard Worker // 375*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem07(int, int) BCE (before) 376*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 377*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 378*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 379*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 380*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 381*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 382*795d594fSAndroid Build Coastguard Worker // 383*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem07(int, int) BCE (after) 384*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 385*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 386*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 387*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 388*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 389*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem07(int v, int s)390*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem07(int v, int s) { 391*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 392*795d594fSAndroid Build Coastguard Worker if (v > 0) { 393*795d594fSAndroid Build Coastguard Worker int q = v / 10; 394*795d594fSAndroid Build Coastguard Worker int t = q << 1; 395*795d594fSAndroid Build Coastguard Worker int a = s + t; 396*795d594fSAndroid Build Coastguard Worker int b = v - a; 397*795d594fSAndroid Build Coastguard Worker return values[b]; 398*795d594fSAndroid Build Coastguard Worker } else { 399*795d594fSAndroid Build Coastguard Worker return -1; 400*795d594fSAndroid Build Coastguard Worker } 401*795d594fSAndroid Build Coastguard Worker } 402*795d594fSAndroid Build Coastguard Worker 403*795d594fSAndroid Build Coastguard Worker // A test case to check: 404*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 405*795d594fSAndroid Build Coastguard Worker // 406*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem08(int, int) BCE (before) 407*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 408*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 409*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 410*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 411*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 412*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 413*795d594fSAndroid Build Coastguard Worker // 414*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem08(int, int) BCE (after) 415*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 416*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 417*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 418*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 419*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 420*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem08(int v, int s)421*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem08(int v, int s) { 422*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 423*795d594fSAndroid Build Coastguard Worker if (v > 0) { 424*795d594fSAndroid Build Coastguard Worker int q = v / 10; 425*795d594fSAndroid Build Coastguard Worker int t = q << 31; 426*795d594fSAndroid Build Coastguard Worker int a = q + t; 427*795d594fSAndroid Build Coastguard Worker int b = v - a; 428*795d594fSAndroid Build Coastguard Worker return values[b]; 429*795d594fSAndroid Build Coastguard Worker } else { 430*795d594fSAndroid Build Coastguard Worker return -1; 431*795d594fSAndroid Build Coastguard Worker } 432*795d594fSAndroid Build Coastguard Worker } 433*795d594fSAndroid Build Coastguard Worker 434*795d594fSAndroid Build Coastguard Worker // A test case to check: 435*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 436*795d594fSAndroid Build Coastguard Worker // 437*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem09(int, int) BCE (before) 438*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 439*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 440*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 441*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 442*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 443*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 444*795d594fSAndroid Build Coastguard Worker // 445*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem09(int, int) BCE (after) 446*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 447*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 448*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 449*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 450*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 451*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem09(int v, int s)452*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem09(int v, int s) { 453*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 454*795d594fSAndroid Build Coastguard Worker if (v > 0) { 455*795d594fSAndroid Build Coastguard Worker int q = v / 10; 456*795d594fSAndroid Build Coastguard Worker int t = q << 1; 457*795d594fSAndroid Build Coastguard Worker int a = q + t; 458*795d594fSAndroid Build Coastguard Worker int b = v - a; 459*795d594fSAndroid Build Coastguard Worker return values[b]; 460*795d594fSAndroid Build Coastguard Worker } else { 461*795d594fSAndroid Build Coastguard Worker return -1; 462*795d594fSAndroid Build Coastguard Worker } 463*795d594fSAndroid Build Coastguard Worker } 464*795d594fSAndroid Build Coastguard Worker 465*795d594fSAndroid Build Coastguard Worker // A test case to check: 466*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 467*795d594fSAndroid Build Coastguard Worker // 468*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem10(int, int) BCE (before) 469*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 470*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 471*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 472*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 473*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 474*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 475*795d594fSAndroid Build Coastguard Worker // 476*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem10(int, int) BCE (after) 477*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 478*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 479*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 480*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 481*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 482*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem10(int v, int s)483*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem10(int v, int s) { 484*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 485*795d594fSAndroid Build Coastguard Worker if (v > 0) { 486*795d594fSAndroid Build Coastguard Worker int q = v / 10; 487*795d594fSAndroid Build Coastguard Worker int t = q << s; 488*795d594fSAndroid Build Coastguard Worker int a = t - q; 489*795d594fSAndroid Build Coastguard Worker int b = v - a; 490*795d594fSAndroid Build Coastguard Worker return values[b]; 491*795d594fSAndroid Build Coastguard Worker } else { 492*795d594fSAndroid Build Coastguard Worker return -1; 493*795d594fSAndroid Build Coastguard Worker } 494*795d594fSAndroid Build Coastguard Worker } 495*795d594fSAndroid Build Coastguard Worker 496*795d594fSAndroid Build Coastguard Worker // A test case to check: 497*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 498*795d594fSAndroid Build Coastguard Worker // 499*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem11(int, int) BCE (before) 500*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 501*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 502*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 503*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 504*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 505*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 506*795d594fSAndroid Build Coastguard Worker // 507*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem11(int, int) BCE (after) 508*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 509*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 510*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 511*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 512*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 513*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem11(int v, int s)514*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem11(int v, int s) { 515*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 516*795d594fSAndroid Build Coastguard Worker if (v > 0) { 517*795d594fSAndroid Build Coastguard Worker int q = v / 10; 518*795d594fSAndroid Build Coastguard Worker int t = s << 1; 519*795d594fSAndroid Build Coastguard Worker int a = t - q; 520*795d594fSAndroid Build Coastguard Worker int b = v - a; 521*795d594fSAndroid Build Coastguard Worker return values[b]; 522*795d594fSAndroid Build Coastguard Worker } else { 523*795d594fSAndroid Build Coastguard Worker return -1; 524*795d594fSAndroid Build Coastguard Worker } 525*795d594fSAndroid Build Coastguard Worker } 526*795d594fSAndroid Build Coastguard Worker 527*795d594fSAndroid Build Coastguard Worker // A test case to check: 528*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 529*795d594fSAndroid Build Coastguard Worker // 530*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem12(int, int) BCE (before) 531*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 532*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 533*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 534*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 535*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 536*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 537*795d594fSAndroid Build Coastguard Worker // 538*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem12(int, int) BCE (after) 539*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 540*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 541*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 542*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 543*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 544*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem12(int v, int s)545*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem12(int v, int s) { 546*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 547*795d594fSAndroid Build Coastguard Worker if (v > 0) { 548*795d594fSAndroid Build Coastguard Worker int q = v / 10; 549*795d594fSAndroid Build Coastguard Worker int t = q << 1; 550*795d594fSAndroid Build Coastguard Worker int a = t - s; 551*795d594fSAndroid Build Coastguard Worker int b = v - a; 552*795d594fSAndroid Build Coastguard Worker return values[b]; 553*795d594fSAndroid Build Coastguard Worker } else { 554*795d594fSAndroid Build Coastguard Worker return -1; 555*795d594fSAndroid Build Coastguard Worker } 556*795d594fSAndroid Build Coastguard Worker } 557*795d594fSAndroid Build Coastguard Worker 558*795d594fSAndroid Build Coastguard Worker // A test case to check: 559*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 560*795d594fSAndroid Build Coastguard Worker // 561*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem13(int, int) BCE (before) 562*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 563*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 564*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 565*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 566*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 567*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 568*795d594fSAndroid Build Coastguard Worker // 569*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem13(int, int) BCE (after) 570*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 571*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Shl 572*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 573*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 574*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 575*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem13(int v, int s)576*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem13(int v, int s) { 577*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 578*795d594fSAndroid Build Coastguard Worker if (v > 0) { 579*795d594fSAndroid Build Coastguard Worker int q = v / 10; 580*795d594fSAndroid Build Coastguard Worker int t = q << 31; 581*795d594fSAndroid Build Coastguard Worker int a = t - q; 582*795d594fSAndroid Build Coastguard Worker int b = v - a; 583*795d594fSAndroid Build Coastguard Worker return values[b]; 584*795d594fSAndroid Build Coastguard Worker } else { 585*795d594fSAndroid Build Coastguard Worker return -1; 586*795d594fSAndroid Build Coastguard Worker } 587*795d594fSAndroid Build Coastguard Worker } 588*795d594fSAndroid Build Coastguard Worker 589*795d594fSAndroid Build Coastguard Worker // A test case to check: 590*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 591*795d594fSAndroid Build Coastguard Worker // 592*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem14(int, int) BCE (before) 593*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 594*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 595*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 596*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 597*795d594fSAndroid Build Coastguard Worker // 598*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem14(int, int) BCE (after) 599*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 600*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 601*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 602*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem14(int v, int s)603*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem14(int v, int s) { 604*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 605*795d594fSAndroid Build Coastguard Worker if (v > 0) { 606*795d594fSAndroid Build Coastguard Worker int a = v / 10; 607*795d594fSAndroid Build Coastguard Worker int b = s - a; 608*795d594fSAndroid Build Coastguard Worker return values[b]; 609*795d594fSAndroid Build Coastguard Worker } else { 610*795d594fSAndroid Build Coastguard Worker return -1; 611*795d594fSAndroid Build Coastguard Worker } 612*795d594fSAndroid Build Coastguard Worker } 613*795d594fSAndroid Build Coastguard Worker 614*795d594fSAndroid Build Coastguard Worker // A test case to check: 615*795d594fSAndroid Build Coastguard Worker // Bounds checks are not eliminated if the checked value is not an optimized HDiv+HRem. 616*795d594fSAndroid Build Coastguard Worker // 617*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem15(int, int) BCE (before) 618*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 619*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 620*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 621*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 622*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 623*795d594fSAndroid Build Coastguard Worker // 624*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$NoRem15(int, int) BCE (after) 625*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 626*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Mul 627*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Sub 628*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: BoundsCheck 629*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet $noinline$NoRem15(int v, int s)630*795d594fSAndroid Build Coastguard Worker private static int $noinline$NoRem15(int v, int s) { 631*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2}; 632*795d594fSAndroid Build Coastguard Worker if (v > 0) { 633*795d594fSAndroid Build Coastguard Worker int q = v / 10; 634*795d594fSAndroid Build Coastguard Worker int a = q * 10; 635*795d594fSAndroid Build Coastguard Worker int b = s - a; 636*795d594fSAndroid Build Coastguard Worker return values[b]; 637*795d594fSAndroid Build Coastguard Worker } else { 638*795d594fSAndroid Build Coastguard Worker return -1; 639*795d594fSAndroid Build Coastguard Worker } 640*795d594fSAndroid Build Coastguard Worker } 641*795d594fSAndroid Build Coastguard Worker 642*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$noRemNonConst(int, int) BCE (after) 643*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck $noinline$noRemNonConst(int v, int s)644*795d594fSAndroid Build Coastguard Worker private static int $noinline$noRemNonConst(int v, int s) { 645*795d594fSAndroid Build Coastguard Worker // Regression test for compiler crash, b/169669115. 646*795d594fSAndroid Build Coastguard Worker int[] values = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 647*795d594fSAndroid Build Coastguard Worker if (v > 0) { 648*795d594fSAndroid Build Coastguard Worker int q = v / s; // Non-constant divisor. 649*795d594fSAndroid Build Coastguard Worker int a = q * 10; // Constant unrelated to the divisor above. 650*795d594fSAndroid Build Coastguard Worker int b = s - a; 651*795d594fSAndroid Build Coastguard Worker return values[b]; 652*795d594fSAndroid Build Coastguard Worker } else { 653*795d594fSAndroid Build Coastguard Worker return -1; 654*795d594fSAndroid Build Coastguard Worker } 655*795d594fSAndroid Build Coastguard Worker } 656*795d594fSAndroid Build Coastguard Worker main(String args[])657*795d594fSAndroid Build Coastguard Worker public static void main(String args[]) { 658*795d594fSAndroid Build Coastguard Worker remInt(); 659*795d594fSAndroid Build Coastguard Worker } 660*795d594fSAndroid Build Coastguard Worker } 661