changeset 4706:a59fe7906f0b

additional LoopFrequencyPropagationPolicy versions
author Lukas Stadler <lukas.stadler@jku.at>
date Mon, 27 Feb 2012 19:41:14 +0100
parents 27397872945f
children b9d5570f2362 c4a0a220e0f3
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/EscapeAnalysisPhase.java
diffstat 3 files changed, 63 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Mon Feb 27 14:50:10 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Mon Feb 27 19:41:14 2012 +0100
@@ -70,12 +70,12 @@
 
     // escape analysis settings
     public static boolean EscapeAnalysis                     = true;
-    public static int     ForcedInlineEscapeWeight           = 100;
+    public static int     ForcedInlineEscapeWeight           = 10;
     public static boolean PrintEscapeAnalysis                = ____;
 
     // absolute probability analysis
     public static boolean ProbabilityAnalysis                = true;
-    public static int     LoopFrequencyPropagationPolicy     = 1;
+    public static int     LoopFrequencyPropagationPolicy     = -2;
 
     // profiling information
     public static int     MatureExecutionsBranch             = 50;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java	Mon Feb 27 14:50:10 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java	Mon Feb 27 19:41:14 2012 +0100
@@ -24,10 +24,12 @@
 
 import java.util.*;
 
+import com.oracle.max.criutils.*;
 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.*;
+import com.oracle.max.graal.lir.cfg.*;
 import com.oracle.max.graal.nodes.*;
 
 public class ComputeProbabilityPhase extends Phase {
@@ -54,6 +56,44 @@
         computeLoopFactors();
         Debug.dump(graph, "After computeLoopFactors");
         new PropagateLoopFrequency(graph.start()).apply();
+
+        ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, false, false);
+
+        if (GraalOptions.LoopFrequencyPropagationPolicy < 0) {
+            for (Loop loop : cfg.getLoops()) {
+                if (loop.parent == null) {
+                    correctLoopFrequencies(loop);
+                }
+            }
+        }
+    }
+
+    private void correctLoopFrequencies(Loop loop) {
+        double frequency = ((LoopBeginNode) loop.header.getBeginNode()).loopFrequency();
+
+        double factor;
+        switch (GraalOptions.LoopFrequencyPropagationPolicy) {
+            case -1:
+                factor = 1 / frequency;
+                break;
+            case -2:
+                factor = (1 / frequency) * (Math.log(Math.E + frequency) - 1);
+                break;
+            default: throw GraalInternalError.shouldNotReachHere();
+        }
+
+        for (Block block : loop.blocks) {
+            FixedNode node = block.getBeginNode();
+
+            while (node != block.getEndNode()) {
+                node.setProbability(node.probability() * factor);
+                node = ((FixedWithNextNode) node).next();
+            }
+        }
+
+        for (Loop child : loop.children) {
+            correctLoopFrequencies(child);
+        }
     }
 
     private void computeLoopFactors() {
@@ -273,6 +313,7 @@
     }
 
     private class PropagateLoopFrequency extends PostOrderNodeIterator<LoopCount> {
+
         private final FrequencyPropagationPolicy policy;
 
         public PropagateLoopFrequency(FixedNode start) {
@@ -285,21 +326,30 @@
             node.setProbability(policy.compute(node.probability(), state.count));
         }
 
-        private FrequencyPropagationPolicy createFrequencyPropagationPolicy() {
-            switch (GraalOptions.LoopFrequencyPropagationPolicy) {
-                case 0: return new FullFrequencyPropagation();
-                case 1: return new NoFrequencyPropagation();
-                case 2: return new LogarithmicFrequencyPropagation();
-                default: throw GraalInternalError.shouldNotReachHere();
-            }
+    }
+
+    private static FrequencyPropagationPolicy createFrequencyPropagationPolicy() {
+        switch (GraalOptions.LoopFrequencyPropagationPolicy) {
+            case -1:
+            case -2:
+            case 0:
+                return new FullFrequencyPropagation();
+            case 1:
+                return new NoFrequencyPropagation();
+            case 2:
+                return new LogarithmicFrequencyPropagation();
+            default:
+                throw GraalInternalError.shouldNotReachHere();
         }
     }
 
     private interface FrequencyPropagationPolicy {
+
         double compute(double probability, double frequency);
     }
 
     private static class FullFrequencyPropagation implements FrequencyPropagationPolicy {
+
         @Override
         public double compute(double probability, double frequency) {
             return probability * frequency;
@@ -307,6 +357,7 @@
     }
 
     private static class NoFrequencyPropagation implements FrequencyPropagationPolicy {
+
         @Override
         public double compute(double probability, double frequency) {
             return probability;
@@ -314,6 +365,7 @@
     }
 
     private static class LogarithmicFrequencyPropagation implements FrequencyPropagationPolicy {
+
         @Override
         public double compute(double probability, double frequency) {
             double result = Math.pow(probability, 1.5) * Math.log(frequency);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Mon Feb 27 14:50:10 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Mon Feb 27 19:41:14 2012 +0100
@@ -377,7 +377,7 @@
             }
             if (weight < minimumWeight) {
                 if (GraalOptions.TraceEscapeAnalysis || GraalOptions.PrintEscapeAnalysis) {
-                    TTY.println("%n####### possibly escaping object: %s (insufficient weight for inlining)", node);
+                    TTY.println("####### possibly escaping object: %s (insufficient weight for inlining: %f)", node, weight);
                 }
                 break;
             }
@@ -391,7 +391,7 @@
             new DeadCodeEliminationPhase().apply(graph);
             if (node.isDeleted()) {
                 if (GraalOptions.TraceEscapeAnalysis || GraalOptions.PrintEscapeAnalysis) {
-                    TTY.println("%n!!!!!!!! object died while performing escape analysis: %s (%s)", node, node.exactType());
+                    TTY.println("!!!!!!!! object died while performing escape analysis: %s (%s)", node, node.exactType());
                 }
                 break;
             }