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