1f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko/* 2f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * Copyright (C) 2015 The Android Open Source Project 3f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * 4f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * Licensed under the Apache License, Version 2.0 (the "License"); 5f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * you may not use this file except in compliance with the License. 6f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * You may obtain a copy of the License at 7f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * 8f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * http://www.apache.org/licenses/LICENSE-2.0 9f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * 10f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * Unless required by applicable law or agreed to in writing, software 11f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * distributed under the License is distributed on an "AS IS" BASIS, 12f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * See the License for the specific language governing permissions and 14f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko * limitations under the License. 15f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko */ 16f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 17f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Markopublic class Main { 18f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 19f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static void assertIntEquals(int expected, int result) { 20f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko if (expected != result) { 21f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko throw new Error("Expected: " + expected + ", found: " + result); 22f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 23f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 24f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 25cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko public static void assertStringEquals(String expected, String result) { 26cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko if (expected != null ? !expected.equals(result) : result != null) { 27cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko throw new Error("Expected: " + expected + ", found: " + result); 28cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko } 29cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko } 30cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 31dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko public static void assertClassEquals(Class<?> expected, Class<?> result) { 32dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko if (expected != result) { 33dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko throw new Error("Expected: " + expected + ", found: " + result); 34dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko } 35dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko } 36dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 37f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static boolean doThrow = false; 38f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 39f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko private static int $noinline$foo(int x) { 40f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko if (doThrow) { throw new Error(); } 41f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return x; 42f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 43f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 44f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START: int Main.testSimple(int) sharpening (before) 45e7197bf7d58c705a048e13e241d7ca320502cd40Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:RuntimeCall 46f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 4728e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-{ARM,ARM64,MIPS,MIPS64,X86,X86_64}: int Main.testSimple(int) sharpening (after) 480eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 49f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 5028e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-X86: int Main.testSimple(int) pc_relative_fixups_x86 (before) 51f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 52f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 53f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86: int Main.testSimple(int) pc_relative_fixups_x86 (after) 54f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: X86ComputeBaseMethodAddress 55f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 56f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 57f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static int testSimple(int x) { 584cabe1fbec315ac0b13a70385cef699928e36788Goran Jakovljevic // This call should use PC-relative .bss array load to retrieve the target method. 59f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return $noinline$foo(x); 60f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 61f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 62f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START: int Main.testDiamond(boolean, int) sharpening (before) 63e7197bf7d58c705a048e13e241d7ca320502cd40Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:RuntimeCall 6428e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:RuntimeCall 65f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 6628e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-{ARM,ARM64,MIPS,MIPS64,X86,X86_64}: int Main.testDiamond(boolean, int) sharpening (after) 670eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 680eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 69f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze 7028e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-X86: int Main.testDiamond(boolean, int) pc_relative_fixups_x86 (before) 71f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 72f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 73f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86: int Main.testDiamond(boolean, int) pc_relative_fixups_x86 (after) 74f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: X86ComputeBaseMethodAddress 75f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 76f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 77f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86: int Main.testDiamond(boolean, int) pc_relative_fixups_x86 (after) 78f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: X86ComputeBaseMethodAddress 79f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NEXT: If 80f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 81f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static int testDiamond(boolean negate, int x) { 820eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko // These calls should use PC-relative loads to retrieve the target method. 834cabe1fbec315ac0b13a70385cef699928e36788Goran Jakovljevic // PC-relative bases used by MIPS32R2 and X86 should be pulled before the If. 84f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko if (negate) { 85f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return $noinline$foo(-x); 86f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } else { 87f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return $noinline$foo(x); 88f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 89f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 90f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 910eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoop(int[], int) pc_relative_fixups_x86 (before) 920eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 93f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 940eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoop(int[], int) pc_relative_fixups_x86 (after) 950eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: X86ComputeBaseMethodAddress 960eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 97f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 980eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoop(int[], int) pc_relative_fixups_x86 (after) 99f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: InvokeStaticOrDirect 100f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: InvokeStaticOrDirect 101f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1020eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoop(int[], int) pc_relative_fixups_x86 (after) 103f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: ArrayLength 1040eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NEXT: X86ComputeBaseMethodAddress 105f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NEXT: Goto 106f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: begin_block 1070eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 108f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 109f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static int testLoop(int[] array, int x) { 1104cabe1fbec315ac0b13a70385cef699928e36788Goran Jakovljevic // PC-relative bases used by MIPS32R2 and X86 should be pulled before the loop. 111f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko for (int i : array) { 112f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko x += $noinline$foo(i); 113f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 114f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return x; 115f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 116f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1170eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoopWithDiamond(int[], boolean, int) pc_relative_fixups_x86 (before) 1180eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 119f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1200eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoopWithDiamond(int[], boolean, int) pc_relative_fixups_x86 (after) 121f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: If 122f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: begin_block 123f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: ArrayLength 1240eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NEXT: X86ComputeBaseMethodAddress 125f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NEXT: Goto 126f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 127f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static int testLoopWithDiamond(int[] array, boolean negate, int x) { 1284cabe1fbec315ac0b13a70385cef699928e36788Goran Jakovljevic // PC-relative bases used by MIPS32R2 and X86 should be pulled before the loop 129f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko // but not outside the if. 130f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko if (array != null) { 131f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko for (int i : array) { 132f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko if (negate) { 133f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko x += $noinline$foo(-i); 134f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } else { 135f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko x += $noinline$foo(i); 136f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 137f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 138f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 139f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return x; 140f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 141f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 14228e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-{ARM,ARM64,MIPS,MIPS64,X86,X86_64}: java.lang.String Main.$noinline$getBootImageString() builder (after) 143f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze // Note: load kind depends on PIC/non-PIC 1446cfbdbc359ec5414d3e49f70d28f8c0e65b98d63Vladimir Marko /// CHECK: LoadString load_kind:{{BootImageAddress|BootImageInternTable}} 145f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze 146cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko public static String $noinline$getBootImageString() { 147cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Prevent inlining to avoid the string comparison being optimized away. 148cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko if (doThrow) { throw new Error(); } 149cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Empty string is known to be in the boot image. 150cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko return ""; 151cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko } 152cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 15328e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-{ARM,ARM64,MIPS,MIPS64,X86,X86_64}: java.lang.String Main.$noinline$getNonBootImageString() builder (after) 1541bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK: LoadString load_kind:BssEntry 155cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 15628e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-X86: java.lang.String Main.$noinline$getNonBootImageString() pc_relative_fixups_x86 (before) 15728e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 15828e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko 1591bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-START-X86: java.lang.String Main.$noinline$getNonBootImageString() pc_relative_fixups_x86 (after) 1601bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-DAG: X86ComputeBaseMethodAddress 1611bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-DAG: LoadString load_kind:BssEntry 162cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 163cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko public static String $noinline$getNonBootImageString() { 164cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Prevent inlining to avoid the string comparison being optimized away. 165cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko if (doThrow) { throw new Error(); } 166cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // This string is not in the boot image. 167cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko return "non-boot-image-string"; 168cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko } 169cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 17028e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-{ARM,ARM64,MIPS,MIPS64,X86,X86_64}: java.lang.Class Main.$noinline$getStringClass() builder (after) 171f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze // Note: load kind depends on PIC/non-PIC 17294ec2db21332ee1dcdbbf254b99a9a999a304fe0Vladimir Marko /// CHECK: LoadClass load_kind:{{BootImageAddress|BootImageClassTable}} class_name:java.lang.String 173f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze 174dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko public static Class<?> $noinline$getStringClass() { 175dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Prevent inlining to avoid the string comparison being optimized away. 176dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko if (doThrow) { throw new Error(); } 177dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // String class is known to be in the boot image. 178dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko return String.class; 179dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko } 180dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 18128e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-{ARM,ARM64,MIPS,MIPS64,X86,X86_64}: java.lang.Class Main.$noinline$getOtherClass() builder (after) 1826bec91c7d4670905cd67440991ec76fd54d0f000Vladimir Marko /// CHECK: LoadClass load_kind:BssEntry class_name:Other 183dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 18428e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-START-X86: java.lang.Class Main.$noinline$getOtherClass() pc_relative_fixups_x86 (before) 18528e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 18628e012a4af2d710e5e5f824709ffd6432e4f549fVladimir Marko 187dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-X86: java.lang.Class Main.$noinline$getOtherClass() pc_relative_fixups_x86 (after) 188dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-DAG: X86ComputeBaseMethodAddress 1896bec91c7d4670905cd67440991ec76fd54d0f000Vladimir Marko /// CHECK-DAG: LoadClass load_kind:BssEntry class_name:Other 190dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 191dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko public static Class<?> $noinline$getOtherClass() { 192dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Prevent inlining to avoid the string comparison being optimized away. 193dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko if (doThrow) { throw new Error(); } 194dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Other class is not in the boot image. 195dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko return Other.class; 196dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko } 197dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 198f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static void main(String[] args) { 199f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(1, testSimple(1)); 200f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(1, testDiamond(false, 1)); 201f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(-1, testDiamond(true, 1)); 202f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(3, testLoop(new int[]{ 2 }, 1)); 203f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(8, testLoop(new int[]{ 3, 4 }, 1)); 204f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(1, testLoopWithDiamond(null, false, 1)); 205f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(3, testLoopWithDiamond(new int[]{ 2 }, false, 1)); 206f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(-6, testLoopWithDiamond(new int[]{ 3, 4 }, true, 1)); 207cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko assertStringEquals("", $noinline$getBootImageString()); 208cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko assertStringEquals("non-boot-image-string", $noinline$getNonBootImageString()); 209dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko assertClassEquals(String.class, $noinline$getStringClass()); 210dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko assertClassEquals(Other.class, $noinline$getOtherClass()); 211f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 212f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko} 213dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 214dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Markoclass Other { 215dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko} 216