# HG changeset patch # User Gilles Duboscq # Date 1352290849 -3600 # Node ID bffb038abbe6e5fc5238d616a6801872d2ee400e # Parent 81ad987772f62d304716b06aa6e5b4f652665b2f Add option for EliminatePartiallyRedundantGuards, eliminate at splits after IterativeConditionalElimination diff -r 81ad987772f6 -r bffb038abbe6 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Wed Nov 07 12:10:33 2012 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Wed Nov 07 13:20:49 2012 +0100 @@ -189,12 +189,18 @@ new CanonicalizerPhase(target, runtime, assumptions).apply(graph); } - new EliminatePartiallyRedundantGuardsPhase().apply(graph); + if (GraalOptions.OptEliminatePartiallyRedundantGuards) { + new EliminatePartiallyRedundantGuardsPhase(false, true).apply(graph); + } if (GraalOptions.CheckCastElimination && GraalOptions.OptCanonicalizer) { new IterativeConditionalEliminationPhase(target, runtime, assumptions).apply(graph); } + if (GraalOptions.OptEliminatePartiallyRedundantGuards) { + new EliminatePartiallyRedundantGuardsPhase(true, true).apply(graph); + } + plan.runPhases(PhasePosition.MID_LEVEL, graph); plan.runPhases(PhasePosition.LOW_LEVEL, graph); diff -r 81ad987772f6 -r bffb038abbe6 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java Wed Nov 07 12:10:33 2012 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java Wed Nov 07 13:20:49 2012 +0100 @@ -38,6 +38,16 @@ private static final DebugMetric metricPRGuardsEliminatedAtMerge = Debug.metric("PRGuardsEliminatedAtMerge"); private static final DebugMetric metricPRGuardsEliminatedAtSplit = Debug.metric("PRGuardsEliminatedAtSplit"); + private static final DebugMetric metricPRGuardsDifferentGraphId = Debug.metric("PRGuardsDifferentGraphId"); + + private final boolean eliminateAtSplit; + private final boolean eliminateAtMerge; + + public EliminatePartiallyRedundantGuardsPhase(boolean eliminateAtSplit, boolean eliminateAtMerge) { + assert eliminateAtMerge || eliminateAtSplit; + this.eliminateAtSplit = eliminateAtSplit; + this.eliminateAtMerge = eliminateAtMerge; + } private static class Condition { final BooleanNode conditionNode; @@ -85,11 +95,15 @@ boolean hits; do { hits = false; - for (MergeNode merge : graph.getNodes(MergeNode.class)) { - hits |= eliminateAtMerge(merge); + if (eliminateAtMerge) { + for (MergeNode merge : graph.getNodes(MergeNode.class)) { + hits |= eliminateAtMerge(merge); + } } - for (ControlSplitNode controlSplit : graph.getNodes().filter(ControlSplitNode.class)) { - hits |= eliminateAtControlSplit(controlSplit); + if (eliminateAtSplit) { + for (ControlSplitNode controlSplit : graph.getNodes().filter(ControlSplitNode.class)) { + hits |= eliminateAtControlSplit(controlSplit); + } } } while(hits); } @@ -174,7 +188,9 @@ if (leafGraphId == -1) { leafGraphId = guard.getLeafGraphId(); } else if (leafGraphId != guard.getLeafGraphId()) { + metricPRGuardsDifferentGraphId.increment(); leafGraphId = -1; + break; } } if (leafGraphId < 0) { diff -r 81ad987772f6 -r bffb038abbe6 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Wed Nov 07 12:10:33 2012 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Wed Nov 07 13:20:49 2012 +0100 @@ -194,6 +194,7 @@ public static boolean OptSafepointElimination = true; public static boolean OptFloatingReads = true; public static boolean OptTailDuplication = true; + public static boolean OptEliminatePartiallyRedundantGuards = true; /** * Counts the various paths taken through snippets.