Mercurial > hg > graal-compiler
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); + } + } } } }