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) {