Mercurial > hg > graal-compiler
changeset 4569:333ce00358f4
added another inlining policy, added option to disable propagation of loop frequencies
author | Christian Haeubl <christian.haeubl@oracle.com> |
---|---|
date | Sat, 11 Feb 2012 10:30:46 -0800 |
parents | 8e1d9c27989a |
children | 2dcc9193c6f0 |
files | graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java |
diffstat | 3 files changed, 38 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java Fri Feb 10 17:59:35 2012 -0800 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java Sat Feb 11 10:30:46 2012 -0800 @@ -70,6 +70,7 @@ // absolute probability analysis public static boolean ProbabilityAnalysis = true; + public static boolean PropagateLoopFrequency = true; // profiling information public static int MatureExecutionsBranch = 50;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java Fri Feb 10 17:59:35 2012 -0800 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java Sat Feb 11 10:30:46 2012 -0800 @@ -24,6 +24,7 @@ import java.util.*; +import com.oracle.max.graal.compiler.*; import com.oracle.max.graal.compiler.graph.*; import com.oracle.max.graal.debug.*; import com.oracle.max.graal.graph.*; @@ -52,7 +53,9 @@ Debug.dump(graph, "After PropagateProbability"); computeLoopFactors(); Debug.dump(graph, "After computeLoopFactors"); - new PropagateLoopFrequency(graph.start()).apply(); + if (GraalOptions.PropagateLoopFrequency) { + new PropagateLoopFrequency(graph.start()).apply(); + } } private void computeLoopFactors() {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java Fri Feb 10 17:59:35 2012 -0800 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java Sat Feb 11 10:30:46 2012 -0800 @@ -199,17 +199,15 @@ } private InliningPolicy createInliningPolicy() { - if (GraalOptions.InliningPolicy == 0) { - return new WeightBasedInliningPolicy(); - } else if (GraalOptions.InliningPolicy == 1) { - return new StaticSizeBasedInliningPolicy(); - } else if (GraalOptions.InliningPolicy == 2) { - return new DynamicSizeBasedInliningPolicy(); - } else if (GraalOptions.InliningPolicy == 3) { - return new GreedySizeBasedInliningPolicy(); - } else { - GraalInternalError.shouldNotReachHere(); - return null; + switch(GraalOptions.InliningPolicy) { + case 0: return new WeightBasedInliningPolicy(); + case 1: return new C1StaticSizeBasedInliningPolicy(); + case 2: return new MinimumCodeSizeBasedInliningPolicy(); + case 3: return new DynamicSizeBasedInliningPolicy(); + case 4: return new GreedySizeBasedInliningPolicy(); + default: + GraalInternalError.shouldNotReachHere(); + return null; } } @@ -287,7 +285,7 @@ } } - private class StaticSizeBasedInliningPolicy implements InliningPolicy { + private class C1StaticSizeBasedInliningPolicy implements InliningPolicy { @Override public double computeWeight(RiResolvedMethod caller, RiResolvedMethod method, Invoke invoke, boolean preferredInvoke) { double codeSize = method.codeSize(); @@ -304,6 +302,29 @@ } } + private class MinimumCodeSizeBasedInliningPolicy implements InliningPolicy { + @Override + public double computeWeight(RiResolvedMethod caller, RiResolvedMethod method, Invoke invoke, boolean preferredInvoke) { + double codeSize = method.codeSize(); + if (preferredInvoke) { + codeSize = codeSize / GraalOptions.BoostInliningForEscapeAnalysis; + } + return codeSize; + } + + @Override + public boolean isWorthInlining(StructuredGraph callerGraph, InlineInfo info) { + assert GraalOptions.ProbabilityAnalysis; + if (info.compiledCodeSize() <= GraalOptions.SmallCompiledCodeSize) { + double inlineWeight = Math.min(GraalOptions.ProbabilityCapForInlining, info.invoke.probability()); + double maxSize = Math.pow(GraalOptions.NestedInliningSizeRatio, info.level) * GraalOptions.MaximumInlineSize * inlineWeight; + maxSize = Math.max(GraalOptions.MaximumTrivialSize, maxSize); + return info.weight <= maxSize; + } + return false; + } + } + private class DynamicSizeBasedInliningPolicy implements InliningPolicy { @Override public double computeWeight(RiResolvedMethod caller, RiResolvedMethod method, Invoke invoke, boolean preferredInvoke) {