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.