changeset 17072:e4923262b8c5

Move FixedNodeProbabilityCache into InlineableGraph so it doesn't get too big
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Tue, 09 Sep 2014 11:53:03 +0200
parents 1b7b4eb6e0ef
children 1d69b5c58bfe
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/Inlineable.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableMacroNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/AbstractInliningPolicy.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/GreedyInliningPolicy.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/InlineEverythingPolicy.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/policy/InliningPolicy.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java
diffstat 8 files changed, 23 insertions(+), 21 deletions(-) [+]
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;