src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/inlining/PolymorphicInliningTest.java
author dlong
Fri, 01 Dec 2017 11:17:45 -0800
changeset 48190 25cfedf27edc
child 50858 2d3e99a72541
permissions -rw-r--r--
8192814: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48190
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
     1
/*
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
     2
 * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
     4
 *
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
     7
 * published by the Free Software Foundation.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
     8
 *
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    13
 * accompanied this code).
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    14
 *
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    18
 *
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    21
 * questions.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    22
 */
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    23
package org.graalvm.compiler.core.test.inlining;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    24
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    25
import static org.graalvm.compiler.test.SubprocessUtil.getVMCommandLine;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    26
import static org.graalvm.compiler.test.SubprocessUtil.java;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    27
import static org.graalvm.compiler.test.SubprocessUtil.withoutDebuggerArguments;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    28
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    29
import jdk.vm.ci.meta.ResolvedJavaMethod;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    30
import org.graalvm.compiler.core.test.GraalCompilerTest;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    31
import org.graalvm.compiler.debug.DebugContext;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    32
import org.graalvm.compiler.debug.DebugDumpScope;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    33
import org.graalvm.compiler.graph.Node;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    34
import org.graalvm.compiler.nodes.DeoptimizeNode;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    35
import org.graalvm.compiler.nodes.InvokeNode;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    36
import org.graalvm.compiler.nodes.StructuredGraph;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    37
import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    38
import org.graalvm.compiler.nodes.StructuredGraph.Builder;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    39
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    40
import org.graalvm.compiler.nodes.java.TypeSwitchNode;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    41
import org.graalvm.compiler.phases.OptimisticOptimizations;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    42
import org.graalvm.compiler.phases.PhaseSuite;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    43
import org.graalvm.compiler.phases.common.CanonicalizerPhase;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    44
import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    45
import org.graalvm.compiler.phases.common.inlining.InliningPhase;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    46
import org.graalvm.compiler.phases.tiers.HighTierContext;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    47
import org.graalvm.compiler.test.SubprocessUtil;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    48
import org.junit.Assert;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    49
import org.junit.Test;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    50
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    51
import java.io.IOException;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    52
import java.util.List;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    53
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    54
public class PolymorphicInliningTest extends GraalCompilerTest {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    55
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    56
    @Test
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    57
    public void testInSubprocess() throws InterruptedException, IOException {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    58
        String recursionPropName = getClass().getName() + ".recursion";
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    59
        if (Boolean.getBoolean(recursionPropName)) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    60
            testPolymorphicInlining();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    61
            testPolymorphicNotInlining();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    62
            testMegamorphicInlining();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    63
            testMegamorphicNotInlining();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    64
        } else {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    65
            List<String> vmArgs = withoutDebuggerArguments(getVMCommandLine());
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    66
            NotInlinableSubClass.class.getCanonicalName();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    67
            vmArgs.add("-XX:CompileCommand=dontinline,org/graalvm/compiler/core/test/inlining/PolymorphicInliningTest$NotInlinableSubClass.publicOverriddenMethod");
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    68
            vmArgs.add("-D" + recursionPropName + "=true");
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    69
            SubprocessUtil.Subprocess proc = java(vmArgs, "com.oracle.mxtool.junit.MxJUnitWrapper", getClass().getName());
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    70
            if (proc.exitCode != 0) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    71
                Assert.fail(String.format("non-zero exit code %d for command:%n%s", proc.exitCode, proc));
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    72
            }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    73
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    74
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    75
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    76
    public int polymorphicCallsite(SuperClass receiver) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    77
        return receiver.publicOverriddenMethod();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    78
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    79
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    80
    public void testPolymorphicInlining() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    81
        for (int i = 0; i < 10000; i++) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    82
            if (i % 2 == 0) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    83
                polymorphicCallsite(Receivers.subClassA);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    84
            } else {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    85
                polymorphicCallsite(Receivers.subClassB);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    86
            }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    87
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    88
        StructuredGraph graph = getGraph("polymorphicCallsite", false);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    89
        // This callsite should be inlined with a TypeCheckedInliningViolated deoptimization.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    90
        assertTrue(getNodeCount(graph, InvokeNode.class) == 0);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    91
        assertTrue(getNodeCount(graph, TypeSwitchNode.class) == 1);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    92
        assertTrue(getNodeCount(graph, DeoptimizeNode.class) >= 1);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    93
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    94
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    95
    /**
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    96
     * This snippet is identical to {@link #polymorphicCallsite(SuperClass)}, and is for avoiding
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    97
     * interference of the receiver type profile from different unit tests.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    98
     */
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
    99
    public int polymorphicCallsite1(SuperClass receiver) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   100
        return receiver.publicOverriddenMethod();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   101
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   102
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   103
    public void testPolymorphicNotInlining() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   104
        for (int i = 0; i < 10000; i++) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   105
            if (i % 2 == 0) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   106
                polymorphicCallsite1(Receivers.subClassA);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   107
            } else {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   108
                polymorphicCallsite1(Receivers.notInlinableSubClass);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   109
            }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   110
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   111
        StructuredGraph graph = getGraph("polymorphicCallsite1", false);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   112
        // This callsite should not be inlined due to one of the potential callee method is not
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   113
        // inlinable.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   114
        assertTrue(getNodeCount(graph, InvokeNode.class) == 1);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   115
        assertTrue(getNodeCount(graph, TypeSwitchNode.class) == 0);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   116
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   117
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   118
    /**
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   119
     * This snippet is identical to {@link #polymorphicCallsite(SuperClass)}, and is for avoiding
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   120
     * interference of the receiver type profile from different unit tests.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   121
     */
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   122
    public int polymorphicCallsite2(SuperClass receiver) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   123
        return receiver.publicOverriddenMethod();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   124
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   125
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   126
    public void testMegamorphicInlining() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   127
        // Construct a receiver type profile that exceeds the max type width (by default 8 in JVMCI,
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   128
        // specified by -XX:TypeProfileWidth).
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   129
        for (int i = 0; i < 2000; i++) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   130
            // Ensure the following receiver type is within the type profile.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   131
            polymorphicCallsite2(Receivers.subClassA);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   132
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   133
        for (int i = 0; i < 10000; i++) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   134
            switch (i % 20) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   135
                case 0:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   136
                case 1:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   137
                case 2:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   138
                case 3:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   139
                case 4:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   140
                case 5:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   141
                case 6:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   142
                case 7:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   143
                    // Probability: 40%
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   144
                    // Ensure the probability is greater than
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   145
                    // GraalOptions.MegamorphicInliningMinMethodProbability (by default 0.33D);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   146
                    polymorphicCallsite2(Receivers.subClassA);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   147
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   148
                case 8:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   149
                    polymorphicCallsite2(Receivers.subClassB);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   150
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   151
                case 9:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   152
                    polymorphicCallsite2(Receivers.subClassC);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   153
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   154
                case 10:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   155
                    polymorphicCallsite2(Receivers.subClassD);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   156
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   157
                case 11:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   158
                    polymorphicCallsite2(Receivers.subClassE);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   159
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   160
                case 12:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   161
                    polymorphicCallsite2(Receivers.subClassF);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   162
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   163
                case 13:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   164
                    polymorphicCallsite2(Receivers.subClassG);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   165
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   166
                case 14:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   167
                    polymorphicCallsite2(Receivers.subClassH);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   168
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   169
                default:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   170
                    // Probability: 25%
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   171
                    polymorphicCallsite2(Receivers.notInlinableSubClass);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   172
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   173
            }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   174
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   175
        StructuredGraph graph = getGraph("polymorphicCallsite2", false);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   176
        // This callsite should be inlined with a fallback invocation.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   177
        assertTrue(getNodeCount(graph, InvokeNode.class) == 1);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   178
        assertTrue(getNodeCount(graph, TypeSwitchNode.class) == 1);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   179
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   180
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   181
    /**
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   182
     * This snippet is identical to {@link #polymorphicCallsite(SuperClass)}, and is for avoiding
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   183
     * interference of the receiver type profile from different unit tests.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   184
     */
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   185
    public int polymorphicCallsite3(SuperClass receiver) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   186
        return receiver.publicOverriddenMethod();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   187
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   188
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   189
    public void testMegamorphicNotInlining() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   190
        for (int i = 0; i < 10000; i++) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   191
            switch (i % 10) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   192
                case 0:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   193
                case 1:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   194
                    polymorphicCallsite3(Receivers.subClassA);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   195
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   196
                case 2:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   197
                    polymorphicCallsite3(Receivers.subClassB);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   198
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   199
                case 3:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   200
                    polymorphicCallsite3(Receivers.subClassC);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   201
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   202
                case 4:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   203
                    polymorphicCallsite3(Receivers.subClassD);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   204
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   205
                case 5:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   206
                    polymorphicCallsite3(Receivers.subClassE);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   207
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   208
                case 6:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   209
                    polymorphicCallsite3(Receivers.subClassF);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   210
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   211
                case 7:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   212
                    polymorphicCallsite3(Receivers.subClassG);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   213
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   214
                case 8:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   215
                    polymorphicCallsite3(Receivers.subClassH);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   216
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   217
                default:
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   218
                    polymorphicCallsite3(Receivers.notInlinableSubClass);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   219
                    break;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   220
            }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   221
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   222
        StructuredGraph graph = getGraph("polymorphicCallsite3", false);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   223
        // This callsite should not be inlined due to non of the potential callee method exceeds the
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   224
        // probability specified by GraalOptions.MegamorphicInliningMinMethodProbability.
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   225
        assertTrue(getNodeCount(graph, InvokeNode.class) == 1);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   226
        assertTrue(getNodeCount(graph, TypeSwitchNode.class) == 0);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   227
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   228
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   229
    @SuppressWarnings("try")
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   230
    private StructuredGraph getGraph(final String snippet, final boolean eagerInfopointMode) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   231
        DebugContext debug = getDebugContext();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   232
        try (DebugContext.Scope s = debug.scope("InliningTest", new DebugDumpScope(snippet, true))) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   233
            ResolvedJavaMethod method = getResolvedJavaMethod(snippet);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   234
            Builder builder = builder(method, AllowAssumptions.YES, debug);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   235
            StructuredGraph graph = eagerInfopointMode ? parse(builder, getDebugGraphBuilderSuite()) : parse(builder, getEagerGraphBuilderSuite());
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   236
            try (DebugContext.Scope s2 = debug.scope("Inlining", graph)) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   237
                PhaseSuite<HighTierContext> graphBuilderSuite = eagerInfopointMode
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   238
                                ? getCustomGraphBuilderSuite(GraphBuilderConfiguration.getDefault(getDefaultGraphBuilderPlugins()).withFullInfopoints(true))
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   239
                                : getDefaultGraphBuilderSuite();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   240
                HighTierContext context = new HighTierContext(getProviders(), graphBuilderSuite, OptimisticOptimizations.ALL);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   241
                debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph");
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   242
                new CanonicalizerPhase().apply(graph, context);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   243
                new InliningPhase(new CanonicalizerPhase()).apply(graph, context);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   244
                debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph");
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   245
                new CanonicalizerPhase().apply(graph, context);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   246
                new DeadCodeEliminationPhase().apply(graph);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   247
                return graph;
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   248
            }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   249
        } catch (Throwable e) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   250
            throw debug.handle(e);
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   251
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   252
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   253
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   254
    private static int getNodeCount(StructuredGraph graph, Class<? extends Node> nodeClass) {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   255
        return graph.getNodes().filter(nodeClass).count();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   256
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   257
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   258
    private static final class Receivers {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   259
        static final SubClassA subClassA = new SubClassA();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   260
        static final SubClassB subClassB = new SubClassB();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   261
        static final SubClassC subClassC = new SubClassC();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   262
        static final SubClassD subClassD = new SubClassD();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   263
        static final SubClassE subClassE = new SubClassE();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   264
        static final SubClassF subClassF = new SubClassF();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   265
        static final SubClassG subClassG = new SubClassG();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   266
        static final SubClassH subClassH = new SubClassH();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   267
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   268
        static final NotInlinableSubClass notInlinableSubClass = new NotInlinableSubClass();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   269
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   270
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   271
    private abstract static class SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   272
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   273
        public abstract int publicOverriddenMethod();
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   274
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   275
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   276
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   277
    private static class SubClassA extends SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   278
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   279
        @Override
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   280
        public int publicOverriddenMethod() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   281
            return 'A';
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   282
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   283
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   284
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   285
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   286
    private static class SubClassB extends SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   287
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   288
        @Override
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   289
        public int publicOverriddenMethod() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   290
            return 'B';
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   291
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   292
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   293
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   294
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   295
    private static class SubClassC extends SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   296
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   297
        @Override
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   298
        public int publicOverriddenMethod() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   299
            return 'C';
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   300
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   301
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   302
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   303
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   304
    private static class SubClassD extends SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   305
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   306
        @Override
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   307
        public int publicOverriddenMethod() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   308
            return 'D';
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   309
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   310
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   311
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   312
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   313
    private static class SubClassE extends SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   314
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   315
        @Override
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   316
        public int publicOverriddenMethod() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   317
            return 'E';
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   318
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   319
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   320
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   321
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   322
    private static class SubClassF extends SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   323
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   324
        @Override
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   325
        public int publicOverriddenMethod() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   326
            return 'F';
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   327
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   328
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   329
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   330
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   331
    private static class SubClassG extends SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   332
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   333
        @Override
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   334
        public int publicOverriddenMethod() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   335
            return 'G';
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   336
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   337
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   338
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   339
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   340
    private static class SubClassH extends SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   341
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   342
        @Override
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   343
        public int publicOverriddenMethod() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   344
            return 'H';
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   345
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   346
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   347
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   348
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   349
    private static final class NotInlinableSubClass extends SuperClass {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   350
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   351
        @Override
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   352
        public int publicOverriddenMethod() {
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   353
            return 'X';
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   354
        }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   355
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   356
    }
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   357
25cfedf27edc 8192814: Update Graal
dlong
parents:
diff changeset
   358
}