xref: /aosp_15_r20/art/test/449-checker-bce-rem/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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