# HG changeset patch # User Christian Haeubl # Date 1370607338 -7200 # Node ID 81b298e0868bd17c5e444d0c55b44290ce7fcdc5 # Parent fe9a97ee352b4204d94387768438771841241f6a# Parent 44fcf49b746f1cb081d19028b945666560868d4d Merge. diff -r 44fcf49b746f -r 81b298e0868b graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/AbstractJavaProfile.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/AbstractJavaProfile.java Fri Jun 07 10:52:48 2013 +0200 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/AbstractJavaProfile.java Fri Jun 07 14:15:38 2013 +0200 @@ -25,10 +25,14 @@ import java.io.*; /** - * This profile object represents a certain set of profiling information at a specific BCI. The - * precision of the supplied values may vary, but a runtime that provides this information should be - * aware that it will be used to guide performance-critical decisions like speculative inlining, - * etc. + * This object holds probability information for a set of items that were profiled at a specific + * BCI. The precision of the supplied values may vary, but a runtime that provides this information + * should be aware that it will be used to guide performance-critical decisions like speculative + * inlining, etc. + * + * @param a subclass of AbstractProfiledItem + * @param the class of the items that are profiled at the specific BCI and for which + * probabilities are stored. E.g., a ResolvedJavaType or a ResolvedJavaMethod. */ public abstract class AbstractJavaProfile, U> implements Serializable { diff -r 44fcf49b746f -r 81b298e0868b graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ProfilingInfoTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ProfilingInfoTest.java Fri Jun 07 10:52:48 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ProfilingInfoTest.java Fri Jun 07 14:15:38 2013 +0200 @@ -128,7 +128,11 @@ } public static Serializable checkCastSnippet(Object obj) { - return (Serializable) obj; + try { + return (Serializable) obj; + } catch (ClassCastException e) { + return null; + } } @Test @@ -250,19 +254,30 @@ @Test public void testNullSeen() { - ProfilingInfo info = profile("instanceOfSnippet", 1); + testNullSeen("instanceOfSnippet"); + testNullSeen("checkCastSnippet"); + } + + private void testNullSeen(String snippet) { + ProfilingInfo info = profile(snippet, 1); Assert.assertEquals(TriState.FALSE, info.getNullSeen(1)); - continueProfiling("instanceOfSnippet", "ABC"); + continueProfiling(snippet, "ABC"); Assert.assertEquals(TriState.FALSE, info.getNullSeen(1)); - continueProfiling("instanceOfSnippet", (Object) null); + continueProfiling(snippet, new Object()); + Assert.assertEquals(TriState.FALSE, info.getNullSeen(1)); + + continueProfiling(snippet, (Object) null); Assert.assertEquals(TriState.TRUE, info.getNullSeen(1)); - continueProfiling("instanceOfSnippet", 0.0); + continueProfiling(snippet, 0.0); Assert.assertEquals(TriState.TRUE, info.getNullSeen(1)); - resetProfile("instanceOfSnippet"); + continueProfiling(snippet, new Object()); + Assert.assertEquals(TriState.TRUE, info.getNullSeen(1)); + + resetProfile(snippet); Assert.assertEquals(TriState.FALSE, info.getNullSeen(1)); } diff -r 44fcf49b746f -r 81b298e0868b graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InlineableElement.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InlineableElement.java Fri Jun 07 10:52:48 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.nodes; - -public interface InlineableElement { - - int getNodeCount(); - - Iterable getInvokes(); -} diff -r 44fcf49b746f -r 81b298e0868b graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Fri Jun 07 10:52:48 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Fri Jun 07 14:15:38 2013 +0200 @@ -35,7 +35,7 @@ * A graph that contains at least one distinguished node : the {@link #start() start} node. This * node is the start of the control flow of the graph. */ -public class StructuredGraph extends Graph implements InlineableElement { +public class StructuredGraph extends Graph { public static final int INVOCATION_ENTRY_BCI = -1; public static final long INVALID_GRAPH_ID = -1; diff -r 44fcf49b746f -r 81b298e0868b graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Fri Jun 07 10:52:48 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Fri Jun 07 14:15:38 2013 +0200 @@ -40,7 +40,9 @@ import com.oracle.graal.phases.PhasePlan.PhasePosition; import com.oracle.graal.phases.common.CanonicalizerPhase.CustomCanonicalizer; import com.oracle.graal.phases.common.InliningUtil.InlineInfo; +import com.oracle.graal.phases.common.InliningUtil.Inlineable; import com.oracle.graal.phases.common.InliningUtil.InlineableMacroNode; +import com.oracle.graal.phases.common.InliningUtil.InlineableGraph; import com.oracle.graal.phases.common.InliningUtil.InliningPolicy; import com.oracle.graal.phases.graph.*; @@ -154,10 +156,10 @@ MethodInvocation calleeInvocation = data.pushInvocation(info, parentAssumptions, invokeProbability, invokeRelevance); for (int i = 0; i < info.numberOfMethods(); i++) { - InlineableElement elem = getInlineableElement(info.methodAt(i), info.invoke(), calleeInvocation.assumptions()); + Inlineable elem = getInlineableElement(info.methodAt(i), info.invoke(), calleeInvocation.assumptions()); info.setInlinableElement(i, elem); - if (elem instanceof StructuredGraph) { - data.pushGraph((StructuredGraph) elem, invokeProbability * info.probabilityAt(i), invokeRelevance * info.relevanceAt(i)); + if (elem instanceof InlineableGraph) { + data.pushGraph(((InlineableGraph) elem).getGraph(), invokeProbability * info.probabilityAt(i), invokeRelevance * info.relevanceAt(i)); } else { assert elem instanceof InlineableMacroNode; data.pushDummyGraph(); @@ -215,12 +217,12 @@ } } - private InlineableElement getInlineableElement(final ResolvedJavaMethod method, Invoke invoke, Assumptions assumptions) { + private Inlineable getInlineableElement(final ResolvedJavaMethod method, Invoke invoke, Assumptions assumptions) { Class macroNodeClass = InliningUtil.getMacroNodeClass(replacements, method); if (macroNodeClass != null) { return new InlineableMacroNode(macroNodeClass); } else { - return buildGraph(method, invoke, assumptions); + return new InlineableGraph(buildGraph(method, invoke, assumptions)); } } @@ -387,7 +389,7 @@ protected static int determineNodeCount(InlineInfo info) { int nodes = 0; for (int i = 0; i < info.numberOfMethods(); i++) { - InlineableElement elem = info.inlineableElementAt(i); + Inlineable elem = info.inlineableElementAt(i); if (elem != null) { nodes += elem.getNodeCount(); } @@ -398,10 +400,10 @@ protected static double determineInvokeProbability(InlineInfo info) { double invokeProbability = 0; for (int i = 0; i < info.numberOfMethods(); i++) { - InlineableElement callee = info.inlineableElementAt(i); + Inlineable callee = info.inlineableElementAt(i); Iterable invokes = callee.getInvokes(); if (invokes.iterator().hasNext()) { - NodesToDoubles nodeProbabilities = new ComputeProbabilityClosure((StructuredGraph) callee).apply(); + NodesToDoubles nodeProbabilities = new ComputeProbabilityClosure(((InlineableGraph) callee).getGraph()).apply(); for (Invoke invoke : invokes) { invokeProbability += nodeProbabilities.get(invoke.asNode()); } diff -r 44fcf49b746f -r 81b298e0868b graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Fri Jun 07 10:52:48 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Fri Jun 07 14:15:38 2013 +0200 @@ -66,7 +66,37 @@ boolean isWorthInlining(InlineInfo info, int inliningDepth, double probability, double relevance, boolean fullyProcessed); } - public static class InlineableMacroNode implements InlineableElement { + public interface Inlineable { + + int getNodeCount(); + + Iterable getInvokes(); + } + + public static class InlineableGraph implements Inlineable { + + private final StructuredGraph graph; + + public InlineableGraph(StructuredGraph graph) { + this.graph = graph; + } + + @Override + public int getNodeCount() { + return graph.getNodeCount(); + } + + @Override + public Iterable getInvokes() { + return graph.getInvokes(); + } + + public StructuredGraph getGraph() { + return graph; + } + } + + public static class InlineableMacroNode implements Inlineable { private final Class macroNodeClass; @@ -238,13 +268,13 @@ ResolvedJavaMethod methodAt(int index); - InlineableElement inlineableElementAt(int index); + Inlineable inlineableElementAt(int index); double probabilityAt(int index); double relevanceAt(int index); - void setInlinableElement(int index, InlineableElement inlineableElement); + void setInlinableElement(int index, Inlineable inlineableElement); /** * Performs the inlining described by this object and returns the node that represents the @@ -277,10 +307,10 @@ return invoke; } - protected static void inline(Invoke invoke, ResolvedJavaMethod concrete, InlineableElement inlineable, Assumptions assumptions, boolean receiverNullCheck) { + protected static void inline(Invoke invoke, ResolvedJavaMethod concrete, Inlineable inlineable, Assumptions assumptions, boolean receiverNullCheck) { StructuredGraph graph = invoke.asNode().graph(); - if (inlineable instanceof StructuredGraph) { - StructuredGraph calleeGraph = (StructuredGraph) inlineable; + if (inlineable instanceof InlineableGraph) { + StructuredGraph calleeGraph = ((InlineableGraph) inlineable).getGraph(); InliningUtil.inline(invoke, calleeGraph, receiverNullCheck); graph.getLeafGraphIds().add(calleeGraph.graphId()); @@ -331,7 +361,7 @@ private static class ExactInlineInfo extends AbstractInlineInfo { protected final ResolvedJavaMethod concrete; - private InlineableElement inlineableElement; + private Inlineable inlineableElement; public ExactInlineInfo(Invoke invoke, ResolvedJavaMethod concrete) { super(invoke); @@ -377,13 +407,13 @@ } @Override - public InlineableElement inlineableElementAt(int index) { + public Inlineable inlineableElementAt(int index) { assert index == 0; return inlineableElement; } @Override - public void setInlinableElement(int index, InlineableElement inlineableElement) { + public void setInlinableElement(int index, Inlineable inlineableElement) { assert index == 0; this.inlineableElement = inlineableElement; } @@ -398,7 +428,7 @@ private final ResolvedJavaMethod concrete; private final ResolvedJavaType type; - private InlineableElement inlineableElement; + private Inlineable inlineableElement; public TypeGuardInlineInfo(Invoke invoke, ResolvedJavaMethod concrete, ResolvedJavaType type) { super(invoke); @@ -418,7 +448,7 @@ } @Override - public InlineableElement inlineableElementAt(int index) { + public Inlineable inlineableElementAt(int index) { assert index == 0; return inlineableElement; } @@ -436,7 +466,7 @@ } @Override - public void setInlinableElement(int index, InlineableElement inlineableElement) { + public void setInlinableElement(int index, Inlineable inlineableElement) { assert index == 0; this.inlineableElement = inlineableElement; } @@ -491,7 +521,7 @@ private final ArrayList ptypes; private final ArrayList concretesProbabilities; private final double notRecordedTypeProbability; - private final InlineableElement[] inlineableElements; + private final Inlineable[] inlineableElements; public MultiTypeGuardInlineInfo(Invoke invoke, ArrayList concretes, ArrayList concretesProbabilities, ArrayList ptypes, ArrayList typesToConcretes, double notRecordedTypeProbability) { @@ -504,7 +534,7 @@ this.ptypes = ptypes; this.typesToConcretes = typesToConcretes; this.notRecordedTypeProbability = notRecordedTypeProbability; - this.inlineableElements = new InlineableElement[concretes.size()]; + this.inlineableElements = new Inlineable[concretes.size()]; this.methodProbabilities = computeMethodProbabilities(); this.maximumMethodProbability = maximumMethodProbability(); assert maximumMethodProbability > 0; @@ -540,7 +570,7 @@ } @Override - public InlineableElement inlineableElementAt(int index) { + public Inlineable inlineableElementAt(int index) { assert index >= 0 && index < concretes.size(); return inlineableElements[index]; } @@ -556,7 +586,7 @@ } @Override - public void setInlinableElement(int index, InlineableElement inlineableElement) { + public void setInlinableElement(int index, Inlineable inlineableElement) { assert index >= 0 && index < concretes.size(); inlineableElements[index] = inlineableElement; } @@ -907,16 +937,12 @@ @Override public void tryToDevirtualizeInvoke(MetaAccessProvider runtime, Assumptions assumptions) { if (hasSingleMethod()) { - tryToDevirtualizeSingleMethod(graph(), runtime); + devirtualizeWithTypeSwitch(graph(), InvokeKind.Special, concretes.get(0), runtime); } else { tryToDevirtualizeMultipleMethods(graph(), runtime); } } - private void tryToDevirtualizeSingleMethod(StructuredGraph graph, MetaAccessProvider runtime) { - devirtualizeWithTypeSwitch(graph, InvokeKind.Special, concretes.get(0), runtime); - } - private void tryToDevirtualizeMultipleMethods(StructuredGraph graph, MetaAccessProvider runtime) { MethodCallTargetNode methodCallTarget = (MethodCallTargetNode) invoke.callTarget(); if (methodCallTarget.invokeKind() == InvokeKind.Interface) { diff -r 44fcf49b746f -r 81b298e0868b src/share/vm/code/nmethod.cpp