Mercurial > hg > graal-compiler
changeset 16058:45bd621d9bb9
Merge
author | Miguel Garcia <miguel.m.garcia@oracle.com> |
---|---|
date | Fri, 06 Jun 2014 12:16:45 +0200 |
parents | 83efd0e68a4a (diff) 87e11e4c031f (current diff) |
children | bab1a955411e |
files | |
diffstat | 4 files changed, 47 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/AbstractInlineInfo.java Fri Jun 06 11:17:29 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/AbstractInlineInfo.java Fri Jun 06 12:16:45 2014 +0200 @@ -28,10 +28,15 @@ import com.oracle.graal.api.meta.ResolvedJavaMethod; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.phases.common.CanonicalizerPhase; import com.oracle.graal.phases.common.inlining.InliningUtil; import com.oracle.graal.phases.common.inlining.info.elem.Inlineable; import com.oracle.graal.phases.common.inlining.info.elem.InlineableMacroNode; import com.oracle.graal.phases.common.inlining.info.elem.InlineableGraph; +import com.oracle.graal.phases.common.inlining.walker.CallsiteHolder; +import com.oracle.graal.phases.common.inlining.walker.CallsiteHolderDummy; +import com.oracle.graal.phases.common.inlining.walker.CallsiteHolderExplorable; +import com.oracle.graal.phases.tiers.HighTierContext; public abstract class AbstractInlineInfo implements InlineInfo { @@ -80,4 +85,22 @@ } } } + + public final void populateInlinableElements(HighTierContext context, Assumptions calleeAssumptions, CanonicalizerPhase canonicalizer) { + for (int i = 0; i < numberOfMethods(); i++) { + Inlineable elem = Inlineable.getInlineableElement(methodAt(i), invoke, context.replaceAssumptions(calleeAssumptions), canonicalizer); + setInlinableElement(i, elem); + } + } + + public final CallsiteHolder buildCallsiteHolderForElement(int index, double invokeProbability, double invokeRelevance) { + Inlineable elem = inlineableElementAt(index); + if (elem instanceof InlineableGraph) { + InlineableGraph ig = (InlineableGraph) elem; + return new CallsiteHolderExplorable(ig.getGraph(), invokeProbability * probabilityAt(index), invokeRelevance * relevanceAt(index)); + } else { + assert elem instanceof InlineableMacroNode; + return CallsiteHolderDummy.DUMMY_CALLSITE_HOLDER; + } + } }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/InlineInfo.java Fri Jun 06 11:17:29 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/InlineInfo.java Fri Jun 06 12:16:45 2014 +0200 @@ -30,7 +30,10 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.Invoke; import com.oracle.graal.nodes.StructuredGraph; +import com.oracle.graal.phases.common.CanonicalizerPhase; import com.oracle.graal.phases.common.inlining.info.elem.Inlineable; +import com.oracle.graal.phases.common.inlining.walker.CallsiteHolder; +import com.oracle.graal.phases.tiers.HighTierContext; import com.oracle.graal.phases.util.Providers; /** @@ -82,4 +85,8 @@ void tryToDevirtualizeInvoke(MetaAccessProvider metaAccess, Assumptions assumptions); boolean shouldInline(); + + void populateInlinableElements(HighTierContext context, Assumptions calleeAssumptions, CanonicalizerPhase canonicalizer); + + CallsiteHolder buildCallsiteHolderForElement(int index, double invokeProbability, double invokeRelevance); }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/CallsiteHolderDummy.java Fri Jun 06 11:17:29 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/CallsiteHolderDummy.java Fri Jun 06 12:16:45 2014 +0200 @@ -33,7 +33,10 @@ */ public final class CallsiteHolderDummy extends CallsiteHolder { - public CallsiteHolderDummy() { + public static final CallsiteHolderDummy DUMMY_CALLSITE_HOLDER = new CallsiteHolderDummy(); + + private CallsiteHolderDummy() { + // no instances other than the singleton } @Override
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java Fri Jun 06 11:17:29 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java Fri Jun 06 12:16:45 2014 +0200 @@ -51,6 +51,7 @@ import java.util.function.ToDoubleFunction; import static com.oracle.graal.compiler.common.GraalOptions.*; +import static com.oracle.graal.phases.common.inlining.walker.CallsiteHolderDummy.DUMMY_CALLSITE_HOLDER; /** * Holds the data for building the callee graphs recursively: graphs and invocations (each @@ -58,7 +59,6 @@ */ public class InliningData { - private static final CallsiteHolder DUMMY_CALLSITE_HOLDER = new CallsiteHolderDummy(); // Metrics private static final DebugMetric metricInliningPerformed = Debug.metric("InliningPerformed"); private static final DebugMetric metricInliningRuns = Debug.metric("InliningRuns"); @@ -88,7 +88,7 @@ Assumptions rootAssumptions = context.getAssumptions(); invocationQueue.push(new MethodInvocation(null, rootAssumptions, 1.0, 1.0)); - pushExplorableGraph(rootGraph, 1.0, 1.0); + graphQueue.push(new CallsiteHolderExplorable(rootGraph, 1.0, 1.0)); } private String checkTargetConditionsHelper(ResolvedJavaMethod method) { @@ -378,7 +378,8 @@ /** * @return true iff inlining was actually performed */ - private boolean tryToInline(CallsiteHolderExplorable callerCallsiteHolder, MethodInvocation calleeInvocation, MethodInvocation parentInvocation, int inliningDepth) { + private boolean tryToInline(MethodInvocation calleeInvocation, MethodInvocation parentInvocation, int inliningDepth) { + CallsiteHolderExplorable callerCallsiteHolder = (CallsiteHolderExplorable) currentGraph(); InlineInfo calleeInfo = calleeInvocation.callee(); assert callerCallsiteHolder.containsInvoke(calleeInfo.invoke()); Assumptions callerAssumptions = parentInvocation.assumptions(); @@ -404,10 +405,11 @@ Invoke invoke = callsiteHolder.popInvoke(); MethodInvocation callerInvocation = currentInvocation(); Assumptions parentAssumptions = callerInvocation.assumptions(); - Assumptions calleeAssumptions = new Assumptions(parentAssumptions.useOptimisticAssumptions()); - InlineInfo info = populateInlineInfo(invoke, parentAssumptions, calleeAssumptions); + InlineInfo info = getInlineInfo(invoke, parentAssumptions); if (info != null) { + Assumptions calleeAssumptions = new Assumptions(parentAssumptions.useOptimisticAssumptions()); + info.populateInlinableElements(context, calleeAssumptions, canonicalizer); double invokeProbability = callsiteHolder.invokeProbability(invoke); double invokeRelevance = callsiteHolder.invokeRelevance(invoke); MethodInvocation methodInvocation = new MethodInvocation(info, calleeAssumptions, invokeProbability, invokeRelevance); @@ -415,34 +417,10 @@ } } - private InlineInfo populateInlineInfo(Invoke invoke, Assumptions parentAssumptions, Assumptions calleeAssumptions) { - InlineInfo info = getInlineInfo(invoke, parentAssumptions); - if (info == null) { - return null; - } - for (int i = 0; i < info.numberOfMethods(); i++) { - Inlineable elem = Inlineable.getInlineableElement(info.methodAt(i), info.invoke(), context.replaceAssumptions(calleeAssumptions), canonicalizer); - info.setInlinableElement(i, elem); - } - return info; - } - public int graphCount() { return graphQueue.size(); } - private void pushExplorableGraph(StructuredGraph graph, double probability, double relevance) { - assert graph != null; - assert !contains(graph); - graphQueue.push(new CallsiteHolderExplorable(graph, probability, relevance)); - assert graphQueue.size() <= maxGraphs; - } - - private void pushDummyGraph() { - graphQueue.push(DUMMY_CALLSITE_HOLDER); - assert graphQueue.size() <= maxGraphs; - } - public boolean hasUnprocessedGraphs() { return !graphQueue.isEmpty(); } @@ -492,13 +470,10 @@ double invokeProbability = methodInvocation.probability(); double invokeRelevance = methodInvocation.relevance(); for (int i = 0; i < info.numberOfMethods(); i++) { - Inlineable elem = info.inlineableElementAt(i); - if (elem instanceof InlineableGraph) { - pushExplorableGraph(((InlineableGraph) elem).getGraph(), invokeProbability * info.probabilityAt(i), invokeRelevance * info.relevanceAt(i)); - } else { - assert elem instanceof InlineableMacroNode; - pushDummyGraph(); - } + CallsiteHolder ch = info.buildCallsiteHolderForElement(i, invokeProbability, invokeRelevance); + assert (ch == DUMMY_CALLSITE_HOLDER) || !contains(ch.graph()); + graphQueue.push(ch); + assert graphQueue.size() <= maxGraphs; } } @@ -546,6 +521,7 @@ } private boolean contains(StructuredGraph graph) { + assert graph != null; for (CallsiteHolder info : graphQueue) { if (info.graph() == graph) { return true; @@ -593,7 +569,7 @@ popInvocation(); final MethodInvocation parentInvoke = currentInvocation(); try (Debug.Scope s = Debug.scope("Inlining", inliningContext())) { - return tryToInline((CallsiteHolderExplorable) currentGraph(), currentInvocation, parentInvoke, inliningDepth() + 1); + return tryToInline(currentInvocation, parentInvoke, inliningDepth() + 1); } catch (Throwable e) { throw Debug.handle(e); }