xref: /aosp_15_r20/art/test/567-checker-builder-intrinsics/src/TestMinMax.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker /**
18*795d594fSAndroid Build Coastguard Worker  * Functional tests for detecting min/max.
19*795d594fSAndroid Build Coastguard Worker  */
20*795d594fSAndroid Build Coastguard Worker public class TestMinMax {
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker   //
23*795d594fSAndroid Build Coastguard Worker   // Direct intrinsics.
24*795d594fSAndroid Build Coastguard Worker   //
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minI(int) builder (after)
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>> ParameterValue
28*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Con:i\d+>> IntConstant 20
29*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>> Min [<<Par>>,<<Con>>]
30*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
31*795d594fSAndroid Build Coastguard Worker   //
32*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minI(int) builder (after)
33*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              InvokeStaticOrDirect
34*795d594fSAndroid Build Coastguard Worker   //
35*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestMinMax.minI(int) disassembly (after)
36*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              mov {{w\d+}}, #0x14
37*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  cmp {{w\d+}}, #0x14
38*795d594fSAndroid Build Coastguard Worker   //  Check that the constant generation was handled by VIXL.
39*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  mov w16, #0x14
40*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  csel {{w\d+}}, {{w\d+}}, w16, lt
minI(int a)41*795d594fSAndroid Build Coastguard Worker   public static int minI(int a) {
42*795d594fSAndroid Build Coastguard Worker     return Math.min(a, 20);
43*795d594fSAndroid Build Coastguard Worker   }
44*795d594fSAndroid Build Coastguard Worker 
45*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.minL(long) builder (after)
46*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:j\d+>> ParameterValue
47*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Con:j\d+>> LongConstant 20
48*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:j\d+>> Min [<<Par>>,<<Con>>]
49*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
50*795d594fSAndroid Build Coastguard Worker   //
51*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.minL(long) builder (after)
52*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              InvokeStaticOrDirect
53*795d594fSAndroid Build Coastguard Worker   //
54*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestMinMax.minL(long) disassembly (after)
55*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              mov {{x\d+}}, #0x14
56*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  cmp {{x\d+}}, #0x14
57*795d594fSAndroid Build Coastguard Worker   //  Check that the constant generation was handled by VIXL.
58*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  mov x16, #0x14
59*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  csel {{x\d+}}, {{x\d+}}, x16, lt
minL(long a)60*795d594fSAndroid Build Coastguard Worker   public static long minL(long a) {
61*795d594fSAndroid Build Coastguard Worker     return Math.min(a, 20L);
62*795d594fSAndroid Build Coastguard Worker   }
63*795d594fSAndroid Build Coastguard Worker 
64*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.maxI(int) builder (after)
65*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>> ParameterValue
66*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Con:i\d+>> IntConstant 20
67*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>> Max [<<Par>>,<<Con>>]
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
69*795d594fSAndroid Build Coastguard Worker   //
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.maxI(int) builder (after)
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              InvokeStaticOrDirect
72*795d594fSAndroid Build Coastguard Worker   //
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestMinMax.maxI(int) disassembly (after)
74*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              mov {{w\d+}}, #0x14
75*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  cmp {{w\d+}}, #0x14
76*795d594fSAndroid Build Coastguard Worker   //  Check that the constant generation was handled by VIXL.
77*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  mov w16, #0x14
78*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  csel {{w\d+}}, {{w\d+}}, w16, gt
maxI(int a)79*795d594fSAndroid Build Coastguard Worker   public static int maxI(int a) {
80*795d594fSAndroid Build Coastguard Worker     return Math.max(a, 20);
81*795d594fSAndroid Build Coastguard Worker   }
82*795d594fSAndroid Build Coastguard Worker 
83*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.maxL(long) builder (after)
84*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:j\d+>> ParameterValue
85*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Con:j\d+>> LongConstant 20
86*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:j\d+>> Max [<<Par>>,<<Con>>]
87*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
88*795d594fSAndroid Build Coastguard Worker   //
89*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.maxL(long) builder (after)
90*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              InvokeStaticOrDirect
91*795d594fSAndroid Build Coastguard Worker   //
92*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestMinMax.maxL(long) disassembly (after)
93*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              mov {{x\d+}}, #0x14
94*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  cmp {{x\d+}}, #0x14
95*795d594fSAndroid Build Coastguard Worker   //  Check that the constant generation was handled by VIXL.
96*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  mov x16, #0x14
97*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  csel {{x\d+}}, {{x\d+}}, x16, gt
maxL(long a)98*795d594fSAndroid Build Coastguard Worker   public static long maxL(long a) {
99*795d594fSAndroid Build Coastguard Worker     return Math.max(a, 20L);
100*795d594fSAndroid Build Coastguard Worker   }
101*795d594fSAndroid Build Coastguard Worker 
102*795d594fSAndroid Build Coastguard Worker   //
103*795d594fSAndroid Build Coastguard Worker   // Special Cases
104*795d594fSAndroid Build Coastguard Worker   //
105*795d594fSAndroid Build Coastguard Worker 
106*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestMinMax.minIntConstantZero(int) disassembly (after)
107*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{w\d+}}, #0x0
109*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{w\d+}}, #0x0 (0)
110*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csel {{w\d+}}, {{w\d+}}, wzr, lt
111*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
minIntConstantZero(int a)112*795d594fSAndroid Build Coastguard Worker   public static int minIntConstantZero(int a) {
113*795d594fSAndroid Build Coastguard Worker     return Math.min(a, 0);
114*795d594fSAndroid Build Coastguard Worker   }
115*795d594fSAndroid Build Coastguard Worker 
116*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestMinMax.minIntConstantOne(int) disassembly (after)
117*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
118*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{w\d+}}, #0x1
119*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{w\d+}}, #0x1 (1)
120*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csinc {{w\d+}}, {{w\d+}}, wzr, lt
121*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
minIntConstantOne(int a)122*795d594fSAndroid Build Coastguard Worker   public static int minIntConstantOne(int a) {
123*795d594fSAndroid Build Coastguard Worker     return Math.min(a, 1);
124*795d594fSAndroid Build Coastguard Worker   }
125*795d594fSAndroid Build Coastguard Worker 
126*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestMinMax.minIntConstantMinusOne(int) disassembly (after)
127*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
128*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{w\d+}}, #0xffffffff
129*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmn {{w\d+}}, #0x1 (1)
130*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csinv {{w\d+}}, {{w\d+}}, wzr, lt
131*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
minIntConstantMinusOne(int a)132*795d594fSAndroid Build Coastguard Worker   public static int minIntConstantMinusOne(int a) {
133*795d594fSAndroid Build Coastguard Worker     return Math.min(a, -1);
134*795d594fSAndroid Build Coastguard Worker   }
135*795d594fSAndroid Build Coastguard Worker 
136*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestMinMax.minLongConstantZero(long) disassembly (after)
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
138*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{x\d+}}, #0x0
139*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{x\d+}}, #0x0 (0)
140*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csel {{x\d+}}, {{x\d+}}, xzr, lt
141*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
minLongConstantZero(long a)142*795d594fSAndroid Build Coastguard Worker   public static long minLongConstantZero(long a) {
143*795d594fSAndroid Build Coastguard Worker     return Math.min(a, 0L);
144*795d594fSAndroid Build Coastguard Worker   }
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestMinMax.minLongConstantOne(long) disassembly (after)
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
148*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{x\d+}}, #0x1
149*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{x\d+}}, #0x1 (1)
150*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csinc {{x\d+}}, {{x\d+}}, xzr, lt
151*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
minLongConstantOne(long a)152*795d594fSAndroid Build Coastguard Worker   public static long minLongConstantOne(long a) {
153*795d594fSAndroid Build Coastguard Worker     return Math.min(a, 1L);
154*795d594fSAndroid Build Coastguard Worker   }
155*795d594fSAndroid Build Coastguard Worker 
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestMinMax.minLongConstantMinusOne(long) disassembly (after)
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
158*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{x\d+}}, #0xffffffffffffffff
159*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmn {{x\d+}}, #0x1 (1)
160*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csinv {{x\d+}}, {{x\d+}}, xzr, lt
161*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
minLongConstantMinusOne(long a)162*795d594fSAndroid Build Coastguard Worker   public static long minLongConstantMinusOne(long a) {
163*795d594fSAndroid Build Coastguard Worker     return Math.min(a, -1L);
164*795d594fSAndroid Build Coastguard Worker   }
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestMinMax.maxIntConstantZero(int) disassembly (after)
167*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
168*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{w\d+}}, #0x0
169*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{w\d+}}, #0x0 (0)
170*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csel {{w\d+}}, {{w\d+}}, wzr, gt
171*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
maxIntConstantZero(int a)172*795d594fSAndroid Build Coastguard Worker   public static int maxIntConstantZero(int a) {
173*795d594fSAndroid Build Coastguard Worker     return Math.max(a, 0);
174*795d594fSAndroid Build Coastguard Worker   }
175*795d594fSAndroid Build Coastguard Worker 
176*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestMinMax.maxIntConstantOne(int) disassembly (after)
177*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
178*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{w\d+}}, #0x1
179*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{w\d+}}, #0x1 (1)
180*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csinc {{w\d+}}, {{w\d+}}, wzr, gt
181*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
maxIntConstantOne(int a)182*795d594fSAndroid Build Coastguard Worker   public static int maxIntConstantOne(int a) {
183*795d594fSAndroid Build Coastguard Worker     return Math.max(a, 1);
184*795d594fSAndroid Build Coastguard Worker   }
185*795d594fSAndroid Build Coastguard Worker 
186*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestMinMax.maxIntConstantMinusOne(int) disassembly (after)
187*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
188*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{w\d+}}, #0xffffffff
189*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmn {{w\d+}}, #0x1 (1)
190*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csinv {{w\d+}}, {{w\d+}}, wzr, gt
191*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
maxIntConstantMinusOne(int a)192*795d594fSAndroid Build Coastguard Worker   public static int maxIntConstantMinusOne(int a) {
193*795d594fSAndroid Build Coastguard Worker     return Math.max(a, -1);
194*795d594fSAndroid Build Coastguard Worker   }
195*795d594fSAndroid Build Coastguard Worker 
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int TestMinMax.maxIntLargeConstant(int) disassembly (after)
197*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
198*795d594fSAndroid Build Coastguard Worker   /// CHECK:            mov {{w\d+}}, #0x2001
199*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{w\d+}}, {{w\d+}}
200*795d594fSAndroid Build Coastguard Worker   //  Check that constant generation was not handled by VIXL.
201*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{w\d+}}, #0x2001
202*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csel {{w\d+}}, {{w\d+}}, {{w\d+}}, gt
203*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
maxIntLargeConstant(int a)204*795d594fSAndroid Build Coastguard Worker   public static int maxIntLargeConstant(int a) {
205*795d594fSAndroid Build Coastguard Worker     return Math.max(a, 8193);
206*795d594fSAndroid Build Coastguard Worker   }
207*795d594fSAndroid Build Coastguard Worker 
208*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestMinMax.maxLongConstantZero(long) disassembly (after)
209*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
210*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{x\d+}}, #0x0
211*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{x\d+}}, #0x0 (0)
212*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csel {{x\d+}}, {{x\d+}}, xzr, gt
213*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
maxLongConstantZero(long a)214*795d594fSAndroid Build Coastguard Worker   public static long maxLongConstantZero(long a) {
215*795d594fSAndroid Build Coastguard Worker     return Math.max(a, 0L);
216*795d594fSAndroid Build Coastguard Worker   }
217*795d594fSAndroid Build Coastguard Worker 
218*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestMinMax.maxLongConstantOne(long) disassembly (after)
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{x\d+}}, #0x1
221*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{x\d+}}, #0x1 (1)
222*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csinc {{x\d+}}, {{x\d+}}, xzr, gt
223*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
maxLongConstantOne(long a)224*795d594fSAndroid Build Coastguard Worker   public static long maxLongConstantOne(long a) {
225*795d594fSAndroid Build Coastguard Worker     return Math.max(a, 1L);
226*795d594fSAndroid Build Coastguard Worker   }
227*795d594fSAndroid Build Coastguard Worker 
228*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestMinMax.maxLongConstantMinusOne(long) disassembly (after)
229*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
230*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{x\d+}}, #0xffffffffffffffff
231*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmn {{x\d+}}, #0x1 (1)
232*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csinv {{x\d+}}, {{x\d+}}, xzr, gt
233*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
maxLongConstantMinusOne(long a)234*795d594fSAndroid Build Coastguard Worker   public static long maxLongConstantMinusOne(long a) {
235*795d594fSAndroid Build Coastguard Worker     return Math.max(a, -1L);
236*795d594fSAndroid Build Coastguard Worker   }
237*795d594fSAndroid Build Coastguard Worker 
238*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long TestMinMax.maxLongLargeConstant(long) disassembly (after)
239*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        InvokeStaticOrDirect
240*795d594fSAndroid Build Coastguard Worker   /// CHECK:            mov {{x\d+}}, #0x2001
241*795d594fSAndroid Build Coastguard Worker   /// CHECK:            cmp {{x\d+}}, {{x\d+}}
242*795d594fSAndroid Build Coastguard Worker   //  Check that constant generation was not handled by VIXL.
243*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:        mov {{x\d+}}, #0x2001
244*795d594fSAndroid Build Coastguard Worker   /// CHECK:            csel {{x\d+}}, {{x\d+}}, {{x\d+}}, gt
245*795d594fSAndroid Build Coastguard Worker   /// CHECK:            ret
maxLongLargeConstant(long a)246*795d594fSAndroid Build Coastguard Worker   public static long maxLongLargeConstant(long a) {
247*795d594fSAndroid Build Coastguard Worker     return Math.max(a, 8193L);
248*795d594fSAndroid Build Coastguard Worker   }
249*795d594fSAndroid Build Coastguard Worker 
250*795d594fSAndroid Build Coastguard Worker   //
251*795d594fSAndroid Build Coastguard Worker   // Different types.
252*795d594fSAndroid Build Coastguard Worker   //
253*795d594fSAndroid Build Coastguard Worker 
254*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min1(int, int) instruction_simplifier$after_gvn (before)
255*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> GreaterThanOrEqual [<<Op1:i\d+>>,<<Op2:i\d+>>]
256*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>]
257*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
258*795d594fSAndroid Build Coastguard Worker   //
259*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min1(int, int) instruction_simplifier$after_gvn (after)
260*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>> Min
261*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
262*795d594fSAndroid Build Coastguard Worker   //
263*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min1(int, int) instruction_simplifier$after_gvn (after)
264*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
min1(int a, int b)265*795d594fSAndroid Build Coastguard Worker   public static int min1(int a, int b) {
266*795d594fSAndroid Build Coastguard Worker     return a < b ? a : b;
267*795d594fSAndroid Build Coastguard Worker   }
268*795d594fSAndroid Build Coastguard Worker 
269*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min2(int, int) instruction_simplifier$after_gvn (before)
270*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> GreaterThan [<<Op1:i\d+>>,<<Op2:i\d+>>]
271*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>]
272*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
273*795d594fSAndroid Build Coastguard Worker   //
274*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min2(int, int) instruction_simplifier$after_gvn (after)
275*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>> Min
276*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
277*795d594fSAndroid Build Coastguard Worker   //
278*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min2(int, int) instruction_simplifier$after_gvn (after)
279*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
min2(int a, int b)280*795d594fSAndroid Build Coastguard Worker   public static int min2(int a, int b) {
281*795d594fSAndroid Build Coastguard Worker     return a <= b ? a : b;
282*795d594fSAndroid Build Coastguard Worker   }
283*795d594fSAndroid Build Coastguard Worker 
284*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min3(int, int) instruction_simplifier$after_gvn (before)
285*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThanOrEqual [<<Op1:i\d+>>,<<Op2:i\d+>>]
286*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>]
287*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
288*795d594fSAndroid Build Coastguard Worker   //
289*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min3(int, int) instruction_simplifier$after_gvn (after)
290*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>> Min
291*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
292*795d594fSAndroid Build Coastguard Worker   //
293*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min3(int, int) instruction_simplifier$after_gvn (after)
294*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
min3(int a, int b)295*795d594fSAndroid Build Coastguard Worker   public static int min3(int a, int b) {
296*795d594fSAndroid Build Coastguard Worker     return a > b ? b : a;
297*795d594fSAndroid Build Coastguard Worker   }
298*795d594fSAndroid Build Coastguard Worker 
299*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min4(int, int) instruction_simplifier$after_gvn (before)
300*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:i\d+>>,<<Op2:i\d+>>]
301*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>]
302*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
303*795d594fSAndroid Build Coastguard Worker   //
304*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min4(int, int) instruction_simplifier$after_gvn (after)
305*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>> Min
306*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
307*795d594fSAndroid Build Coastguard Worker   //
308*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min4(int, int) instruction_simplifier$after_gvn (after)
309*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
min4(int a, int b)310*795d594fSAndroid Build Coastguard Worker   public static int min4(int a, int b) {
311*795d594fSAndroid Build Coastguard Worker     return a >= b ? b : a;
312*795d594fSAndroid Build Coastguard Worker   }
313*795d594fSAndroid Build Coastguard Worker 
314*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min5(short, short) instruction_simplifier$after_gvn (before)
315*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:s\d+>>,<<Op2:s\d+>>]
316*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>]
317*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
318*795d594fSAndroid Build Coastguard Worker   //
319*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min5(short, short) instruction_simplifier$after_gvn (after)
320*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>> Min
321*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
322*795d594fSAndroid Build Coastguard Worker   //
323*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min5(short, short) instruction_simplifier$after_gvn (after)
324*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
min5(short a, short b)325*795d594fSAndroid Build Coastguard Worker   public static int min5(short a, short b) {
326*795d594fSAndroid Build Coastguard Worker     return a >= b ? b : a;
327*795d594fSAndroid Build Coastguard Worker   }
328*795d594fSAndroid Build Coastguard Worker 
329*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min6(byte, byte) instruction_simplifier$after_gvn (before)
330*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:b\d+>>,<<Op2:b\d+>>]
331*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>]
332*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
333*795d594fSAndroid Build Coastguard Worker   //
334*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min6(byte, byte) instruction_simplifier$after_gvn (after)
335*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>> Min
336*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
337*795d594fSAndroid Build Coastguard Worker   //
338*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min6(byte, byte) instruction_simplifier$after_gvn (after)
339*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
min6(byte a, byte b)340*795d594fSAndroid Build Coastguard Worker   public static int min6(byte a, byte b) {
341*795d594fSAndroid Build Coastguard Worker     return a >= b ? b : a;
342*795d594fSAndroid Build Coastguard Worker   }
343*795d594fSAndroid Build Coastguard Worker 
344*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.min7(long, long) instruction_simplifier$after_gvn (before)
345*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:j\d+>>,<<Op2:j\d+>>]
346*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:j\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>]
347*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
348*795d594fSAndroid Build Coastguard Worker   //
349*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.min7(long, long) instruction_simplifier$after_gvn (after)
350*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:j\d+>> Min
351*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
352*795d594fSAndroid Build Coastguard Worker   //
353*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.min7(long, long) instruction_simplifier$after_gvn (after)
354*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
min7(long a, long b)355*795d594fSAndroid Build Coastguard Worker   public static long min7(long a, long b) {
356*795d594fSAndroid Build Coastguard Worker     return a >= b ? b : a;
357*795d594fSAndroid Build Coastguard Worker   }
358*795d594fSAndroid Build Coastguard Worker 
359*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max1(int, int) instruction_simplifier$after_gvn (before)
360*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> GreaterThanOrEqual [<<Op1:i\d+>>,<<Op2:i\d+>>]
361*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>]
362*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
363*795d594fSAndroid Build Coastguard Worker   //
364*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max1(int, int) instruction_simplifier$after_gvn (after)
365*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>> Max
366*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
367*795d594fSAndroid Build Coastguard Worker   //
368*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max1(int, int) instruction_simplifier$after_gvn (after)
369*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
max1(int a, int b)370*795d594fSAndroid Build Coastguard Worker   public static int max1(int a, int b) {
371*795d594fSAndroid Build Coastguard Worker     return a < b ? b : a;
372*795d594fSAndroid Build Coastguard Worker   }
373*795d594fSAndroid Build Coastguard Worker 
374*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max2(int, int) instruction_simplifier$after_gvn (before)
375*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> GreaterThan [<<Op1:i\d+>>,<<Op2:i\d+>>]
376*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>]
377*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
378*795d594fSAndroid Build Coastguard Worker   //
379*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max2(int, int) instruction_simplifier$after_gvn (after)
380*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>> Max
381*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
382*795d594fSAndroid Build Coastguard Worker   //
383*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max2(int, int) instruction_simplifier$after_gvn (after)
384*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
max2(int a, int b)385*795d594fSAndroid Build Coastguard Worker   public static int max2(int a, int b) {
386*795d594fSAndroid Build Coastguard Worker     return a <= b ? b : a;
387*795d594fSAndroid Build Coastguard Worker   }
388*795d594fSAndroid Build Coastguard Worker 
389*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max3(int, int) instruction_simplifier$after_gvn (before)
390*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThanOrEqual [<<Op1:i\d+>>,<<Op2:i\d+>>]
391*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>]
392*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
393*795d594fSAndroid Build Coastguard Worker   //
394*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max3(int, int) instruction_simplifier$after_gvn (after)
395*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>> Max
396*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
397*795d594fSAndroid Build Coastguard Worker   //
398*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max3(int, int) instruction_simplifier$after_gvn (after)
399*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
max3(int a, int b)400*795d594fSAndroid Build Coastguard Worker   public static int max3(int a, int b) {
401*795d594fSAndroid Build Coastguard Worker     return a > b ? a : b;
402*795d594fSAndroid Build Coastguard Worker   }
403*795d594fSAndroid Build Coastguard Worker 
404*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max4(int, int) instruction_simplifier$after_gvn (before)
405*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:i\d+>>,<<Op2:i\d+>>]
406*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>]
407*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
408*795d594fSAndroid Build Coastguard Worker   //
409*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max4(int, int) instruction_simplifier$after_gvn (after)
410*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>> Max
411*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
412*795d594fSAndroid Build Coastguard Worker   //
413*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max4(int, int) instruction_simplifier$after_gvn (after)
414*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
max4(int a, int b)415*795d594fSAndroid Build Coastguard Worker   public static int max4(int a, int b) {
416*795d594fSAndroid Build Coastguard Worker     return a >= b ? a : b;
417*795d594fSAndroid Build Coastguard Worker   }
418*795d594fSAndroid Build Coastguard Worker 
419*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max5(short, short) instruction_simplifier$after_gvn (before)
420*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:s\d+>>,<<Op2:s\d+>>]
421*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>]
422*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
423*795d594fSAndroid Build Coastguard Worker   //
424*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max5(short, short) instruction_simplifier$after_gvn (after)
425*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>> Max
426*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
427*795d594fSAndroid Build Coastguard Worker   //
428*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max5(short, short) instruction_simplifier$after_gvn (after)
429*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
max5(short a, short b)430*795d594fSAndroid Build Coastguard Worker   public static int max5(short a, short b) {
431*795d594fSAndroid Build Coastguard Worker     return a >= b ? a : b;
432*795d594fSAndroid Build Coastguard Worker   }
433*795d594fSAndroid Build Coastguard Worker 
434*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max6(byte, byte) instruction_simplifier$after_gvn (before)
435*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:b\d+>>,<<Op2:b\d+>>]
436*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>]
437*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
438*795d594fSAndroid Build Coastguard Worker   //
439*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max6(byte, byte) instruction_simplifier$after_gvn (after)
440*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>> Max
441*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
442*795d594fSAndroid Build Coastguard Worker   //
443*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max6(byte, byte) instruction_simplifier$after_gvn (after)
444*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
max6(byte a, byte b)445*795d594fSAndroid Build Coastguard Worker   public static int max6(byte a, byte b) {
446*795d594fSAndroid Build Coastguard Worker     return a >= b ? a : b;
447*795d594fSAndroid Build Coastguard Worker   }
448*795d594fSAndroid Build Coastguard Worker 
449*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.max7(long, long) instruction_simplifier$after_gvn (before)
450*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:j\d+>>,<<Op2:j\d+>>]
451*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:j\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>]
452*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
453*795d594fSAndroid Build Coastguard Worker   //
454*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.max7(long, long) instruction_simplifier$after_gvn (after)
455*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:j\d+>> Max
456*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
457*795d594fSAndroid Build Coastguard Worker   //
458*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long TestMinMax.max7(long, long) instruction_simplifier$after_gvn (after)
459*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
max7(long a, long b)460*795d594fSAndroid Build Coastguard Worker   public static long max7(long a, long b) {
461*795d594fSAndroid Build Coastguard Worker     return a >= b ? a : b;
462*795d594fSAndroid Build Coastguard Worker   }
463*795d594fSAndroid Build Coastguard Worker 
464*795d594fSAndroid Build Coastguard Worker   //
465*795d594fSAndroid Build Coastguard Worker   // Complications.
466*795d594fSAndroid Build Coastguard Worker   //
467*795d594fSAndroid Build Coastguard Worker 
468*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min0(int[], int[]) instruction_simplifier$after_gvn (before)
469*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Ar1:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}]
470*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Ar2:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}]
471*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> GreaterThan [<<Ar1>>,<<Ar2>>]
472*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Ar1>>,<<Ar2>>,<<Cnd>>]
473*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
474*795d594fSAndroid Build Coastguard Worker   //
475*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min0(int[], int[]) instruction_simplifier$after_gvn (after)
476*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>> Min
477*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Min>>]
478*795d594fSAndroid Build Coastguard Worker   //
479*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.min0(int[], int[]) instruction_simplifier$after_gvn (after)
480*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
min0(int[] a, int[] b)481*795d594fSAndroid Build Coastguard Worker   public static int min0(int[] a, int[] b) {
482*795d594fSAndroid Build Coastguard Worker     // Repeat of array references needs finding the common subexpressions
483*795d594fSAndroid Build Coastguard Worker     // prior to doing the select and min/max recognition.
484*795d594fSAndroid Build Coastguard Worker     return a[0] <= b[0] ? a[0] : b[0];
485*795d594fSAndroid Build Coastguard Worker   }
486*795d594fSAndroid Build Coastguard Worker 
487*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max0(int[], int[]) instruction_simplifier$after_gvn (before)
488*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Ar1:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}]
489*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Ar2:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}]
490*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Ar1>>,<<Ar2>>]
491*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel:i\d+>> Select [<<Ar1>>,<<Ar2>>,<<Cnd>>]
492*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Sel>>]
493*795d594fSAndroid Build Coastguard Worker   //
494*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max0(int[], int[]) instruction_simplifier$after_gvn (after)
495*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>> Max
496*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Max>>]
497*795d594fSAndroid Build Coastguard Worker   //
498*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.max0(int[], int[]) instruction_simplifier$after_gvn (after)
499*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              Select
max0(int[] a, int[] b)500*795d594fSAndroid Build Coastguard Worker   public static int max0(int[] a, int[] b) {
501*795d594fSAndroid Build Coastguard Worker     // Repeat of array references needs finding the common subexpressions
502*795d594fSAndroid Build Coastguard Worker     // prior to doing the select and min/max recognition.
503*795d594fSAndroid Build Coastguard Worker     return a[0] >= b[0] ? a[0] : b[0];
504*795d594fSAndroid Build Coastguard Worker   }
505*795d594fSAndroid Build Coastguard Worker 
506*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax1(int) instruction_simplifier$after_gvn (before)
507*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>>  ParameterValue
508*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<P100:i\d+>> IntConstant 100
509*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<M100:i\d+>> IntConstant -100
510*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual [<<Par>>,<<P100>>]
511*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel1:i\d+>> Select [<<P100>>,<<Par>>,<<Cnd1>>]
512*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Sel1>>,<<M100>>]
513*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel2:i\d+>> Select [<<M100>>,<<Sel1>>,<<Cnd2>>]
514*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Sel2>>]
515*795d594fSAndroid Build Coastguard Worker   //
516*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax1(int) instruction_simplifier$after_gvn (after)
517*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>>  ParameterValue
518*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<P100:i\d+>> IntConstant 100
519*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<M100:i\d+>> IntConstant -100
520*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>>  Min [<<Par>>,<<P100>>]
521*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>>  Max [<<Min>>,<<M100>>]
522*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Max>>]
523*795d594fSAndroid Build Coastguard Worker   //
524*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax1(int) instruction_simplifier$after_gvn (after)
525*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:               Select
minmax1(int x)526*795d594fSAndroid Build Coastguard Worker   public static int minmax1(int x) {
527*795d594fSAndroid Build Coastguard Worker     // Simple if-if gives clean select sequence.
528*795d594fSAndroid Build Coastguard Worker     if (x > 100) {
529*795d594fSAndroid Build Coastguard Worker       x = 100;
530*795d594fSAndroid Build Coastguard Worker     }
531*795d594fSAndroid Build Coastguard Worker     if (x < -100) {
532*795d594fSAndroid Build Coastguard Worker       x = -100;
533*795d594fSAndroid Build Coastguard Worker     }
534*795d594fSAndroid Build Coastguard Worker     return x;
535*795d594fSAndroid Build Coastguard Worker   }
536*795d594fSAndroid Build Coastguard Worker 
537*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax2(int) instruction_simplifier$after_gvn (before)
538*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>>  ParameterValue
539*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<P100:i\d+>> IntConstant 100
540*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<M100:i\d+>> IntConstant -100
541*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual [<<Par>>,<<P100>>]
542*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Par>>,<<M100>>]
543*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel1:i\d+>> Select [<<M100>>,<<Par>>,<<Cnd2>>]
544*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel2:i\d+>> Select [<<P100>>,<<Sel1>>,<<Cnd1>>]
545*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Sel2>>]
546*795d594fSAndroid Build Coastguard Worker   //
547*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax2(int) instruction_simplifier$after_gvn (after)
548*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>>  ParameterValue
549*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<P100:i\d+>> IntConstant 100
550*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<M100:i\d+>> IntConstant -100
551*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>>  Max [<<Par>>,<<M100>>]
552*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>>  Min [<<Max>>,<<P100>>]
553*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Min>>]
554*795d594fSAndroid Build Coastguard Worker   //
555*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax2(int) instruction_simplifier$after_gvn (after)
556*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:               Select
minmax2(int x)557*795d594fSAndroid Build Coastguard Worker   public static int minmax2(int x) {
558*795d594fSAndroid Build Coastguard Worker     // Simple if-else requires inspecting bounds of resulting selects.
559*795d594fSAndroid Build Coastguard Worker     if (x > 100) {
560*795d594fSAndroid Build Coastguard Worker       x = 100;
561*795d594fSAndroid Build Coastguard Worker     } else if (x < -100) {
562*795d594fSAndroid Build Coastguard Worker       x = -100;
563*795d594fSAndroid Build Coastguard Worker     }
564*795d594fSAndroid Build Coastguard Worker     return x;
565*795d594fSAndroid Build Coastguard Worker   }
566*795d594fSAndroid Build Coastguard Worker 
567*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax3(int) select_generator (after)
568*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>>  ParameterValue
569*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<P100:i\d+>> IntConstant 100
570*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<M100:i\d+>> IntConstant -100
571*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual [<<Par>>,<<P100>>]
572*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Par>>,<<M100>>]
573*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel1:i\d+>> Select [<<M100>>,<<Par>>,<<Cnd2>>]
574*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel2:i\d+>> Select [<<P100>>,<<Sel1>>,<<Cnd1>>]
575*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Sel2>>]
576*795d594fSAndroid Build Coastguard Worker 
577*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax3(int) instruction_simplifier$after_gvn (after)
578*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>>  ParameterValue
579*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<P100:i\d+>> IntConstant 100
580*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<M100:i\d+>> IntConstant -100
581*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>>  Max [<<Par>>,<<M100>>]
582*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>>  Min [<<Max>>,<<P100>>]
583*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Min>>]
584*795d594fSAndroid Build Coastguard Worker   //
585*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax3(int) instruction_simplifier$after_gvn (after)
586*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:               Select
minmax3(int x)587*795d594fSAndroid Build Coastguard Worker   public static int minmax3(int x) {
588*795d594fSAndroid Build Coastguard Worker     return (x > 100) ? 100 : ((x < -100) ? -100 : x);
589*795d594fSAndroid Build Coastguard Worker   }
590*795d594fSAndroid Build Coastguard Worker 
591*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax4(int) select_generator (after)
592*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>>  ParameterValue
593*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<P100:i\d+>> IntConstant 100
594*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<M100:i\d+>> IntConstant -100
595*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd1:z\d+>> GreaterThanOrEqual [<<Par>>,<<M100>>]
596*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd2:z\d+>> LessThanOrEqual [<<Par>>,<<P100>>]
597*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel1:i\d+>> Select [<<P100>>,<<Par>>,<<Cnd2>>]
598*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel2:i\d+>> Select [<<M100>>,<<Sel1>>,<<Cnd1>>]
599*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Sel2>>]
600*795d594fSAndroid Build Coastguard Worker 
601*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax4(int) instruction_simplifier$after_gvn (after)
602*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>>  ParameterValue
603*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<P100:i\d+>> IntConstant 100
604*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<M100:i\d+>> IntConstant -100
605*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>>  Min [<<Par>>,<<P100>>]
606*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>>  Max [<<Min>>,<<M100>>]
607*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Max>>]
608*795d594fSAndroid Build Coastguard Worker   //
609*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmax4(int) instruction_simplifier$after_gvn (after)
610*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:               Select
minmax4(int x)611*795d594fSAndroid Build Coastguard Worker   public static int minmax4(int x) {
612*795d594fSAndroid Build Coastguard Worker     return (x < -100) ? -100 : ((x > 100) ? 100 : x);
613*795d594fSAndroid Build Coastguard Worker   }
614*795d594fSAndroid Build Coastguard Worker 
615*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmaxCSEScalar(int, int) select_generator (after)
616*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par1:i\d+>> ParameterValue
617*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par2:i\d+>> ParameterValue
618*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual    [<<Par1>>,<<Par2>>]
619*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel1:i\d+>> Select             [<<Par1>>,<<Par2>>,<<Cnd1>>]
620*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Par1>>,<<Par2>>]
621*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel2:i\d+>> Select             [<<Par1>>,<<Par2>>,<<Cnd2>>]
622*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add1:i\d+>> Add                [<<Sel1>>,<<Sel2>>]
623*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add2:i\d+>> Add                [<<Sel1>>,<<Add1>>]
624*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add3:i\d+>> Add                [<<Sel2>>,<<Add2>>]
625*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add4:i\d+>> Add                [<<Sel1>>,<<Add3>>]
626*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add5:i\d+>> Add                [<<Sel2>>,<<Add4>>]
627*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return             [<<Add5>>]
628*795d594fSAndroid Build Coastguard Worker   //
629*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmaxCSEScalar(int, int) instruction_simplifier$after_gvn (after)
630*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par1:i\d+>> ParameterValue
631*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par2:i\d+>> ParameterValue
632*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>>  Max    [<<Par1>>,<<Par2>>]
633*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>>  Min    [<<Par1>>,<<Par2>>]
634*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add1:i\d+>> Add    [<<Max>>,<<Min>>]
635*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add2:i\d+>> Add    [<<Max>>,<<Add1>>]
636*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add3:i\d+>> Add    [<<Min>>,<<Add2>>]
637*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add4:i\d+>> Add    [<<Max>>,<<Add3>>]
638*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add5:i\d+>> Add    [<<Min>>,<<Add4>>]
639*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Add5>>]
minmaxCSEScalar(int x, int y)640*795d594fSAndroid Build Coastguard Worker   public static int minmaxCSEScalar(int x, int y) {
641*795d594fSAndroid Build Coastguard Worker     int t1 = (x > y) ? x : y;
642*795d594fSAndroid Build Coastguard Worker     int t2 = (x < y) ? x : y;
643*795d594fSAndroid Build Coastguard Worker     int t3 = (x > y) ? x : y;
644*795d594fSAndroid Build Coastguard Worker     int t4 = (x < y) ? x : y;
645*795d594fSAndroid Build Coastguard Worker     int t5 = (x > y) ? x : y;
646*795d594fSAndroid Build Coastguard Worker     int t6 = (x < y) ? x : y;
647*795d594fSAndroid Build Coastguard Worker     // Make sure min/max is CSEed.
648*795d594fSAndroid Build Coastguard Worker     return t1 + t2 + t3 + t4 + t5 + t6;
649*795d594fSAndroid Build Coastguard Worker   }
650*795d594fSAndroid Build Coastguard Worker 
651*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmaxCSEArray(int[], int[]) select_generator (after)
652*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Arr1:i\d+>> ArrayGet
653*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Arr2:i\d+>> ArrayGet
654*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual    [<<Arr1>>,<<Arr2>>]
655*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel1:i\d+>> Select             [<<Arr1>>,<<Arr2>>,<<Cnd1>>]
656*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Arr1>>,<<Arr2>>]
657*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sel2:i\d+>> Select             [<<Arr1>>,<<Arr2>>,<<Cnd2>>]
658*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add1:i\d+>> Add                [<<Sel1>>,<<Sel2>>]
659*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add2:i\d+>> Add                [<<Sel1>>,<<Add1>>]
660*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add3:i\d+>> Add                [<<Sel2>>,<<Add2>>]
661*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add4:i\d+>> Add                [<<Sel1>>,<<Add3>>]
662*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add5:i\d+>> Add                [<<Sel2>>,<<Add4>>]
663*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return             [<<Add5>>]
664*795d594fSAndroid Build Coastguard Worker   //
665*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmaxCSEArray(int[], int[]) instruction_simplifier$after_gvn (after)
666*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Arr1:i\d+>> ArrayGet
667*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Arr2:i\d+>> ArrayGet
668*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>>  Max    [<<Arr1>>,<<Arr2>>]
669*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>>  Min    [<<Arr1>>,<<Arr2>>]
670*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add1:i\d+>> Add    [<<Max>>,<<Min>>]
671*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add2:i\d+>> Add    [<<Max>>,<<Add1>>]
672*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add3:i\d+>> Add    [<<Min>>,<<Add2>>]
673*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add4:i\d+>> Add    [<<Max>>,<<Add3>>]
674*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add5:i\d+>> Add    [<<Min>>,<<Add4>>]
675*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Add5>>]
minmaxCSEArray(int[] x, int[] y)676*795d594fSAndroid Build Coastguard Worker   public static int minmaxCSEArray(int[] x, int[] y) {
677*795d594fSAndroid Build Coastguard Worker     int t1 = (x[0] > y[0]) ? x[0] : y[0];
678*795d594fSAndroid Build Coastguard Worker     int t2 = (x[0] < y[0]) ? x[0] : y[0];
679*795d594fSAndroid Build Coastguard Worker     int t3 = (x[0] > y[0]) ? x[0] : y[0];
680*795d594fSAndroid Build Coastguard Worker     int t4 = (x[0] < y[0]) ? x[0] : y[0];
681*795d594fSAndroid Build Coastguard Worker     int t5 = (x[0] > y[0]) ? x[0] : y[0];
682*795d594fSAndroid Build Coastguard Worker     int t6 = (x[0] < y[0]) ? x[0] : y[0];
683*795d594fSAndroid Build Coastguard Worker     // Make sure min/max is CSEed.
684*795d594fSAndroid Build Coastguard Worker     return t1 + t2 + t3 + t4 + t5 + t6;
685*795d594fSAndroid Build Coastguard Worker   }
686*795d594fSAndroid Build Coastguard Worker 
687*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int TestMinMax.minmaxCSEScalarAndCond(int, int) instruction_simplifier$after_gvn (after)
688*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par1:i\d+>> ParameterValue
689*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par2:i\d+>> ParameterValue
690*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Max:i\d+>>  Max    [<<Par1>>,<<Par2>>]
691*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Min:i\d+>>  Min    [<<Par1>>,<<Par2>>]
692*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>  Add    [<<Max>>,<<Min>>]
693*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Add>>]
694*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add1:i\d+>> Add    [<<Max>>,<<Min>>]
695*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add2:i\d+>> Add    [<<Max>>,<<Add1>>]
696*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add3:i\d+>> Add    [<<Min>>,<<Add2>>]
697*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Add3>>]
minmaxCSEScalarAndCond(int x, int y)698*795d594fSAndroid Build Coastguard Worker   public static int minmaxCSEScalarAndCond(int x, int y) {
699*795d594fSAndroid Build Coastguard Worker     int t1 = (x > y) ? x : y;
700*795d594fSAndroid Build Coastguard Worker     int t2 = (x < y) ? x : y;
701*795d594fSAndroid Build Coastguard Worker     if (x == y)
702*795d594fSAndroid Build Coastguard Worker       return t1 + t2;
703*795d594fSAndroid Build Coastguard Worker     int t3 = (x > y) ? x : y;
704*795d594fSAndroid Build Coastguard Worker     int t4 = (x < y) ? x : y;
705*795d594fSAndroid Build Coastguard Worker     // Make sure min/max is CSEed.
706*795d594fSAndroid Build Coastguard Worker     return t1 + t2 + t3 + t4;
707*795d594fSAndroid Build Coastguard Worker   }
708*795d594fSAndroid Build Coastguard Worker 
main()709*795d594fSAndroid Build Coastguard Worker   public static void main() {
710*795d594fSAndroid Build Coastguard Worker     // Intrinsics.
711*795d594fSAndroid Build Coastguard Worker     expectEquals(10, minI(10));
712*795d594fSAndroid Build Coastguard Worker     expectEquals(20, minI(25));
713*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, minIntConstantZero(-1));
714*795d594fSAndroid Build Coastguard Worker     expectEquals(0, minIntConstantZero(1));
715*795d594fSAndroid Build Coastguard Worker     expectEquals(0, minIntConstantOne(0));
716*795d594fSAndroid Build Coastguard Worker     expectEquals(1, minIntConstantOne(2));
717*795d594fSAndroid Build Coastguard Worker     expectEquals(-2, minIntConstantMinusOne(-2));
718*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, minIntConstantMinusOne(0));
719*795d594fSAndroid Build Coastguard Worker     expectEquals(10L, minL(10L));
720*795d594fSAndroid Build Coastguard Worker     expectEquals(20L, minL(25L));
721*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, minLongConstantZero(-1L));
722*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, minLongConstantZero(1L));
723*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, minLongConstantOne(0L));
724*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, minLongConstantOne(2L));
725*795d594fSAndroid Build Coastguard Worker     expectEquals(-2L, minLongConstantMinusOne(-2L));
726*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, minLongConstantMinusOne(0L));
727*795d594fSAndroid Build Coastguard Worker     expectEquals(20, maxI(10));
728*795d594fSAndroid Build Coastguard Worker     expectEquals(25, maxI(25));
729*795d594fSAndroid Build Coastguard Worker     expectEquals(0, maxIntConstantZero(-1));
730*795d594fSAndroid Build Coastguard Worker     expectEquals(1, maxIntConstantZero(1));
731*795d594fSAndroid Build Coastguard Worker     expectEquals(1, maxIntConstantOne(0));
732*795d594fSAndroid Build Coastguard Worker     expectEquals(2, maxIntConstantOne(2));
733*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, maxIntConstantMinusOne(-2));
734*795d594fSAndroid Build Coastguard Worker     expectEquals(0, maxIntConstantMinusOne(0));
735*795d594fSAndroid Build Coastguard Worker     expectEquals(8193, maxIntLargeConstant(8192));
736*795d594fSAndroid Build Coastguard Worker     expectEquals(9000, maxIntLargeConstant(9000));
737*795d594fSAndroid Build Coastguard Worker     expectEquals(20L, maxL(10L));
738*795d594fSAndroid Build Coastguard Worker     expectEquals(25L, maxL(25L));
739*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, maxLongConstantZero(-1L));
740*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, maxLongConstantZero(1L));
741*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, maxLongConstantOne(0L));
742*795d594fSAndroid Build Coastguard Worker     expectEquals(2L, maxLongConstantOne(2L));
743*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, maxLongConstantMinusOne(-2L));
744*795d594fSAndroid Build Coastguard Worker     expectEquals(0L, maxLongConstantMinusOne(0L));
745*795d594fSAndroid Build Coastguard Worker     expectEquals(8193L, maxLongLargeConstant(8192L));
746*795d594fSAndroid Build Coastguard Worker     expectEquals(9000L, maxLongLargeConstant(9000L));
747*795d594fSAndroid Build Coastguard Worker     // Types.
748*795d594fSAndroid Build Coastguard Worker     expectEquals(10, min1(10, 20));
749*795d594fSAndroid Build Coastguard Worker     expectEquals(10, min2(10, 20));
750*795d594fSAndroid Build Coastguard Worker     expectEquals(10, min3(10, 20));
751*795d594fSAndroid Build Coastguard Worker     expectEquals(10, min4(10, 20));
752*795d594fSAndroid Build Coastguard Worker     expectEquals(10, min5((short) 10, (short) 20));
753*795d594fSAndroid Build Coastguard Worker     expectEquals(10, min6((byte) 10, (byte) 20));
754*795d594fSAndroid Build Coastguard Worker     expectEquals(10L, min7(10L, 20L));
755*795d594fSAndroid Build Coastguard Worker     expectEquals(20, max1(10, 20));
756*795d594fSAndroid Build Coastguard Worker     expectEquals(20, max2(10, 20));
757*795d594fSAndroid Build Coastguard Worker     expectEquals(20, max3(10, 20));
758*795d594fSAndroid Build Coastguard Worker     expectEquals(20, max4(10, 20));
759*795d594fSAndroid Build Coastguard Worker     expectEquals(20, max5((short) 10, (short) 20));
760*795d594fSAndroid Build Coastguard Worker     expectEquals(20, max6((byte) 10, (byte) 20));
761*795d594fSAndroid Build Coastguard Worker     expectEquals(20L, max7(10L, 20L));
762*795d594fSAndroid Build Coastguard Worker     // Complications.
763*795d594fSAndroid Build Coastguard Worker     int[] a = { 10 };
764*795d594fSAndroid Build Coastguard Worker     int[] b = { 20 };
765*795d594fSAndroid Build Coastguard Worker     expectEquals(10, min0(a, b));
766*795d594fSAndroid Build Coastguard Worker     expectEquals(20, max0(a, b));
767*795d594fSAndroid Build Coastguard Worker     expectEquals(-100, minmax1(-200));
768*795d594fSAndroid Build Coastguard Worker     expectEquals(10, minmax1(10));
769*795d594fSAndroid Build Coastguard Worker     expectEquals(100, minmax1(200));
770*795d594fSAndroid Build Coastguard Worker     expectEquals(-100, minmax2(-200));
771*795d594fSAndroid Build Coastguard Worker     expectEquals(10, minmax2(10));
772*795d594fSAndroid Build Coastguard Worker     expectEquals(100, minmax2(200));
773*795d594fSAndroid Build Coastguard Worker     expectEquals(-100, minmax3(-200));
774*795d594fSAndroid Build Coastguard Worker     expectEquals(10, minmax3(10));
775*795d594fSAndroid Build Coastguard Worker     expectEquals(100, minmax3(200));
776*795d594fSAndroid Build Coastguard Worker     expectEquals(-100, minmax4(-200));
777*795d594fSAndroid Build Coastguard Worker     expectEquals(10, minmax4(10));
778*795d594fSAndroid Build Coastguard Worker     expectEquals(100, minmax4(200));
779*795d594fSAndroid Build Coastguard Worker     expectEquals(90, minmaxCSEScalar(10, 20));
780*795d594fSAndroid Build Coastguard Worker     expectEquals(90, minmaxCSEArray(a, b));
781*795d594fSAndroid Build Coastguard Worker     expectEquals(20, minmaxCSEScalarAndCond(10, 10));
782*795d594fSAndroid Build Coastguard Worker     expectEquals(60, minmaxCSEScalarAndCond(10, 20));
783*795d594fSAndroid Build Coastguard Worker     System.out.println("TestMinMax passed");
784*795d594fSAndroid Build Coastguard Worker   }
785*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)786*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(int expected, int result) {
787*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
788*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
789*795d594fSAndroid Build Coastguard Worker     }
790*795d594fSAndroid Build Coastguard Worker   }
791*795d594fSAndroid Build Coastguard Worker 
expectEquals(long expected, long result)792*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(long expected, long result) {
793*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
794*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
795*795d594fSAndroid Build Coastguard Worker     }
796*795d594fSAndroid Build Coastguard Worker   }
797*795d594fSAndroid Build Coastguard Worker }
798