# HG changeset patch # User Christian Haeubl # Date 1328985046 28800 # Node ID 333ce00358f45b2159b978793d3b3262dd90e6d8 # Parent 8e1d9c27989a97f965cf1d8a0667d609bf585f3d added another inlining policy, added option to disable propagation of loop frequencies diff -r 8e1d9c27989a -r 333ce00358f4 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java --- 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; diff -r 8e1d9c27989a -r 333ce00358f4 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java --- 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() { diff -r 8e1d9c27989a -r 333ce00358f4 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java --- 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) {