changeset 4638:a9181b59a6bf

added another variant for propagating loop frequencies
author Christian Haeubl <christian.haeubl@oracle.com>
date Fri, 17 Feb 2012 16:03:09 -0800
parents 5a5c603f7e0f
children 2855c491e2bd
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
diffstat 2 files changed, 40 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Fri Feb 17 11:02:52 2012 -0800
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Fri Feb 17 16:03:09 2012 -0800
@@ -73,7 +73,7 @@
 
     // absolute probability analysis
     public static boolean ProbabilityAnalysis                = true;
-    public static boolean PropagateLoopFrequency             = ____;
+    public static int     LoopFrequencyPropagationPolicy     = 1;
 
     // 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 17 11:02:52 2012 -0800
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java	Fri Feb 17 16:03:09 2012 -0800
@@ -53,9 +53,7 @@
         Debug.dump(graph, "After PropagateProbability");
         computeLoopFactors();
         Debug.dump(graph, "After computeLoopFactors");
-        if (GraalOptions.PropagateLoopFrequency) {
-            new PropagateLoopFrequency(graph.start()).apply();
-        }
+        new PropagateLoopFrequency(graph.start()).apply();
     }
 
     private void computeLoopFactors() {
@@ -275,14 +273,51 @@
     }
 
     private class PropagateLoopFrequency extends PostOrderNodeIterator<LoopCount> {
+        private final FrequencyPropagationPolicy policy;
 
         public PropagateLoopFrequency(FixedNode start) {
             super(start, new LoopCount(1d));
+            this.policy = createFrequencyPropagationPolicy();
         }
 
         @Override
         protected void node(FixedNode node) {
-            node.setProbability(node.probability() * state.count);
+            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 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;
+        }
+    }
+
+    private static class NoFrequencyPropagation implements FrequencyPropagationPolicy {
+        @Override
+        public double compute(double probability, double frequency) {
+            return probability;
+        }
+    }
+
+    private static class LogarithmicFrequencyPropagation implements FrequencyPropagationPolicy {
+        @Override
+        public double compute(double probability, double frequency) {
+            double result = Math.pow(probability, 1.5) * Math.log(frequency);
+            return Math.max(probability, result);
         }
     }
 }