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