changeset 16187:dd3d62dfa0bd

added DebugVerifyHandler implementation to verify all phases delete dead nodes
author Doug Simon <doug.simon@oracle.com>
date Thu, 19 Jun 2014 12:03:23 +0200
parents 8366c0c9e5c3
children 84b5d413e540
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, 66 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java	Thu Jun 19 12:02:33 2014 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java	Thu Jun 19 12:03:23 2014 +0200
@@ -22,6 +22,8 @@
  */
 package com.oracle.graal.phases.common;
 
+import java.util.*;
+
 import com.oracle.graal.debug.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
@@ -32,15 +34,25 @@
     // 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
-    protected void run(StructuredGraph graph) {
+    public void run(StructuredGraph graph) {
         NodeFlood flood = graph.createNodeFlood();
 
         flood.add(graph.start());
         iterateSuccessors(flood);
         disconnectCFGNodes(flood, graph);
         iterateInputs(flood, graph);
-        deleteNodes(flood, graph);
+        deleteNodes(flood, graph, removed);
 
         // remove chained Merges
         for (MergeNode merge : graph.getNodes(MergeNode.class)) {
@@ -93,7 +105,7 @@
         }
     }
 
-    private static void deleteNodes(NodeFlood flood, StructuredGraph graph) {
+    private static void deleteNodes(NodeFlood flood, StructuredGraph graph, List<Node> removed) {
         for (Node node : graph.getNodes()) {
             if (!flood.isMarked(node)) {
                 node.clearInputs();
@@ -104,6 +116,9 @@
             if (!flood.isMarked(node)) {
                 metricNodesRemoved.increment();
                 node.safeDelete();
+                if (removed != null) {
+                    removed.add(node);
+                }
             }
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/NoDeadCodeVerifyHandler.java	Thu Jun 19 12:03:23 2014 +0200
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.graal.printer;
+
+import java.util.*;
+
+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.phases.common.*;
+
+/**
+ * Verifies that graphs have no dead code.
+ */
+public class NoDeadCodeVerifyHandler implements DebugVerifyHandler {
+
+    public void verify(Object object, String message) {
+        if (object instanceof StructuredGraph) {
+            StructuredGraph graph = (StructuredGraph) object;
+            List<Node> removed = new ArrayList<>();
+            new DeadCodeEliminationPhase(removed).run(graph);
+            if (!removed.isEmpty()) {
+                throw new GraalInternalError("%s: found dead nodes in %s: %s", message, graph, removed);
+            }
+        }
+    }
+}