src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/GraphChangeMonitoringPhase.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/GraphChangeMonitoringPhase.java	Mon Mar 20 17:37:48 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/GraphChangeMonitoringPhase.java	Mon Mar 20 17:37:48 2017

*** 20,32 **** --- 20,29 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package org.graalvm.compiler.core.phases; import java.util.Set; import java.util.stream.Collectors; import org.graalvm.compiler.debug.Debug; import org.graalvm.compiler.debug.Debug.Scope; import org.graalvm.compiler.graph.Graph.NodeEvent; import org.graalvm.compiler.graph.Graph.NodeEventScope; import org.graalvm.compiler.graph.Node;
*** 34,43 **** --- 31,42 ---- import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.phases.BasePhase; import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.common.util.HashSetNodeEventListener; import org.graalvm.compiler.phases.tiers.PhaseContext; + import org.graalvm.util.Equivalence; + import org.graalvm.util.EconomicSet; /** * A utility phase for detecting when a phase would change the graph and reporting extra information * about the effects. The phase is first run on a copy of the graph and if a change in that graph is * detected then it's rerun on the original graph inside a new debug scope under
*** 75,102 **** --- 74,106 ---- super.run(graphCopy, context); } catch (Throwable t) { Debug.handle(t); } } /* * Ignore LogicConstantNode since those are sometimes created and deleted as part of running * a phase. */ if (listener.getNodes().stream().filter(e -> !(e instanceof LogicConstantNode)).findFirst().isPresent()) { + + EconomicSet<Node> filteredNodes = EconomicSet.create(Equivalence.IDENTITY); + for (Node n : listener.getNodes()) { + if (n instanceof LogicConstantNode) { + // Ignore LogicConstantNode since those are sometimes created and deleted as part of + // running a phase. + } else { + filteredNodes.add(n); + } + } + if (!filteredNodes.isEmpty()) { /* rerun it on the real graph in a new Debug scope so Dump and Log can find it. */ listener = new HashSetNodeEventListener(); try (NodeEventScope s = graph.trackNodeEvents(listener)) { try (Scope s2 = Debug.scope("WithGraphChangeMonitoring")) { if (Debug.isDumpEnabled(Debug.BASIC_LOG_LEVEL)) { Debug.dump(Debug.BASIC_LOG_LEVEL, graph, "*** Before phase %s", getName()); } super.run(graph, context); Set<Node> collect = listener.getNodes().stream().filter(e -> !e.isAlive()).filter(e -> !(e instanceof LogicConstantNode)).collect(Collectors.toSet()); if (Debug.isDumpEnabled(Debug.BASIC_LOG_LEVEL)) { ! Debug.dump(Debug.BASIC_LOG_LEVEL, graph, "*** After phase %s %s", getName(), collect); ! Debug.dump(Debug.BASIC_LOG_LEVEL, graph, "*** After phase %s %s", getName(), filteredNodes); } ! Debug.log("*** %s %s %s\n", message, graph, collect); ! Debug.log("*** %s %s %s\n", message, graph, filteredNodes); } } } else { // Go ahead and run it normally even though it should have no effect super.run(graph, context);

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/GraphChangeMonitoringPhase.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File