Mercurial > hg > graal-compiler
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); } } }