# HG changeset patch # User Christian Haeubl # Date 1369125258 -7200 # Node ID 26785bb7006d3cff8055014296ff2a9ea214167c # Parent 5dc05fdcf3c2fb2807628c7220c2493b3d86097b Refactorings for the InliningPhase. diff -r 5dc05fdcf3c2 -r 26785bb7006d 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 Mon May 20 23:22:36 2013 -0700 +++ /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 5dc05fdcf3c2 -r 26785bb7006d 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 Mon May 20 23:22:36 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Tue May 21 10:34:18 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 5dc05fdcf3c2 -r 26785bb7006d 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 Mon May 20 23:22:36 2013 -0700 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Tue May 21 10:34:18 2013 +0200 @@ -37,7 +37,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.*; @@ -146,10 +148,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(); @@ -207,12 +209,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)); } } @@ -379,7 +381,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(); } @@ -390,10 +392,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 5dc05fdcf3c2 -r 26785bb7006d 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 Mon May 20 23:22:36 2013 -0700 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Tue May 21 10:34:18 2013 +0200 @@ -64,7 +64,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; @@ -236,13 +266,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 @@ -275,10 +305,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()); @@ -329,7 +359,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); @@ -375,13 +405,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; } @@ -396,7 +426,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); @@ -416,7 +446,7 @@ } @Override - public InlineableElement inlineableElementAt(int index) { + public Inlineable inlineableElementAt(int index) { assert index == 0; return inlineableElement; } @@ -434,7 +464,7 @@ } @Override - public void setInlinableElement(int index, InlineableElement inlineableElement) { + public void setInlinableElement(int index, Inlineable inlineableElement) { assert index == 0; this.inlineableElement = inlineableElement; } @@ -489,7 +519,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) { @@ -502,7 +532,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; @@ -538,7 +568,7 @@ } @Override - public InlineableElement inlineableElementAt(int index) { + public Inlineable inlineableElementAt(int index) { assert index >= 0 && index < concretes.size(); return inlineableElements[index]; } @@ -554,7 +584,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; }