changeset 16196:8bf243c2c87b

removed explicit tracking of nodes removed by DeadCodeEliminationPhase; added option to enable NoDeadCodeVerifyHandle (disabled by default for now)
author Doug Simon <doug.simon@oracle.com>
date Fri, 20 Jun 2014 15:18:38 +0200
parents e34d8c5fa927
children 97a10428ff2c
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java graal/com.oracle.graal.printer/src/com/oracle/graal/printer/NoDeadCodeVerifyHandler.java
diffstat 2 files changed, 37 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java	Thu Jun 19 17:51:35 2014 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java	Fri Jun 20 15:18:38 2014 +0200
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.phases.common;
 
-import java.util.*;
-
 import com.oracle.graal.debug.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
@@ -34,16 +32,6 @@
     // Metrics
     private static final DebugMetric metricNodesRemoved = Debug.metric("NodesRemoved");
 
-    private final List<Node> removed;
-
-    public DeadCodeEliminationPhase() {
-        this(null);
-    }
-
-    public DeadCodeEliminationPhase(List<Node> removed) {
-        this.removed = removed;
-    }
-
     @Override
     public void run(StructuredGraph graph) {
         NodeFlood flood = graph.createNodeFlood();
@@ -52,7 +40,7 @@
         iterateSuccessors(flood);
         disconnectCFGNodes(flood, graph);
         iterateInputs(flood, graph);
-        deleteNodes(flood, graph, removed);
+        deleteNodes(flood, graph);
 
         // remove chained Merges
         for (MergeNode merge : graph.getNodes(MergeNode.class)) {
@@ -105,7 +93,7 @@
         }
     }
 
-    private static void deleteNodes(NodeFlood flood, StructuredGraph graph, List<Node> removed) {
+    private static void deleteNodes(NodeFlood flood, StructuredGraph graph) {
         for (Node node : graph.getNodes()) {
             if (!flood.isMarked(node)) {
                 node.clearInputs();
@@ -116,9 +104,6 @@
             if (!flood.isMarked(node)) {
                 metricNodesRemoved.increment();
                 node.safeDelete();
-                if (removed != null) {
-                    removed.add(node);
-                }
             }
         }
     }
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/NoDeadCodeVerifyHandler.java	Thu Jun 19 17:51:35 2014 +0200
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/NoDeadCodeVerifyHandler.java	Fri Jun 20 15:18:38 2014 +0200
@@ -22,12 +22,16 @@
  */
 package com.oracle.graal.printer;
 
+import static com.oracle.graal.printer.NoDeadCodeVerifyHandler.Options.*;
+
 import java.util.*;
+import java.util.concurrent.*;
 
 import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.debug.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
+import com.oracle.graal.options.*;
 import com.oracle.graal.phases.*;
 import com.oracle.graal.phases.common.*;
 
@@ -36,27 +40,41 @@
  */
 public class NoDeadCodeVerifyHandler implements DebugVerifyHandler {
 
-    private static final Collection<Class<? extends Phase>> excludedPhases = Arrays.asList(FloatingReadPhase.class);
+    // The options below will be removed once all phases clean up their own dead code.
 
-    private static boolean isExcluded(Phase phase) {
-        for (Class<? extends Phase> c : excludedPhases) {
-            if (c.isAssignableFrom(phase.getClass())) {
-                return true;
-            }
-        }
-        return false;
+    static class Options {
+        // @formatter:off
+        @Option(help = "Enable NoDeadCodeVerifyHandler")
+        public static final OptionValue<Boolean> NDCV = new OptionValue<>(false);
+        @Option(help = "Issues caught by NoDeadCodeVerifyHandler raise an error")
+        public static final OptionValue<Boolean> NDCVFatal = new OptionValue<>(false);
+        // @formatter:on
     }
 
+    private static final Map<Class<?>, Boolean> discovered = new ConcurrentHashMap<>();
+
     public void verify(Object object, Object... context) {
-        StructuredGraph graph = extract(StructuredGraph.class, object);
-        Phase phase = extract(Phase.class, context);
-        String message = extract(String.class, context);
-        if (graph != null && (phase == null || !isExcluded(phase))) {
-            List<Node> removed = new ArrayList<>();
-            new DeadCodeEliminationPhase(removed).run(graph);
-            if (!removed.isEmpty()) {
-                String prefix = message == null ? "" : message + ": ";
-                throw new GraalInternalError("%sfound dead nodes in %s: %s", prefix, graph, removed);
+        if (NDCV.getValue()) {
+            StructuredGraph graph = extract(StructuredGraph.class, object);
+            BasePhase<?> phase = extract(BasePhase.class, context);
+            if (graph != null) {
+                List<Node> before = graph.getNodes().snapshot();
+                new DeadCodeEliminationPhase().run(graph);
+                List<Node> after = graph.getNodes().snapshot();
+                assert after.size() <= before.size();
+                if (before.size() != after.size()) {
+                    before.removeAll(after);
+                    if (NDCVFatal.getValue() || discovered.put(phase.getClass(), Boolean.TRUE) == null) {
+                        String message = extract(String.class, context);
+                        String prefix = message == null ? "" : message + ": ";
+                        String phaseClass = phase == null ? null : phase.getClass().getName();
+                        GraalInternalError error = new GraalInternalError("%sfound dead nodes in %s (phase class=%s): %s", prefix, graph, phaseClass, before);
+                        if (NDCVFatal.getValue()) {
+                            throw error;
+                        }
+                        error.printStackTrace(System.out);
+                    }
+                }
             }
         }
     }