# HG changeset patch # User Christian Haeubl # Date 1329523389 28800 # Node ID a9181b59a6bfb9b10a20e0f55c5d242a7e58fe6b # Parent 5a5c603f7e0fd24003072170edb5f7cc268ad68d added another variant for propagating loop frequencies diff -r 5a5c603f7e0f -r a9181b59a6bf 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 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; diff -r 5a5c603f7e0f -r a9181b59a6bf 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 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 { + 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); } } }