diff options
Diffstat (limited to 'test/640-checker-integer-valueof/src/Main.java')
-rw-r--r-- | test/640-checker-integer-valueof/src/Main.java | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/test/640-checker-integer-valueof/src/Main.java b/test/640-checker-integer-valueof/src/Main.java index 0837fd18ee..cf0d7d8774 100644 --- a/test/640-checker-integer-valueof/src/Main.java +++ b/test/640-checker-integer-valueof/src/Main.java @@ -48,6 +48,178 @@ public class Main { return Integer.valueOf(55555); } + /// CHECK-START: byte Main.$noinline$boxUnboxByte(byte) builder (after) + /// CHECK: <<Input:b\d+>> ParameterValue + /// CHECK: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf + /// CHECK-NOT: NullCheck [<<Boxed>>] + /// CHECK: <<Unboxed:b\d+>> InvokeVirtual [<<Boxed>>] method_name:java.lang.Byte.byteValue + /// CHECK: Return [<<Unboxed>>] + + /// CHECK-START: byte Main.$noinline$boxUnboxByte(byte) inliner (after) + /// CHECK: <<Input:b\d+>> ParameterValue + /// CHECK: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf + /// CHECK: <<Unboxed:b\d+>> InstanceFieldGet [<<Boxed>>] field_name:java.lang.Byte.value + /// CHECK: Return [<<Unboxed>>] + + /// CHECK-START: byte Main.$noinline$boxUnboxByte(byte) instruction_simplifier$after_inlining (after) + /// CHECK: <<Input:b\d+>> ParameterValue + /// CHECK: Return [<<Input>>] + + /// CHECK-START: byte Main.$noinline$boxUnboxByte(byte) dead_code_elimination$after_inlining (after) + /// CHECK-NOT: InvokeStaticOrDirect + /// CHECK-NOT: InstanceFieldGet + + public static byte $noinline$boxUnboxByte(byte value) { + return Byte.valueOf(value).byteValue(); + } + + /// CHECK-START: short Main.$noinline$boxUnboxShort(short) builder (after) + /// CHECK: <<Input:s\d+>> ParameterValue + /// CHECK: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Short.valueOf intrinsic:ShortValueOf + /// CHECK-NOT: NullCheck [<<Boxed>>] + /// CHECK: <<Unboxed:s\d+>> InvokeVirtual [<<Boxed>>] method_name:java.lang.Short.shortValue + /// CHECK: Return [<<Unboxed>>] + + /// CHECK-START: short Main.$noinline$boxUnboxShort(short) inliner (after) + /// CHECK: <<Input:s\d+>> ParameterValue + /// CHECK: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Short.valueOf intrinsic:ShortValueOf + /// CHECK: <<Unboxed:s\d+>> InstanceFieldGet [<<Boxed>>] field_name:java.lang.Short.value + /// CHECK: Return [<<Unboxed>>] + + /// CHECK-START: short Main.$noinline$boxUnboxShort(short) instruction_simplifier$after_inlining (after) + /// CHECK: <<Input:s\d+>> ParameterValue + /// CHECK: Return [<<Input>>] + + /// CHECK-START: short Main.$noinline$boxUnboxShort(short) dead_code_elimination$after_inlining (after) + /// CHECK-NOT: InvokeStaticOrDirect + /// CHECK-NOT: InstanceFieldGet + + public static short $noinline$boxUnboxShort(short value) { + return Short.valueOf(value).shortValue(); + } + + /// CHECK-START: char Main.$noinline$boxUnboxCharacter(char) builder (after) + /// CHECK: <<Input:c\d+>> ParameterValue + /// CHECK: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Character.valueOf intrinsic:CharacterValueOf + /// CHECK-NOT: NullCheck [<<Boxed>>] + /// CHECK: <<Unboxed:c\d+>> InvokeVirtual [<<Boxed>>] method_name:java.lang.Character.charValue + /// CHECK: Return [<<Unboxed>>] + + /// CHECK-START: char Main.$noinline$boxUnboxCharacter(char) inliner (after) + /// CHECK: <<Input:c\d+>> ParameterValue + /// CHECK: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Character.valueOf intrinsic:CharacterValueOf + /// CHECK: <<Unboxed:c\d+>> InstanceFieldGet [<<Boxed>>] field_name:java.lang.Character.value + /// CHECK: Return [<<Unboxed>>] + + /// CHECK-START: char Main.$noinline$boxUnboxCharacter(char) instruction_simplifier$after_inlining (after) + /// CHECK: <<Input:c\d+>> ParameterValue + /// CHECK: Return [<<Input>>] + + /// CHECK-START: char Main.$noinline$boxUnboxCharacter(char) dead_code_elimination$after_inlining (after) + /// CHECK-NOT: InvokeStaticOrDirect + /// CHECK-NOT: InstanceFieldGet + + public static char $noinline$boxUnboxCharacter(char value) { + return Character.valueOf(value).charValue(); + } + + /// CHECK-START: int Main.$noinline$boxUnboxInteger(int) builder (after) + /// CHECK: <<Input:i\d+>> ParameterValue + /// CHECK: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Integer.valueOf intrinsic:IntegerValueOf + /// CHECK-NOT: NullCheck [<<Boxed>>] + /// CHECK: <<Unboxed:i\d+>> InvokeVirtual [<<Boxed>>] method_name:java.lang.Integer.intValue + /// CHECK: Return [<<Unboxed>>] + + /// CHECK-START: int Main.$noinline$boxUnboxInteger(int) inliner (after) + /// CHECK: <<Input:i\d+>> ParameterValue + /// CHECK: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Integer.valueOf intrinsic:IntegerValueOf + /// CHECK: <<Unboxed:i\d+>> InstanceFieldGet [<<Boxed>>] field_name:java.lang.Integer.value + /// CHECK: Return [<<Unboxed>>] + + /// CHECK-START: int Main.$noinline$boxUnboxInteger(int) instruction_simplifier$after_inlining (after) + /// CHECK: <<Input:i\d+>> ParameterValue + /// CHECK: Return [<<Input>>] + + /// CHECK-START: int Main.$noinline$boxUnboxInteger(int) dead_code_elimination$after_inlining (after) + /// CHECK-NOT: InvokeStaticOrDirect + /// CHECK-NOT: InstanceFieldGet + + public static int $noinline$boxUnboxInteger(int value) { + return Integer.valueOf(value).intValue(); + } + + /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) builder (after) + /// CHECK-DAG: <<Input:b\d+>> ParameterValue + /// CHECK-DAG: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf + /// CHECK-DAG: <<Phi:l\d+>> Phi + /// CHECK-DAG: <<NC:l\d+>> NullCheck [<<Phi>>] + /// CHECK-DAG: <<Unboxed:b\d+>> InvokeVirtual [<<NC>>] method_name:java.lang.Byte.byteValue + /// CHECK-DAG: <<And:i\d+>> And + /// CHECK-DAG: Return [<<And>>] + + /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) instruction_simplifier (after) + /// CHECK-DAG: <<Input:b\d+>> ParameterValue + /// CHECK-DAG: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf + /// CHECK-DAG: <<Phi:l\d+>> Phi + /// CHECK-DAG: <<NC:l\d+>> NullCheck [<<Phi>>] + /// CHECK-DAG: <<Unboxed:b\d+>> InvokeVirtual [<<NC>>] method_name:java.lang.Byte.byteValue + /// CHECK-DAG: <<Conv:a\d+>> TypeConversion [<<Unboxed>>] + /// CHECK-DAG: Return [<<Conv>>] + + /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) inliner (after) + /// CHECK-DAG: <<Input:b\d+>> ParameterValue + /// CHECK-DAG: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf + /// CHECK-DAG: <<Phi:l\d+>> Phi + /// CHECK-DAG: <<NC:l\d+>> NullCheck [<<Phi>>] + /// CHECK-DAG: <<Unboxed:b\d+>> InstanceFieldGet [<<NC>>] field_name:java.lang.Byte.value + /// CHECK-DAG: <<Conv:a\d+>> TypeConversion [<<Unboxed>>] + /// CHECK-DAG: Return [<<Conv>>] + + /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) instruction_simplifier$after_inlining (after) + /// CHECK-DAG: <<Input:b\d+>> ParameterValue + /// CHECK-DAG: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf + /// CHECK-DAG: <<Phi:l\d+>> Phi + /// CHECK-DAG: <<NC:l\d+>> NullCheck [<<Phi>>] + /// CHECK-DAG: <<Conv:a\d+>> InstanceFieldGet [<<NC>>] field_name:java.lang.Byte.value + /// CHECK-DAG: Return [<<Conv>>] + + /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) dead_code_elimination$after_inlining (after) + /// CHECK-DAG: <<Input:b\d+>> ParameterValue + /// CHECK-DAG: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf + /// CHECK-DAG: <<NC:l\d+>> NullCheck [<<Boxed>>] + /// CHECK-DAG: <<Conv:a\d+>> InstanceFieldGet [<<NC>>] field_name:java.lang.Byte.value + /// CHECK-DAG: Return [<<Conv>>] + + /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) instruction_simplifier$after_gvn (after) + /// CHECK-DAG: <<Input:b\d+>> ParameterValue + /// CHECK-DAG: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf + /// CHECK-DAG: <<Conv:a\d+>> InstanceFieldGet [<<Boxed>>] field_name:java.lang.Byte.value + /// CHECK-DAG: Return [<<Conv>>] + + /// CHECK-START: int Main.$noinline$boxUnboxByteAsUint8(byte) disassembly (after) + /// CHECK-DAG: <<Input:b\d+>> ParameterValue + /// CHECK-DAG: <<Boxed:l\d+>> InvokeStaticOrDirect [<<Input>>{{(,[ij]\d+)?}}] method_name:java.lang.Byte.valueOf intrinsic:ByteValueOf + /// CHECK-DAG: <<Conv:a\d+>> InstanceFieldGet [<<Boxed>>] field_name:java.lang.Byte.value + /// CHECK-DAG: Return [<<Conv>>] + + public static int $noinline$boxUnboxByteAsUint8(byte value) { + Byte boxed = Byte.valueOf(value); + + // Hide the unboxing from the initial instruction simplifier pass or the one after inlining, + // so that after inlining we can merge the `TypeConversion` into `InstanceFieldGet` with + // a modified type. The Phi shall be eliminated by `dead_code_elimination$after_inlining`. + // The null check that shall be eliminated by `instruction_simplifier$after_gvn (after)` + Byte merged = $inline$returnTrue() ? boxed : null; + + // Due to the type mismatch, we shall not simplify the unboxing. The boxing and unboxing + // shall be kept during subsequent simplifier passes all the way to the disassembly. + return merged.byteValue() & 0xff; + } + + public static boolean $inline$returnTrue() { + return true; + } + public static void main(String[] args) { assertEqual("42", foo(intField)); assertEqual(foo(intField), foo(intField2)); @@ -65,6 +237,18 @@ public class Main { assertEqual("127", foo(intField127)); assertEqual(foo(intField127), foo(intField127)); assertEqual("128", foo(intField128)); + + assertEqual(42, (int) $noinline$boxUnboxByte((byte) 42)); + assertEqual(-42, (int) $noinline$boxUnboxByte((byte) -42)); + assertEqual(42, (int) $noinline$boxUnboxShort((short) 42)); + assertEqual(-42, (int) $noinline$boxUnboxShort((short) -42)); + assertEqual((int) (char) 42, (int) $noinline$boxUnboxCharacter((char) 42)); + assertEqual((int) (char) -42, (int) $noinline$boxUnboxCharacter((char) -42)); + assertEqual(42, $noinline$boxUnboxInteger(42)); + assertEqual(-42, $noinline$boxUnboxInteger(-42)); + + assertEqual(42, $noinline$boxUnboxByteAsUint8((byte) 42)); + assertEqual(-42 & 0xff, $noinline$boxUnboxByteAsUint8((byte) -42)); } static void assertEqual(String a, Integer b) { @@ -79,6 +263,12 @@ public class Main { } } + static void assertEqual(int a, int b) { + if (a != b) { + throw new Error("Expected " + a + ", got " + b); + } + } + static int intField = 42; static int intField2 = 42; static int intField3 = 55555; |