# HG changeset patch # User Lukas Stadler # Date 1330368074 -3600 # Node ID a59fe7906f0bbfeca4a10902c75dc80cafc70de2 # Parent 27397872945fef4b3ad35426ad4d7e8649ea71ec additional LoopFrequencyPropagationPolicy versions diff -r 27397872945f -r a59fe7906f0b 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 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; diff -r 27397872945f -r a59fe7906f0b 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 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 { + 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); diff -r 27397872945f -r a59fe7906f0b graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java --- 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; }