Mercurial > hg > graal-jvmci-8
changeset 6671:bffb038abbe6
Add option for EliminatePartiallyRedundantGuards, eliminate at splits after IterativeConditionalElimination
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Wed, 07 Nov 2012 13:20:49 +0100 |
parents | 81ad987772f6 |
children | abd5b49a26fd |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java |
diffstat | 3 files changed, 28 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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) {
--- 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.