test/hotspot/jtreg/compiler/types/TypeSpeculation.java
author iignatyev
Mon, 18 Feb 2019 09:31:07 -0800
changeset 53791 bec6c8739833
parent 47216 71c04702a3d5
permissions -rw-r--r--
8219157: vm/mlvm/mixed/stress/java/findDeadlock should be problem-listed only on mac Reviewed-by: thartmann
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
     1
/*
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
     2
 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
     4
 *
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
     7
 * published by the Free Software Foundation.
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
     8
 *
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    13
 * accompanied this code).
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    14
 *
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    18
 *
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    21
 * questions.
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    22
 */
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    23
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    24
/*
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    25
 * @test
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    26
 * @bug 8024070
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    27
 * @summary Test that type speculation doesn't cause incorrect execution
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    28
 *
40059
c2304140ed64 8132919: Put compiler tests in packages
tpivovarova
parents: 23208
diff changeset
    29
 * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseOnStackReplacement
c2304140ed64 8132919: Put compiler tests in packages
tpivovarova
parents: 23208
diff changeset
    30
 *                   -XX:-BackgroundCompilation -XX:TypeProfileLevel=222
c2304140ed64 8132919: Put compiler tests in packages
tpivovarova
parents: 23208
diff changeset
    31
 *                   -XX:+UseTypeSpeculation
c2304140ed64 8132919: Put compiler tests in packages
tpivovarova
parents: 23208
diff changeset
    32
 *                   compiler.types.TypeSpeculation
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    33
 */
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    34
40059
c2304140ed64 8132919: Put compiler tests in packages
tpivovarova
parents: 23208
diff changeset
    35
package compiler.types;
c2304140ed64 8132919: Put compiler tests in packages
tpivovarova
parents: 23208
diff changeset
    36
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    37
public class TypeSpeculation {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    38
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    39
    interface I {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    40
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    41
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    42
    static class A {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    43
        int m() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    44
            return 1;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    45
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    46
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    47
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    48
    static class B extends A implements I {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    49
        int m() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    50
            return 2;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    51
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    52
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    53
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    54
    static class C extends B {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    55
        int m() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    56
            return 3;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    57
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    58
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    59
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    60
    static int test1_invokevirtual(A a) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    61
        return a.m();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    62
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    63
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    64
    static int test1_1(A a) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    65
        return test1_invokevirtual(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    66
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    67
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    68
    static boolean test1() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    69
        A a = new A();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    70
        B b = new B();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    71
        C c = new C();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    72
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    73
        // pollute profile at test1_invokevirtual to make sure the
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    74
        // compiler cannot rely on it
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    75
        for (int i = 0; i < 5000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    76
            test1_invokevirtual(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    77
            test1_invokevirtual(b);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    78
            test1_invokevirtual(c);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    79
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    80
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    81
        // profiling + speculation should make test1_invokevirtual
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    82
        // inline A.m() with a guard
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    83
        for (int i = 0; i < 20000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    84
            int res = test1_1(b);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    85
            if (res != b.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    86
                System.out.println("test1 failed with class B");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    87
                return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    88
            }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    89
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    90
        // check that the guard works as expected by passing a
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    91
        // different type
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    92
        int res = test1_1(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    93
        if (res != a.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    94
            System.out.println("test1 failed with class A");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    95
            return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    96
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    97
        return true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    98
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
    99
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   100
    static int test2_invokevirtual(A a) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   101
        return a.m();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   102
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   103
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   104
    static int test2_1(A a, boolean t) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   105
        A aa;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   106
        if (t) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   107
            aa = (B)a;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   108
        } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   109
            aa = a;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   110
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   111
        // if a of type B is passed to test2_1, the static type of aa
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   112
        // here is no better than A but the profiled type is B so this
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   113
        // should inline
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   114
        return test2_invokevirtual(aa);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   115
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   116
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   117
    static boolean test2() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   118
        A a = new A();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   119
        B b = new B();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   120
        C c = new C();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   121
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   122
        // pollute profile at test2_invokevirtual to make sure the
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   123
        // compiler cannot rely on it
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   124
        for (int i = 0; i < 5000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   125
            test2_invokevirtual(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   126
            test2_invokevirtual(b);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   127
            test2_invokevirtual(c);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   128
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   129
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   130
        // profiling + speculation should make test2_invokevirtual
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   131
        // inline A.m() with a guard
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   132
        for (int i = 0; i < 20000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   133
            int res = test2_1(b, (i % 2) == 0);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   134
            if (res != b.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   135
                System.out.println("test2 failed with class B");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   136
                return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   137
            }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   138
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   139
        // check that the guard works as expected by passing a
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   140
        // different type
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   141
        int res = test2_1(a, false);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   142
        if (res != a.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   143
            System.out.println("test2 failed with class A");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   144
            return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   145
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   146
        return true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   147
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   148
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   149
    static int test3_invokevirtual(A a) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   150
        return a.m();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   151
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   152
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   153
    static void test3_2(A a) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   154
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   155
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   156
    static int test3_1(A a, int i) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   157
        if (i == 0) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   158
            return 0;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   159
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   160
        // If we come here and a is of type B but parameter profiling
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   161
        // is polluted, both branches of the if below should have
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   162
        // profiling that tell us and inlining of the virtual call
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   163
        // should happen
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   164
        if (i == 1) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   165
            test3_2(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   166
        } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   167
            test3_2(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   168
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   169
        return test3_invokevirtual(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   170
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   171
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   172
    static boolean test3() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   173
        A a = new A();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   174
        B b = new B();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   175
        C c = new C();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   176
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   177
        // pollute profile at test3_invokevirtual and test3_1 to make
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   178
        // sure the compiler cannot rely on it
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   179
        for (int i = 0; i < 3000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   180
            test3_invokevirtual(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   181
            test3_invokevirtual(b);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   182
            test3_invokevirtual(c);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   183
            test3_1(a, 0);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   184
            test3_1(b, 0);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   185
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   186
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   187
        // profiling + speculation should make test3_invokevirtual
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   188
        // inline A.m() with a guard
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   189
        for (int i = 0; i < 20000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   190
            int res = test3_1(b, (i % 2) + 1);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   191
            if (res != b.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   192
                System.out.println("test3 failed with class B");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   193
                return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   194
            }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   195
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   196
        // check that the guard works as expected by passing a
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   197
        // different type
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   198
        int res = test3_1(a, 1);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   199
        if (res != a.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   200
            System.out.println("test3 failed with class A");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   201
            return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   202
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   203
        return true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   204
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   205
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   206
    // Mix 2 incompatible profiled types
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   207
    static int test4_invokevirtual(A a) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   208
        return a.m();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   209
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   210
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   211
    static void test4_2(A a) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   212
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   213
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   214
    static int test4_1(A a, boolean b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   215
        if (b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   216
            test4_2(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   217
        } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   218
            test4_2(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   219
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   220
        // shouldn't inline
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   221
        return test4_invokevirtual(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   222
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   223
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   224
    static boolean test4() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   225
        A a = new A();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   226
        B b = new B();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   227
        C c = new C();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   228
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   229
        // pollute profile at test3_invokevirtual and test3_1 to make
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   230
        // sure the compiler cannot rely on it
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   231
        for (int i = 0; i < 3000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   232
            test4_invokevirtual(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   233
            test4_invokevirtual(b);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   234
            test4_invokevirtual(c);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   235
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   236
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   237
        for (int i = 0; i < 20000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   238
            if ((i % 2) == 0) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   239
                int res = test4_1(a, true);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   240
                if (res != a.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   241
                    System.out.println("test4 failed with class A");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   242
                    return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   243
                }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   244
            } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   245
                int res = test4_1(b, false);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   246
                if (res != b.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   247
                    System.out.println("test4 failed with class B");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   248
                    return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   249
                }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   250
            }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   251
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   252
        return true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   253
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   254
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   255
    // Mix one profiled type with an incompatible type
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   256
    static int test5_invokevirtual(A a) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   257
        return a.m();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   258
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   259
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   260
    static void test5_2(A a) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   261
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   262
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   263
    static int test5_1(A a, boolean b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   264
        if (b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   265
            test5_2(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   266
        } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   267
            A aa = (B)a;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   268
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   269
        // shouldn't inline
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   270
        return test5_invokevirtual(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   271
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   272
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   273
    static boolean test5() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   274
        A a = new A();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   275
        B b = new B();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   276
        C c = new C();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   277
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   278
        // pollute profile at test3_invokevirtual and test3_1 to make
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   279
        // sure the compiler cannot rely on it
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   280
        for (int i = 0; i < 3000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   281
            test5_invokevirtual(a);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   282
            test5_invokevirtual(b);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   283
            test5_invokevirtual(c);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   284
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   285
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   286
        for (int i = 0; i < 20000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   287
            if ((i % 2) == 0) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   288
                int res = test5_1(a, true);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   289
                if (res != a.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   290
                    System.out.println("test5 failed with class A");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   291
                    return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   292
                }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   293
            } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   294
                int res = test5_1(b, false);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   295
                if (res != b.m()) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   296
                    System.out.println("test5 failed with class B");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   297
                    return false;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   298
                }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   299
            }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   300
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   301
        return true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   302
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   303
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   304
    // Mix incompatible profiled types
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   305
    static void test6_2(Object o) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   306
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   307
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   308
    static Object test6_1(Object o, boolean b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   309
        if (b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   310
            test6_2(o);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   311
        } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   312
            test6_2(o);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   313
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   314
        return o;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   315
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   316
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   317
    static boolean test6() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   318
        A a = new A();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   319
        A[] aa = new A[10];
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   320
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   321
        for (int i = 0; i < 20000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   322
            if ((i % 2) == 0) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   323
                test6_1(a, true);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   324
            } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   325
                test6_1(aa, false);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   326
            }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   327
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   328
        return true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   329
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   330
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   331
    // Mix a profiled type with an incompatible type
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   332
    static void test7_2(Object o) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   333
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   334
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   335
    static Object test7_1(Object o, boolean b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   336
        if (b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   337
            test7_2(o);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   338
        } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   339
            Object oo = (A[])o;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   340
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   341
        return o;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   342
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   343
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   344
    static boolean test7() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   345
        A a = new A();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   346
        A[] aa = new A[10];
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   347
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   348
        for (int i = 0; i < 20000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   349
            if ((i % 2) == 0) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   350
                test7_1(a, true);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   351
            } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   352
                test7_1(aa, false);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   353
            }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   354
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   355
        return true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   356
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   357
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   358
    // Mix a profiled type with an interface
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   359
    static void test8_2(Object o) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   360
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   361
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   362
    static I test8_1(Object o) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   363
        test8_2(o);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   364
        return (I)o;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   365
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   366
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   367
    static boolean test8() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   368
        A a = new A();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   369
        B b = new B();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   370
        C c = new C();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   371
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   372
        for (int i = 0; i < 20000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   373
            test8_1(b);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   374
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   375
        return true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   376
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   377
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   378
    // Mix a profiled type with a constant
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   379
    static void test9_2(Object o) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   380
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   381
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   382
    static Object test9_1(Object o, boolean b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   383
        Object oo;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   384
        if (b) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   385
            test9_2(o);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   386
            oo = o;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   387
        } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   388
            oo = "some string";
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   389
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   390
        return oo;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   391
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   392
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   393
    static boolean test9() {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   394
        A a = new A();
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   395
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   396
        for (int i = 0; i < 20000; i++) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   397
            if ((i % 2) == 0) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   398
                test9_1(a, true);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   399
            } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   400
                test9_1(a, false);
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   401
            }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   402
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   403
        return true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   404
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   405
22237
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   406
    // java/lang/Object:AnyNull:exact *,iid=top
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   407
    // meets
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   408
    // stable:bottom[int:max..0]:NotNull *
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   409
    static void test10_4(Object o) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   410
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   411
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   412
    static void test10_3(Object o, boolean b) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   413
        if (b) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   414
            test10_4(o);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   415
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   416
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   417
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   418
    static void test10_2(Object o, boolean b1, boolean b2) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   419
        if (b1) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   420
            test10_3(o, b2);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   421
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   422
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   423
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   424
    static void test10_1(B[] b, boolean b1, boolean b2) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   425
        test10_2(b, b1, b2);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   426
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   427
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   428
    static boolean test10() {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   429
        Object o = new Object();
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   430
        A[] a = new A[10];
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   431
        B[] b = new B[10];
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   432
        B[] c = new C[10];
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   433
        for (int i = 0; i < 20000; i++) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   434
            test10_1(b, false, false);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   435
            test10_1(c, false, false);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   436
            test10_2(a, true, false);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   437
            test10_3(o, true);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   438
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   439
        return true;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   440
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   441
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   442
    // stable:TypeSpeculation$B:TopPTR *,iid=top[int:max..0]:TopPTR *,iid=top
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   443
    // meets
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   444
    // java/lang/Object:AnyNull:exact *,iid=top
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   445
    static void test11_3(Object o) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   446
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   447
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   448
    static void test11_2(Object o, boolean b) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   449
        if (b) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   450
            test11_3(o);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   451
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   452
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   453
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   454
    static void test11_1(B[] b, boolean bb) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   455
        test11_2(b, bb);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   456
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   457
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   458
    static boolean test11() {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   459
        Object o = new Object();
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   460
        B[] b = new B[10];
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   461
        B[] c = new C[10];
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   462
        for (int i = 0; i < 20000; i++) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   463
            test11_1(b, false);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   464
            test11_1(c, false);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   465
            test11_2(o, true);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   466
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   467
        return true;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   468
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   469
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   470
    // TypeSpeculation$I *
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   471
    // meets
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   472
    // java/lang/Object:AnyNull *,iid=top
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   473
    static void test12_3(Object o) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   474
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   475
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   476
    static void test12_2(Object o, boolean b) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   477
        if (b) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   478
            test12_3(o);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   479
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   480
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   481
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   482
    static void test12_1(I i, boolean b) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   483
        test12_2(i, b);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   484
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   485
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   486
    static boolean test12() {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   487
        Object o = new Object();
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   488
        B b = new B();
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   489
        C c = new C();
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   490
        for (int i = 0; i < 20000; i++) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   491
            test12_1(b, false);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   492
            test12_1(c, false);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   493
            test12_2(o, true);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   494
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   495
        return true;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   496
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   497
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   498
    // stable:bottom[int:max..0]:NotNull *
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   499
    // meets
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   500
    // stable:TypeSpeculation$A:TopPTR *,iid=top[int:max..0]:AnyNull:exact *,iid=top
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   501
    static Object test13_3(Object o, boolean b) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   502
        Object oo;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   503
        if (b) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   504
            oo = o;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   505
        } else {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   506
            oo = new A[10];
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   507
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   508
        return oo;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   509
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   510
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   511
    static void test13_2(Object o, boolean b1, boolean b2) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   512
        if (b1) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   513
            test13_3(o, b2);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   514
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   515
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   516
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   517
    static void test13_1(B[] b, boolean b1, boolean b2) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   518
        test13_2(b, b1, b2);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   519
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   520
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   521
    static boolean test13() {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   522
        A[] a = new A[10];
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   523
        B[] b = new B[10];
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   524
        B[] c = new C[10];
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   525
        for (int i = 0; i < 20000; i++) {
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   526
            test13_1(b, false, false);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   527
            test13_1(c, false, false);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   528
            test13_2(a, true, (i%2) == 0);
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   529
        }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   530
        return true;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   531
    }
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   532
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   533
    static public void main(String[] args) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   534
        boolean success = true;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   535
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   536
        success = test1() && success;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   537
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   538
        success = test2() && success;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   539
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   540
        success = test3() && success;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   541
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   542
        success = test4() && success;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   543
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   544
        success = test5() && success;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   545
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   546
        success = test6() && success;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   547
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   548
        success = test7() && success;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   549
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   550
        success = test8() && success;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   551
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   552
        success = test9() && success;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   553
22237
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   554
        success = test10() && success;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   555
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   556
        success = test11() && success;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   557
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   558
        success = test12() && success;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   559
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   560
        success = test13() && success;
e9d7daf0d91b 8028536: Test cases to cover type system fixes pushed with 8024070
roland
parents: 21099
diff changeset
   561
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   562
        if (success) {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   563
            System.out.println("TEST PASSED");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   564
        } else {
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   565
            throw new RuntimeException("TEST FAILED: erroneous bound check elimination");
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   566
        }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   567
    }
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents:
diff changeset
   568
}