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