Main.java revision 94ec2db21332ee1dcdbbf254b99a9a999a304fe0
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 47f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-ARM: int Main.testSimple(int) sharpening (after) 480eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 49f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 50f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-ARM64: int Main.testSimple(int) sharpening (after) 510eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 52f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 5306a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze /// CHECK-START-MIPS: int Main.testSimple(int) sharpening (after) 540eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 5506a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze 56f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze /// CHECK-START-MIPS64: int Main.testSimple(int) sharpening (after) 570eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 58f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze 59f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86: int Main.testSimple(int) sharpening (after) 60f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 610eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 62f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 63f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86_64: int Main.testSimple(int) sharpening (after) 640eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 65f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 660eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-MIPS: int Main.testSimple(int) pc_relative_fixups_mips (after) 670eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: MipsComputeBaseMethodAddress 680eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: MipsComputeBaseMethodAddress 69f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 70f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86: int Main.testSimple(int) pc_relative_fixups_x86 (after) 71f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: X86ComputeBaseMethodAddress 72f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 73f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 74f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static int testSimple(int x) { 75f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko // This call should use PC-relative dex cache array load to retrieve the target method. 76f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return $noinline$foo(x); 77f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 78f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 79f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START: int Main.testDiamond(boolean, int) sharpening (before) 80e7197bf7d58c705a048e13e241d7ca320502cd40Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:RuntimeCall 81f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 82f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-ARM: int Main.testDiamond(boolean, int) sharpening (after) 830eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 840eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 85f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 86f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-ARM64: int Main.testDiamond(boolean, int) sharpening (after) 870eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 880eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 89f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 9006a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze /// CHECK-START-MIPS: int Main.testDiamond(boolean, int) sharpening (after) 910eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 920eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 9306a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze 94f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze /// CHECK-START-MIPS64: int Main.testDiamond(boolean, int) sharpening (after) 950eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 960eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 97f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze 98f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86: int Main.testDiamond(boolean, int) sharpening (after) 99f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 1000eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 1010eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 102f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 103f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86_64: int Main.testDiamond(boolean, int) sharpening (after) 1040eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 1050eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 106f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1070eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-MIPS: int Main.testDiamond(boolean, int) pc_relative_fixups_mips (after) 1080eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: MipsComputeBaseMethodAddress 1090eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: MipsComputeBaseMethodAddress 110f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1110eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-MIPS: int Main.testDiamond(boolean, int) pc_relative_fixups_mips (after) 1120eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: MipsComputeBaseMethodAddress 113f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NEXT: If 114f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 115f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86: int Main.testDiamond(boolean, int) pc_relative_fixups_x86 (after) 116f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: X86ComputeBaseMethodAddress 117f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 118f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 119f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-START-X86: int Main.testDiamond(boolean, int) pc_relative_fixups_x86 (after) 120f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: X86ComputeBaseMethodAddress 121f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NEXT: If 122f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 123f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static int testDiamond(boolean negate, int x) { 1240eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko // These calls should use PC-relative loads to retrieve the target method. 1250eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko // PC-relative bases used by MIPS and X86 should be pulled before the If. 126f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko if (negate) { 127f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return $noinline$foo(-x); 128f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } else { 129f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return $noinline$foo(x); 130f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 131f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 132f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1330eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-MIPS: int Main.testLoop(int[], int) pc_relative_fixups_mips (before) 1340eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: MipsComputeBaseMethodAddress 135f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1360eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-MIPS: int Main.testLoop(int[], int) pc_relative_fixups_mips (after) 1370eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: MipsComputeBaseMethodAddress 1380eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: MipsComputeBaseMethodAddress 139f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1400eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-MIPS: int Main.testLoop(int[], int) pc_relative_fixups_mips (after) 141f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: InvokeStaticOrDirect 142f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: InvokeStaticOrDirect 143f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1440eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-MIPS: int Main.testLoop(int[], int) pc_relative_fixups_mips (after) 145f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: ArrayLength 1460eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NEXT: MipsComputeBaseMethodAddress 147f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NEXT: Goto 148f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: begin_block 1490eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 150f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1510eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoop(int[], int) pc_relative_fixups_x86 (before) 1520eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 153f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1540eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoop(int[], int) pc_relative_fixups_x86 (after) 1550eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: X86ComputeBaseMethodAddress 1560eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 157f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1580eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoop(int[], int) pc_relative_fixups_x86 (after) 159f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: InvokeStaticOrDirect 160f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NOT: InvokeStaticOrDirect 161f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1620eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoop(int[], int) pc_relative_fixups_x86 (after) 163f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: ArrayLength 1640eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NEXT: X86ComputeBaseMethodAddress 165f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NEXT: Goto 166f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: begin_block 1670eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK: InvokeStaticOrDirect method_load_kind:BssEntry 168f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 169f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static int testLoop(int[] array, int x) { 1700eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko // PC-relative bases used by MIPS and X86 should be pulled before the loop. 171f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko for (int i : array) { 172f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko x += $noinline$foo(i); 173f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 174f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return x; 175f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 176f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1770eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-MIPS: int Main.testLoopWithDiamond(int[], boolean, int) pc_relative_fixups_mips (before) 1780eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: MipsComputeBaseMethodAddress 179f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1800eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-MIPS: int Main.testLoopWithDiamond(int[], boolean, int) pc_relative_fixups_mips (after) 181f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: If 182f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: begin_block 183f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: ArrayLength 1840eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NEXT: MipsComputeBaseMethodAddress 185f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NEXT: Goto 186f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1870eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoopWithDiamond(int[], boolean, int) pc_relative_fixups_x86 (before) 1880eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NOT: X86ComputeBaseMethodAddress 189f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 1900eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-START-X86: int Main.testLoopWithDiamond(int[], boolean, int) pc_relative_fixups_x86 (after) 191f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: If 192f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: begin_block 193f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK: ArrayLength 1940eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko /// CHECK-NEXT: X86ComputeBaseMethodAddress 195f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko /// CHECK-NEXT: Goto 196f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 197f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static int testLoopWithDiamond(int[] array, boolean negate, int x) { 1980eb882bfc5d260e8014c26adfda11602065aa5d8Vladimir Marko // PC-relative bases used by MIPS and X86 should be pulled before the loop 199f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko // but not outside the if. 200f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko if (array != null) { 201f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko for (int i : array) { 202f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko if (negate) { 203f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko x += $noinline$foo(-i); 204f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } else { 205f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko x += $noinline$foo(i); 206f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 207f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 208f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 209f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko return x; 210f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 211f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko 212cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko /// CHECK-START: java.lang.String Main.$noinline$getBootImageString() sharpening (before) 213847e6ce98b4b822fd94c631975763845978ebaa3Vladimir Marko /// CHECK: LoadString load_kind:RuntimeCall 214cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 215cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko /// CHECK-START-X86: java.lang.String Main.$noinline$getBootImageString() sharpening (after) 216cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Note: load kind depends on PIC/non-PIC 2176cfbdbc359ec5414d3e49f70d28f8c0e65b98d63Vladimir Marko /// CHECK: LoadString load_kind:{{BootImageAddress|BootImageInternTable}} 218cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 219cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko /// CHECK-START-X86_64: java.lang.String Main.$noinline$getBootImageString() sharpening (after) 220cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Note: load kind depends on PIC/non-PIC 2216cfbdbc359ec5414d3e49f70d28f8c0e65b98d63Vladimir Marko /// CHECK: LoadString load_kind:{{BootImageAddress|BootImageInternTable}} 222cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 223cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko /// CHECK-START-ARM: java.lang.String Main.$noinline$getBootImageString() sharpening (after) 224cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Note: load kind depends on PIC/non-PIC 2256cfbdbc359ec5414d3e49f70d28f8c0e65b98d63Vladimir Marko /// CHECK: LoadString load_kind:{{BootImageAddress|BootImageInternTable}} 226cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 227cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko /// CHECK-START-ARM64: java.lang.String Main.$noinline$getBootImageString() sharpening (after) 228cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Note: load kind depends on PIC/non-PIC 2296cfbdbc359ec5414d3e49f70d28f8c0e65b98d63Vladimir Marko /// CHECK: LoadString load_kind:{{BootImageAddress|BootImageInternTable}} 230cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 23106a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze /// CHECK-START-MIPS: java.lang.String Main.$noinline$getBootImageString() sharpening (after) 23206a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze // Note: load kind depends on PIC/non-PIC 2336cfbdbc359ec5414d3e49f70d28f8c0e65b98d63Vladimir Marko /// CHECK: LoadString load_kind:{{BootImageAddress|BootImageInternTable}} 23406a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze 235f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze /// CHECK-START-MIPS64: java.lang.String Main.$noinline$getBootImageString() sharpening (after) 236f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze // Note: load kind depends on PIC/non-PIC 2376cfbdbc359ec5414d3e49f70d28f8c0e65b98d63Vladimir Marko /// CHECK: LoadString load_kind:{{BootImageAddress|BootImageInternTable}} 238f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze 239cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko public static String $noinline$getBootImageString() { 240cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Prevent inlining to avoid the string comparison being optimized away. 241cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko if (doThrow) { throw new Error(); } 242cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Empty string is known to be in the boot image. 243cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko return ""; 244cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko } 245cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 246cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko /// CHECK-START: java.lang.String Main.$noinline$getNonBootImageString() sharpening (before) 247847e6ce98b4b822fd94c631975763845978ebaa3Vladimir Marko /// CHECK: LoadString load_kind:RuntimeCall 248cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 2491bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-START-X86: java.lang.String Main.$noinline$getNonBootImageString() sharpening (after) 2501bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK: LoadString load_kind:BssEntry 251cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 2521bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-START-X86: java.lang.String Main.$noinline$getNonBootImageString() pc_relative_fixups_x86 (after) 2531bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-DAG: X86ComputeBaseMethodAddress 2541bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-DAG: LoadString load_kind:BssEntry 255cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 2561bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-START-X86_64: java.lang.String Main.$noinline$getNonBootImageString() sharpening (after) 2571bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK: LoadString load_kind:BssEntry 258cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 2591bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-START-ARM: java.lang.String Main.$noinline$getNonBootImageString() sharpening (after) 2601bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK: LoadString load_kind:BssEntry 261cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 2621bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-START-ARM64: java.lang.String Main.$noinline$getNonBootImageString() sharpening (after) 2631bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK: LoadString load_kind:BssEntry 264cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 2651bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK-START-MIPS: java.lang.String Main.$noinline$getNonBootImageString() sharpening (after) 2661bc4b178590fa204265363a0207f1388e8bd6d15Vladimir Marko /// CHECK: LoadString load_kind:BssEntry 26706a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze 268f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze /// CHECK-START-MIPS64: java.lang.String Main.$noinline$getNonBootImageString() sharpening (after) 269f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze /// CHECK: LoadString load_kind:BssEntry 270f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze 271cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko public static String $noinline$getNonBootImageString() { 272cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Prevent inlining to avoid the string comparison being optimized away. 273cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko if (doThrow) { throw new Error(); } 274cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // This string is not in the boot image. 275cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko return "non-boot-image-string"; 276cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko } 277cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 278dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-X86: java.lang.Class Main.$noinline$getStringClass() sharpening (after) 279dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Note: load kind depends on PIC/non-PIC 28094ec2db21332ee1dcdbbf254b99a9a999a304fe0Vladimir Marko /// CHECK: LoadClass load_kind:{{BootImageAddress|BootImageClassTable}} class_name:java.lang.String 281dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 282dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-X86_64: java.lang.Class Main.$noinline$getStringClass() sharpening (after) 283dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Note: load kind depends on PIC/non-PIC 28494ec2db21332ee1dcdbbf254b99a9a999a304fe0Vladimir Marko /// CHECK: LoadClass load_kind:{{BootImageAddress|BootImageClassTable}} class_name:java.lang.String 285dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 286dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-ARM: java.lang.Class Main.$noinline$getStringClass() sharpening (after) 287dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Note: load kind depends on PIC/non-PIC 28894ec2db21332ee1dcdbbf254b99a9a999a304fe0Vladimir Marko /// CHECK: LoadClass load_kind:{{BootImageAddress|BootImageClassTable}} class_name:java.lang.String 289dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 290dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-ARM64: java.lang.Class Main.$noinline$getStringClass() sharpening (after) 291dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Note: load kind depends on PIC/non-PIC 29294ec2db21332ee1dcdbbf254b99a9a999a304fe0Vladimir Marko /// CHECK: LoadClass load_kind:{{BootImageAddress|BootImageClassTable}} class_name:java.lang.String 293dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 29406a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze /// CHECK-START-MIPS: java.lang.Class Main.$noinline$getStringClass() sharpening (after) 29506a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze // Note: load kind depends on PIC/non-PIC 29694ec2db21332ee1dcdbbf254b99a9a999a304fe0Vladimir Marko /// CHECK: LoadClass load_kind:{{BootImageAddress|BootImageClassTable}} class_name:java.lang.String 29706a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze 298f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze /// CHECK-START-MIPS64: java.lang.Class Main.$noinline$getStringClass() sharpening (after) 299f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze // Note: load kind depends on PIC/non-PIC 30094ec2db21332ee1dcdbbf254b99a9a999a304fe0Vladimir Marko /// CHECK: LoadClass load_kind:{{BootImageAddress|BootImageClassTable}} class_name:java.lang.String 301f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze 302dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko public static Class<?> $noinline$getStringClass() { 303dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Prevent inlining to avoid the string comparison being optimized away. 304dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko if (doThrow) { throw new Error(); } 305dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // String class is known to be in the boot image. 306dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko return String.class; 307dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko } 308dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 309dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-X86: java.lang.Class Main.$noinline$getOtherClass() sharpening (after) 3106bec91c7d4670905cd67440991ec76fd54d0f000Vladimir Marko /// CHECK: LoadClass load_kind:BssEntry class_name:Other 311dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 312dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-X86: java.lang.Class Main.$noinline$getOtherClass() pc_relative_fixups_x86 (after) 313dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-DAG: X86ComputeBaseMethodAddress 3146bec91c7d4670905cd67440991ec76fd54d0f000Vladimir Marko /// CHECK-DAG: LoadClass load_kind:BssEntry class_name:Other 315dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 316dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-X86_64: java.lang.Class Main.$noinline$getOtherClass() sharpening (after) 3176bec91c7d4670905cd67440991ec76fd54d0f000Vladimir Marko /// CHECK: LoadClass load_kind:BssEntry class_name:Other 318dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 319dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-ARM: java.lang.Class Main.$noinline$getOtherClass() sharpening (after) 3206bec91c7d4670905cd67440991ec76fd54d0f000Vladimir Marko /// CHECK: LoadClass load_kind:BssEntry class_name:Other 321dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 322dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko /// CHECK-START-ARM64: java.lang.Class Main.$noinline$getOtherClass() sharpening (after) 3236bec91c7d4670905cd67440991ec76fd54d0f000Vladimir Marko /// CHECK: LoadClass load_kind:BssEntry class_name:Other 324dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 32506a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze /// CHECK-START-MIPS: java.lang.Class Main.$noinline$getOtherClass() sharpening (after) 3266bec91c7d4670905cd67440991ec76fd54d0f000Vladimir Marko /// CHECK: LoadClass load_kind:BssEntry class_name:Other 32706a46c44bf1a5cba6c78c3faffc4e7ec1442b210Alexey Frunze 328f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze /// CHECK-START-MIPS64: java.lang.Class Main.$noinline$getOtherClass() sharpening (after) 3296bec91c7d4670905cd67440991ec76fd54d0f000Vladimir Marko /// CHECK: LoadClass load_kind:BssEntry class_name:Other 330f63f569eeefe3907c48a175494a2a0ba351b641aAlexey Frunze 331dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko public static Class<?> $noinline$getOtherClass() { 332dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Prevent inlining to avoid the string comparison being optimized away. 333dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko if (doThrow) { throw new Error(); } 334dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko // Other class is not in the boot image. 335dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko return Other.class; 336dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko } 337dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 338f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko public static void main(String[] args) { 339f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(1, testSimple(1)); 340f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(1, testDiamond(false, 1)); 341f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(-1, testDiamond(true, 1)); 342f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(3, testLoop(new int[]{ 2 }, 1)); 343f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(8, testLoop(new int[]{ 3, 4 }, 1)); 344f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(1, testLoopWithDiamond(null, false, 1)); 345f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(3, testLoopWithDiamond(new int[]{ 2 }, false, 1)); 346f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko assertIntEquals(-6, testLoopWithDiamond(new int[]{ 3, 4 }, true, 1)); 347cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko assertStringEquals("", $noinline$getBootImageString()); 348cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko assertStringEquals("non-boot-image-string", $noinline$getNonBootImageString()); 349dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko assertClassEquals(String.class, $noinline$getStringClass()); 350dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko assertClassEquals(Other.class, $noinline$getOtherClass()); 351f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko } 352f64242a30c6e05a8e4302a64eab4bcc28297dc9eVladimir Marko} 353dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko 354dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Markoclass Other { 355dbb7f5bef10138ade0fb202da1d61f562b2df649Vladimir Marko} 356