Mercurial > hg > truffle
changeset 17072:e4923262b8c5
Move FixedNodeProbabilityCache into InlineableGraph so it doesn't get too big
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/Inlineable.java Tue Sep 09 11:51:59 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/Inlineable.java Tue Sep 09 11:53:03 2014 +0200 @@ -45,4 +45,6 @@ int getNodeCount(); Iterable<Invoke> getInvokes(); + + double getProbability(Invoke invoke); }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java Tue Sep 09 11:51:59 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java Tue Sep 09 11:53:03 2014 +0200 @@ -35,6 +35,7 @@ import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.common.cfs.*; import com.oracle.graal.phases.common.inlining.*; +import com.oracle.graal.phases.graph.*; import com.oracle.graal.phases.tiers.*; /** @@ -55,6 +56,8 @@ private final StructuredGraph graph; + private FixedNodeProbabilityCache probabilites = new FixedNodeProbabilityCache(); + public InlineableGraph(final ResolvedJavaMethod method, final Invoke invoke, final HighTierContext context, CanonicalizerPhase canonicalizer) { StructuredGraph original = getOriginalGraph(method, context, canonicalizer); // TODO copying the graph is only necessary if it is modified or if it contains any invokes @@ -269,6 +272,11 @@ return graph.getInvokes(); } + @Override + public double getProbability(Invoke invoke) { + return probabilites.applyAsDouble(invoke.asNode()); + } + public StructuredGraph getGraph() { return graph; }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableMacroNode.java Tue Sep 09 11:51:59 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableMacroNode.java Tue Sep 09 11:53:03 2014 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.phases.common.inlining.info.elem; +import com.oracle.graal.compiler.common.*; import com.oracle.graal.nodes.FixedWithNextNode; import com.oracle.graal.nodes.Invoke; @@ -48,4 +49,8 @@ public Class<? extends FixedWithNextNode> getMacroNodeClass() { return macroNodeClass; } + + public double getProbability(Invoke invoke) { + throw GraalInternalError.shouldNotReachHere("No invokes in inlineable"); + } }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/AbstractInliningPolicy.java Tue Sep 09 11:51:59 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/AbstractInliningPolicy.java Tue Sep 09 11:53:03 2014 +0200 @@ -24,7 +24,6 @@ import com.oracle.graal.api.meta.ProfilingInfo; import com.oracle.graal.api.meta.ResolvedJavaMethod; -import com.oracle.graal.nodes.FixedNode; import com.oracle.graal.nodes.Invoke; import com.oracle.graal.nodes.StructuredGraph; import com.oracle.graal.nodes.spi.Replacements; @@ -33,7 +32,6 @@ import com.oracle.graal.phases.common.inlining.info.elem.Inlineable; import java.util.Map; -import java.util.function.ToDoubleFunction; import static com.oracle.graal.compiler.common.GraalOptions.RelevanceCapForInlining; import static com.oracle.graal.phases.common.inlining.InliningPhase.Options.AlwaysInlineIntrinsics; @@ -100,14 +98,14 @@ return size; } - protected static double determineInvokeProbability(ToDoubleFunction<FixedNode> probabilities, InlineInfo info) { + protected static double determineInvokeProbability(InlineInfo info) { double invokeProbability = 0; for (int i = 0; i < info.numberOfMethods(); i++) { Inlineable callee = info.inlineableElementAt(i); Iterable<Invoke> invokes = callee.getInvokes(); if (invokes.iterator().hasNext()) { for (Invoke invoke : invokes) { - invokeProbability += probabilities.applyAsDouble(invoke.asNode()); + invokeProbability += callee.getProbability(invoke); } } }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/GreedyInliningPolicy.java Tue Sep 09 11:51:59 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/GreedyInliningPolicy.java Tue Sep 09 11:53:03 2014 +0200 @@ -24,7 +24,6 @@ import com.oracle.graal.debug.Debug; import com.oracle.graal.debug.DebugMetric; -import com.oracle.graal.nodes.FixedNode; import com.oracle.graal.nodes.Invoke; import com.oracle.graal.nodes.StructuredGraph; import com.oracle.graal.nodes.spi.Replacements; @@ -33,7 +32,6 @@ import com.oracle.graal.phases.common.inlining.walker.MethodInvocation; import java.util.Map; -import java.util.function.ToDoubleFunction; import static com.oracle.graal.compiler.common.GraalOptions.*; @@ -55,7 +53,7 @@ } @Override - public boolean isWorthInlining(ToDoubleFunction<FixedNode> probabilities, Replacements replacements, MethodInvocation invocation, int inliningDepth, boolean fullyProcessed) { + public boolean isWorthInlining(Replacements replacements, MethodInvocation invocation, int inliningDepth, boolean fullyProcessed) { final InlineInfo info = invocation.callee(); final double probability = invocation.probability(); @@ -97,7 +95,7 @@ * inline those methods but increases bootstrap time (maybe those methods are also getting * queued in the compilation queue concurrently) */ - double invokes = determineInvokeProbability(probabilities, info); + double invokes = determineInvokeProbability(info); if (LimitInlinedInvokes.getValue() > 0 && fullyProcessed && invokes > LimitInlinedInvokes.getValue() * inliningBonus) { InliningUtil.logNotInlinedMethod(info, inliningDepth, "callee invoke probability is too high (invokeP=%f, relevance=%f, probability=%f, bonus=%f, nodes=%d)", invokes, relevance, probability, inliningBonus, nodes);
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/InlineEverythingPolicy.java Tue Sep 09 11:51:59 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/InlineEverythingPolicy.java Tue Sep 09 11:53:03 2014 +0200 @@ -23,13 +23,10 @@ package com.oracle.graal.phases.common.inlining.policy; import com.oracle.graal.api.code.BailoutException; -import com.oracle.graal.nodes.FixedNode; import com.oracle.graal.nodes.StructuredGraph; import com.oracle.graal.nodes.spi.Replacements; import com.oracle.graal.phases.common.inlining.walker.MethodInvocation; -import java.util.function.ToDoubleFunction; - import static com.oracle.graal.compiler.common.GraalOptions.MaximumDesiredSize; public final class InlineEverythingPolicy implements InliningPolicy { @@ -41,7 +38,7 @@ return true; } - public boolean isWorthInlining(ToDoubleFunction<FixedNode> probabilities, Replacements replacements, MethodInvocation invocation, int inliningDepth, boolean fullyProcessed) { + public boolean isWorthInlining(Replacements replacements, MethodInvocation invocation, int inliningDepth, boolean fullyProcessed) { return true; } }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/InliningPolicy.java Tue Sep 09 11:51:59 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/InliningPolicy.java Tue Sep 09 11:53:03 2014 +0200 @@ -22,16 +22,13 @@ */ package com.oracle.graal.phases.common.inlining.policy; -import com.oracle.graal.nodes.FixedNode; import com.oracle.graal.nodes.StructuredGraph; import com.oracle.graal.nodes.spi.Replacements; import com.oracle.graal.phases.common.inlining.walker.MethodInvocation; -import java.util.function.ToDoubleFunction; - public interface InliningPolicy { boolean continueInlining(StructuredGraph graph); - boolean isWorthInlining(ToDoubleFunction<FixedNode> probabilities, Replacements replacements, MethodInvocation invocation, int inliningDepth, boolean fullyProcessed); + boolean isWorthInlining(Replacements replacements, MethodInvocation invocation, int inliningDepth, boolean fullyProcessed); }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java Tue Sep 09 11:51:59 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java Tue Sep 09 11:53:03 2014 +0200 @@ -46,12 +46,10 @@ import com.oracle.graal.phases.common.inlining.info.elem.InlineableGraph; import com.oracle.graal.phases.common.inlining.info.elem.InlineableMacroNode; import com.oracle.graal.phases.common.inlining.policy.InliningPolicy; -import com.oracle.graal.phases.graph.FixedNodeProbabilityCache; import com.oracle.graal.phases.tiers.HighTierContext; import com.oracle.graal.phases.util.Providers; import java.util.*; -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; @@ -95,7 +93,6 @@ */ private final ArrayDeque<CallsiteHolder> graphQueue = new ArrayDeque<>(); private final ArrayDeque<MethodInvocation> invocationQueue = new ArrayDeque<>(); - private final ToDoubleFunction<FixedNode> probabilities = new FixedNodeProbabilityCache(); private final HighTierContext context; private final int maxMethodPerInlining; @@ -426,7 +423,7 @@ Assumptions callerAssumptions = parentInvocation.assumptions(); metricInliningConsidered.increment(); - if (inliningPolicy.isWorthInlining(probabilities, context.getReplacements(), calleeInvocation, inliningDepth, true)) { + if (inliningPolicy.isWorthInlining(context.getReplacements(), calleeInvocation, inliningDepth, true)) { doInline(callerCallsiteHolder, calleeInvocation, callerAssumptions); return true; } @@ -683,7 +680,7 @@ final MethodInvocation currentInvocation = currentInvocation(); - final boolean backtrack = (!currentInvocation.isRoot() && !inliningPolicy.isWorthInlining(probabilities, context.getReplacements(), currentInvocation, inliningDepth(), false)); + final boolean backtrack = (!currentInvocation.isRoot() && !inliningPolicy.isWorthInlining(context.getReplacements(), currentInvocation, inliningDepth(), false)); if (backtrack) { int remainingGraphs = currentInvocation.totalGraphs() - currentInvocation.processedGraphs(); assert remainingGraphs > 0;