xref: /aosp_15_r20/art/test/640-checker-integer-valueof/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker public class Main {
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: java.lang.Integer Main.foo(int) disassembly (after)
20*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Integer:l\d+>>     InvokeStaticOrDirect method_name:java.lang.Integer.valueOf intrinsic:IntegerValueOf
21*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      pAllocObjectInitialized
22*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Integer>>]
foo(int a)23*795d594fSAndroid Build Coastguard Worker   public static Integer foo(int a) {
24*795d594fSAndroid Build Coastguard Worker     return Integer.valueOf(a);
25*795d594fSAndroid Build Coastguard Worker   }
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: java.lang.Integer Main.foo2() disassembly (after)
28*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Integer:l\d+>>     InvokeStaticOrDirect method_name:java.lang.Integer.valueOf intrinsic:IntegerValueOf
29*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  pAllocObjectInitialized
30*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Integer>>]
foo2()31*795d594fSAndroid Build Coastguard Worker   public static Integer foo2() {
32*795d594fSAndroid Build Coastguard Worker     return Integer.valueOf(-42);
33*795d594fSAndroid Build Coastguard Worker   }
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: java.lang.Integer Main.foo3() disassembly (after)
36*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Integer:l\d+>>     InvokeStaticOrDirect method_name:java.lang.Integer.valueOf intrinsic:IntegerValueOf
37*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  pAllocObjectInitialized
38*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Integer>>]
foo3()39*795d594fSAndroid Build Coastguard Worker   public static Integer foo3() {
40*795d594fSAndroid Build Coastguard Worker     return Integer.valueOf(42);
41*795d594fSAndroid Build Coastguard Worker   }
42*795d594fSAndroid Build Coastguard Worker 
43*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: java.lang.Integer Main.foo4() disassembly (after)
44*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Integer:l\d+>>     InvokeStaticOrDirect method_name:java.lang.Integer.valueOf intrinsic:IntegerValueOf
45*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      pAllocObjectInitialized
46*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Integer>>]
foo4()47*795d594fSAndroid Build Coastguard Worker   public static Integer foo4() {
48*795d594fSAndroid Build Coastguard Worker     return Integer.valueOf(55555);
49*795d594fSAndroid Build Coastguard Worker   }
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: byte Main.$noinline$boxUnboxByte(byte) builder (after)
52*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:b\d+>>       ParameterValue
53*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Boxed:l\d+>>       InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf
54*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  NullCheck [<<Boxed>>]
55*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Unboxed:b\d+>>     InvokeVirtual [<<Boxed>>] method_name:java.lang.Byte.byteValue
56*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Unboxed>>]
57*795d594fSAndroid Build Coastguard Worker 
58*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: byte Main.$noinline$boxUnboxByte(byte) inliner (after)
59*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:b\d+>>       ParameterValue
60*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Boxed:l\d+>>       InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf
61*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Unboxed:b\d+>>     InstanceFieldGet [<<Boxed>>] field_name:java.lang.Byte.value
62*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Unboxed>>]
63*795d594fSAndroid Build Coastguard Worker 
64*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: byte Main.$noinline$boxUnboxByte(byte) instruction_simplifier$after_inlining (after)
65*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:b\d+>>       ParameterValue
66*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Input>>]
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: byte Main.$noinline$boxUnboxByte(byte) dead_code_elimination$after_inlining (after)
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InvokeStaticOrDirect
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InstanceFieldGet
71*795d594fSAndroid Build Coastguard Worker 
$noinline$boxUnboxByte(byte value)72*795d594fSAndroid Build Coastguard Worker   public static byte $noinline$boxUnboxByte(byte value) {
73*795d594fSAndroid Build Coastguard Worker     return Byte.valueOf(value).byteValue();
74*795d594fSAndroid Build Coastguard Worker   }
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: short Main.$noinline$boxUnboxShort(short) builder (after)
77*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:s\d+>>       ParameterValue
78*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Boxed:l\d+>>       InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Short.valueOf intrinsic:ShortValueOf
79*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  NullCheck [<<Boxed>>]
80*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Unboxed:s\d+>>     InvokeVirtual [<<Boxed>>] method_name:java.lang.Short.shortValue
81*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Unboxed>>]
82*795d594fSAndroid Build Coastguard Worker 
83*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: short Main.$noinline$boxUnboxShort(short) inliner (after)
84*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:s\d+>>       ParameterValue
85*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Boxed:l\d+>>       InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Short.valueOf intrinsic:ShortValueOf
86*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Unboxed:s\d+>>     InstanceFieldGet [<<Boxed>>] field_name:java.lang.Short.value
87*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Unboxed>>]
88*795d594fSAndroid Build Coastguard Worker 
89*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: short Main.$noinline$boxUnboxShort(short) instruction_simplifier$after_inlining (after)
90*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:s\d+>>       ParameterValue
91*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Input>>]
92*795d594fSAndroid Build Coastguard Worker 
93*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: short Main.$noinline$boxUnboxShort(short) dead_code_elimination$after_inlining (after)
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InvokeStaticOrDirect
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InstanceFieldGet
96*795d594fSAndroid Build Coastguard Worker 
$noinline$boxUnboxShort(short value)97*795d594fSAndroid Build Coastguard Worker   public static short $noinline$boxUnboxShort(short value) {
98*795d594fSAndroid Build Coastguard Worker     return Short.valueOf(value).shortValue();
99*795d594fSAndroid Build Coastguard Worker   }
100*795d594fSAndroid Build Coastguard Worker 
101*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: char Main.$noinline$boxUnboxCharacter(char) builder (after)
102*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:c\d+>>       ParameterValue
103*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Boxed:l\d+>>       InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Character.valueOf intrinsic:CharacterValueOf
104*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  NullCheck [<<Boxed>>]
105*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Unboxed:c\d+>>     InvokeVirtual [<<Boxed>>] method_name:java.lang.Character.charValue
106*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Unboxed>>]
107*795d594fSAndroid Build Coastguard Worker 
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: char Main.$noinline$boxUnboxCharacter(char) inliner (after)
109*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:c\d+>>       ParameterValue
110*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Boxed:l\d+>>       InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Character.valueOf intrinsic:CharacterValueOf
111*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Unboxed:c\d+>>     InstanceFieldGet [<<Boxed>>] field_name:java.lang.Character.value
112*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Unboxed>>]
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: char Main.$noinline$boxUnboxCharacter(char) instruction_simplifier$after_inlining (after)
115*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:c\d+>>       ParameterValue
116*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Input>>]
117*795d594fSAndroid Build Coastguard Worker 
118*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: char Main.$noinline$boxUnboxCharacter(char) dead_code_elimination$after_inlining (after)
119*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InvokeStaticOrDirect
120*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InstanceFieldGet
121*795d594fSAndroid Build Coastguard Worker 
$noinline$boxUnboxCharacter(char value)122*795d594fSAndroid Build Coastguard Worker   public static char $noinline$boxUnboxCharacter(char value) {
123*795d594fSAndroid Build Coastguard Worker     return Character.valueOf(value).charValue();
124*795d594fSAndroid Build Coastguard Worker   }
125*795d594fSAndroid Build Coastguard Worker 
126*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxInteger(int) builder (after)
127*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:i\d+>>       ParameterValue
128*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Boxed:l\d+>>       InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Integer.valueOf intrinsic:IntegerValueOf
129*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  NullCheck [<<Boxed>>]
130*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Unboxed:i\d+>>     InvokeVirtual [<<Boxed>>] method_name:java.lang.Integer.intValue
131*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Unboxed>>]
132*795d594fSAndroid Build Coastguard Worker 
133*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxInteger(int) inliner (after)
134*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:i\d+>>       ParameterValue
135*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Boxed:l\d+>>       InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Integer.valueOf intrinsic:IntegerValueOf
136*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Unboxed:i\d+>>     InstanceFieldGet [<<Boxed>>] field_name:java.lang.Integer.value
137*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Unboxed>>]
138*795d594fSAndroid Build Coastguard Worker 
139*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxInteger(int) instruction_simplifier$after_inlining (after)
140*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Input:i\d+>>       ParameterValue
141*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Return [<<Input>>]
142*795d594fSAndroid Build Coastguard Worker 
143*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxInteger(int) dead_code_elimination$after_inlining (after)
144*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InvokeStaticOrDirect
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InstanceFieldGet
146*795d594fSAndroid Build Coastguard Worker 
$noinline$boxUnboxInteger(int value)147*795d594fSAndroid Build Coastguard Worker   public static int $noinline$boxUnboxInteger(int value) {
148*795d594fSAndroid Build Coastguard Worker     return Integer.valueOf(value).intValue();
149*795d594fSAndroid Build Coastguard Worker   }
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) builder (after)
152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Input:b\d+>>   ParameterValue
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Boxed:l\d+>>   InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf
154*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:l\d+>>     Phi
155*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NC:l\d+>>      NullCheck [<<Phi>>]
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Unboxed:b\d+>> InvokeVirtual [<<NC>>] method_name:java.lang.Byte.byteValue
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<And:i\d+>>     And
158*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<And>>]
159*795d594fSAndroid Build Coastguard Worker 
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) instruction_simplifier (after)
161*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Input:b\d+>>   ParameterValue
162*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Boxed:l\d+>>   InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf
163*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:l\d+>>     Phi
164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NC:l\d+>>      NullCheck [<<Phi>>]
165*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Unboxed:b\d+>> InvokeVirtual [<<NC>>] method_name:java.lang.Byte.byteValue
166*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:a\d+>>    TypeConversion [<<Unboxed>>]
167*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<Conv>>]
168*795d594fSAndroid Build Coastguard Worker 
169*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) inliner (after)
170*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Input:b\d+>>   ParameterValue
171*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Boxed:l\d+>>   InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf
172*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:l\d+>>     Phi
173*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NC:l\d+>>      NullCheck [<<Phi>>]
174*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Unboxed:b\d+>> InstanceFieldGet [<<NC>>] field_name:java.lang.Byte.value
175*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:a\d+>>    TypeConversion [<<Unboxed>>]
176*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<Conv>>]
177*795d594fSAndroid Build Coastguard Worker 
178*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) instruction_simplifier$after_inlining (after)
179*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Input:b\d+>>   ParameterValue
180*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Boxed:l\d+>>   InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf
181*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:l\d+>>     Phi
182*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NC:l\d+>>      NullCheck [<<Phi>>]
183*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:a\d+>>    InstanceFieldGet [<<NC>>] field_name:java.lang.Byte.value
184*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<Conv>>]
185*795d594fSAndroid Build Coastguard Worker 
186*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) dead_code_elimination$after_inlining (after)
187*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Input:b\d+>>   ParameterValue
188*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Boxed:l\d+>>   InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf
189*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NC:l\d+>>      NullCheck [<<Boxed>>]
190*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:a\d+>>    InstanceFieldGet [<<NC>>] field_name:java.lang.Byte.value
191*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<Conv>>]
192*795d594fSAndroid Build Coastguard Worker 
193*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) instruction_simplifier$after_gvn (after)
194*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Input:b\d+>>   ParameterValue
195*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Boxed:l\d+>>   InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:a\d+>>    InstanceFieldGet [<<Boxed>>] field_name:java.lang.Byte.value
197*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<Conv>>]
198*795d594fSAndroid Build Coastguard Worker 
199*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) disassembly (after)
200*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Input:b\d+>>   ParameterValue
201*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Boxed:l\d+>>   InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf
202*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:a\d+>>    InstanceFieldGet [<<Boxed>>] field_name:java.lang.Byte.value
203*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<Conv>>]
204*795d594fSAndroid Build Coastguard Worker 
$noinline$boxUnboxByteAsUint8(byte value)205*795d594fSAndroid Build Coastguard Worker   public static int $noinline$boxUnboxByteAsUint8(byte value) {
206*795d594fSAndroid Build Coastguard Worker     Byte boxed = Byte.valueOf(value);
207*795d594fSAndroid Build Coastguard Worker 
208*795d594fSAndroid Build Coastguard Worker     // Hide the unboxing from the initial instruction simplifier pass or the one after inlining,
209*795d594fSAndroid Build Coastguard Worker     // so that after inlining we can merge the `TypeConversion` into `InstanceFieldGet` with
210*795d594fSAndroid Build Coastguard Worker     // a modified type. The Phi shall be eliminated by `dead_code_elimination$after_inlining`.
211*795d594fSAndroid Build Coastguard Worker     // The null check that shall be eliminated by `instruction_simplifier$after_gvn (after)`
212*795d594fSAndroid Build Coastguard Worker     Byte merged = $inline$returnTrue() ? boxed : null;
213*795d594fSAndroid Build Coastguard Worker 
214*795d594fSAndroid Build Coastguard Worker     // Due to the type mismatch, we shall not simplify the unboxing. The boxing and unboxing
215*795d594fSAndroid Build Coastguard Worker     // shall be kept during subsequent simplifier passes all the way to the disassembly.
216*795d594fSAndroid Build Coastguard Worker     return merged.byteValue() & 0xff;
217*795d594fSAndroid Build Coastguard Worker   }
218*795d594fSAndroid Build Coastguard Worker 
$inline$returnTrue()219*795d594fSAndroid Build Coastguard Worker   public static boolean $inline$returnTrue() {
220*795d594fSAndroid Build Coastguard Worker     return true;
221*795d594fSAndroid Build Coastguard Worker   }
222*795d594fSAndroid Build Coastguard Worker 
main(String[] args)223*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
224*795d594fSAndroid Build Coastguard Worker     assertEqual("42", foo(intField));
225*795d594fSAndroid Build Coastguard Worker     assertEqual(foo(intField), foo(intField2));
226*795d594fSAndroid Build Coastguard Worker     assertEqual("-42", foo2());
227*795d594fSAndroid Build Coastguard Worker     assertEqual("42", foo3());
228*795d594fSAndroid Build Coastguard Worker     assertEqual("55555", foo4());
229*795d594fSAndroid Build Coastguard Worker     assertEqual("55555", foo(intField3));
230*795d594fSAndroid Build Coastguard Worker     assertEqual("-129", foo(intFieldMinus129));
231*795d594fSAndroid Build Coastguard Worker     assertEqual("-128", foo(intFieldMinus128));
232*795d594fSAndroid Build Coastguard Worker     assertEqual(foo(intFieldMinus128), foo(intFieldMinus128));
233*795d594fSAndroid Build Coastguard Worker     assertEqual("-127", foo(intFieldMinus127));
234*795d594fSAndroid Build Coastguard Worker     assertEqual(foo(intFieldMinus127), foo(intFieldMinus127));
235*795d594fSAndroid Build Coastguard Worker     assertEqual("126", foo(intField126));
236*795d594fSAndroid Build Coastguard Worker     assertEqual(foo(intField126), foo(intField126));
237*795d594fSAndroid Build Coastguard Worker     assertEqual("127", foo(intField127));
238*795d594fSAndroid Build Coastguard Worker     assertEqual(foo(intField127), foo(intField127));
239*795d594fSAndroid Build Coastguard Worker     assertEqual("128", foo(intField128));
240*795d594fSAndroid Build Coastguard Worker 
241*795d594fSAndroid Build Coastguard Worker     assertEqual(42, (int) $noinline$boxUnboxByte((byte) 42));
242*795d594fSAndroid Build Coastguard Worker     assertEqual(-42, (int) $noinline$boxUnboxByte((byte) -42));
243*795d594fSAndroid Build Coastguard Worker     assertEqual(42, (int) $noinline$boxUnboxShort((short) 42));
244*795d594fSAndroid Build Coastguard Worker     assertEqual(-42, (int) $noinline$boxUnboxShort((short) -42));
245*795d594fSAndroid Build Coastguard Worker     assertEqual((int) (char) 42, (int) $noinline$boxUnboxCharacter((char) 42));
246*795d594fSAndroid Build Coastguard Worker     assertEqual((int) (char) -42, (int) $noinline$boxUnboxCharacter((char) -42));
247*795d594fSAndroid Build Coastguard Worker     assertEqual(42, $noinline$boxUnboxInteger(42));
248*795d594fSAndroid Build Coastguard Worker     assertEqual(-42, $noinline$boxUnboxInteger(-42));
249*795d594fSAndroid Build Coastguard Worker 
250*795d594fSAndroid Build Coastguard Worker     assertEqual(42, $noinline$boxUnboxByteAsUint8((byte) 42));
251*795d594fSAndroid Build Coastguard Worker     assertEqual(-42 & 0xff, $noinline$boxUnboxByteAsUint8((byte) -42));
252*795d594fSAndroid Build Coastguard Worker   }
253*795d594fSAndroid Build Coastguard Worker 
assertEqual(String a, Integer b)254*795d594fSAndroid Build Coastguard Worker   static void assertEqual(String a, Integer b) {
255*795d594fSAndroid Build Coastguard Worker     if (!a.equals(b.toString())) {
256*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected " + a + ", got " + b);
257*795d594fSAndroid Build Coastguard Worker     }
258*795d594fSAndroid Build Coastguard Worker   }
259*795d594fSAndroid Build Coastguard Worker 
assertEqual(Integer a, Integer b)260*795d594fSAndroid Build Coastguard Worker   static void assertEqual(Integer a, Integer b) {
261*795d594fSAndroid Build Coastguard Worker     if (a != b) {
262*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected " + a + ", got " + b);
263*795d594fSAndroid Build Coastguard Worker     }
264*795d594fSAndroid Build Coastguard Worker   }
265*795d594fSAndroid Build Coastguard Worker 
assertEqual(int a, int b)266*795d594fSAndroid Build Coastguard Worker   static void assertEqual(int a, int b) {
267*795d594fSAndroid Build Coastguard Worker     if (a != b) {
268*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected " + a + ", got " + b);
269*795d594fSAndroid Build Coastguard Worker     }
270*795d594fSAndroid Build Coastguard Worker   }
271*795d594fSAndroid Build Coastguard Worker 
272*795d594fSAndroid Build Coastguard Worker   static int intField = 42;
273*795d594fSAndroid Build Coastguard Worker   static int intField2 = 42;
274*795d594fSAndroid Build Coastguard Worker   static int intField3 = 55555;
275*795d594fSAndroid Build Coastguard Worker 
276*795d594fSAndroid Build Coastguard Worker   // Edge cases.
277*795d594fSAndroid Build Coastguard Worker   static int intFieldMinus129 = -129;
278*795d594fSAndroid Build Coastguard Worker   static int intFieldMinus128 = -128;
279*795d594fSAndroid Build Coastguard Worker   static int intFieldMinus127 = -127;
280*795d594fSAndroid Build Coastguard Worker   static int intField126 = 126;
281*795d594fSAndroid Build Coastguard Worker   static int intField127 = 127;
282*795d594fSAndroid Build Coastguard Worker   static int intField128 = 128;
283*795d594fSAndroid Build Coastguard Worker }
284