# HG changeset patch # User Doug Simon # Date 1383677672 -3600 # Node ID ca8ab182026f7b88327c212ec75f4bb03c11ed45 # Parent 478c82dde8386b352660f2cd088dbe4322fc6bb0 abstracted a graph mark as a Mark object (hiding the node index) diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java Tue Nov 05 19:54:32 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, 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 @@ -394,15 +394,55 @@ } } - public boolean isNew(int mark, Node node) { - return node.id >= mark; + public boolean isNew(Mark mark, Node node) { + return node.id >= mark.getValue(); } /** - * Gets a mark that can be used with {@link #getNewNodes(int)}. + * A snapshot of the {@linkplain Graph#getNodeCount() live node count} in a graph. */ - public int getMark() { - return nodeIdCount(); + public static class Mark { + private final int value; + + Mark(Graph graph) { + this.value = graph.nodeIdCount(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Mark) { + Mark other = (Mark) obj; + return other.getValue() == getValue(); + } + return false; + } + + @Override + public int hashCode() { + return value; + } + + /** + * Determines if this mark is positioned at the first live node in the graph. + */ + public boolean isStart() { + return value == 0; + } + + /** + * Gets the {@linkplain Graph#getNodeCount() live node count} of the associated graph when + * this object was created. + */ + int getValue() { + return value; + } + } + + /** + * Gets a mark that can be used with {@link #getNewNodes}. + */ + public Mark getMark() { + return new Mark(this); } private class NodeIterator implements Iterator { @@ -459,8 +499,8 @@ * Returns an {@link Iterable} providing all nodes added since the last {@link Graph#getMark() * mark}. */ - public NodeIterable getNewNodes(int mark) { - final int index = mark; + public NodeIterable getNewNodes(Mark mark) { + final int index = mark.getValue(); return new AbstractNodeIterable() { @Override diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Tue Nov 05 19:54:32 2013 +0100 @@ -152,7 +152,7 @@ this.id = INITIAL_ID; } - protected int id() { + int id() { return id; } diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java Tue Nov 05 19:54:32 2013 +0100 @@ -26,6 +26,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.graph.NodeClass.NodeClassIterator; import com.oracle.graal.graph.NodeClass.Position; import com.oracle.graal.nodes.*; @@ -59,7 +60,7 @@ LoopBeginNode loopBegin = loop.loopBegin(); StructuredGraph graph = loopBegin.graph(); while (!loopBegin.isDeleted()) { - int mark = graph.getMark(); + Mark mark = graph.getMark(); peel(loop); canonicalizer.applyIncremental(graph, context, mark); if (iterations++ > UNROLL_LIMIT || graph.getNodeCount() > MaximumDesiredSize.getValue() * 3) { diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Tue Nov 05 19:54:32 2013 +0100 @@ -28,6 +28,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.graph.Graph.NodeChangedListener; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; @@ -71,14 +72,14 @@ } /** - * @param newNodesMark only the {@linkplain Graph#getNewNodes(int) new nodes} specified by this + * @param newNodesMark only the {@linkplain Graph#getNewNodes(Mark) new nodes} specified by this * mark are processed */ - public void applyIncremental(StructuredGraph graph, PhaseContext context, int newNodesMark) { + public void applyIncremental(StructuredGraph graph, PhaseContext context, Mark newNodesMark) { applyIncremental(graph, context, newNodesMark, true); } - public void applyIncremental(StructuredGraph graph, PhaseContext context, int newNodesMark, boolean dumpGraph) { + public void applyIncremental(StructuredGraph graph, PhaseContext context, Mark newNodesMark, boolean dumpGraph) { new Instance(context, canonicalizeReads, newNodesMark, customCanonicalizer).apply(graph, dumpGraph); } @@ -94,11 +95,11 @@ new Instance(context, canonicalizeReads, workingSet, customCanonicalizer).apply(graph, dumpGraph); } - public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable workingSet, int newNodesMark) { + public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable workingSet, Mark newNodesMark) { applyIncremental(graph, context, workingSet, newNodesMark, true); } - public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable workingSet, int newNodesMark, boolean dumpGraph) { + public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable workingSet, Mark newNodesMark, boolean dumpGraph) { new Instance(context, canonicalizeReads, workingSet, newNodesMark, customCanonicalizer).apply(graph, dumpGraph); } @@ -109,7 +110,7 @@ private static final class Instance extends Phase { - private final int newNodesMark; + private final Mark newNodesMark; private final PhaseContext context; private final CustomCanonicalizer customCanonicalizer; private final Iterable initWorkingSet; @@ -119,18 +120,18 @@ private Tool tool; private Instance(PhaseContext context, boolean canonicalizeReads, CustomCanonicalizer customCanonicalizer) { - this(context, canonicalizeReads, null, 0, customCanonicalizer); + this(context, canonicalizeReads, null, null, customCanonicalizer); } private Instance(PhaseContext context, boolean canonicalizeReads, Iterable workingSet, CustomCanonicalizer customCanonicalizer) { - this(context, canonicalizeReads, workingSet, 0, customCanonicalizer); + this(context, canonicalizeReads, workingSet, null, customCanonicalizer); } - private Instance(PhaseContext context, boolean canonicalizeReads, int newNodesMark, CustomCanonicalizer customCanonicalizer) { + private Instance(PhaseContext context, boolean canonicalizeReads, Mark newNodesMark, CustomCanonicalizer customCanonicalizer) { this(context, canonicalizeReads, null, newNodesMark, customCanonicalizer); } - private Instance(PhaseContext context, boolean canonicalizeReads, Iterable workingSet, int newNodesMark, CustomCanonicalizer customCanonicalizer) { + private Instance(PhaseContext context, boolean canonicalizeReads, Iterable workingSet, Mark newNodesMark, CustomCanonicalizer customCanonicalizer) { super("Canonicalizer"); this.newNodesMark = newNodesMark; this.context = context; @@ -141,13 +142,14 @@ @Override protected void run(StructuredGraph graph) { + boolean wholeGraph = newNodesMark == null || newNodesMark.isStart(); if (initWorkingSet == null) { - workList = graph.createNodeWorkList(newNodesMark == 0, MAX_ITERATION_PER_NODE); + workList = graph.createNodeWorkList(wholeGraph, MAX_ITERATION_PER_NODE); } else { workList = graph.createNodeWorkList(false, MAX_ITERATION_PER_NODE); workList.addAll(initWorkingSet); } - if (newNodesMark > 0) { + if (!wholeGraph) { workList.addAll(graph.getNewNodes(newNodesMark)); } tool = new Tool(); @@ -182,7 +184,7 @@ return; } StructuredGraph graph = (StructuredGraph) node.graph(); - int mark = graph.getMark(); + Mark mark = graph.getMark(); if (!tryKillUnused(node)) { if (!tryCanonicalize(node, nodeClass)) { if (node instanceof ValueNode) { diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IncrementalCanonicalizerPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IncrementalCanonicalizerPhase.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IncrementalCanonicalizerPhase.java Tue Nov 05 19:54:32 2013 +0100 @@ -24,6 +24,7 @@ import java.util.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.graph.Graph.NodeChangedListener; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -44,7 +45,7 @@ @Override protected void run(StructuredGraph graph, C context) { - int newNodesMark = graph.getMark(); + Mark newNodesMark = graph.getMark(); final Set changedNodes = new HashSet<>(); NodeChangedListener listener = new NodeChangedListener() { diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Tue Nov 05 19:54:32 2013 +0100 @@ -32,6 +32,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; @@ -180,7 +181,7 @@ private void doInline(GraphInfo callerGraphInfo, MethodInvocation calleeInfo, Assumptions callerAssumptions, HighTierContext context) { StructuredGraph callerGraph = callerGraphInfo.graph(); - int markBeforeInlining = callerGraph.getMark(); + Mark markBeforeInlining = callerGraph.getMark(); InlineInfo callee = calleeInfo.callee(); try { List invokeUsages = callee.invoke().asNode().usages().snapshot(); @@ -190,7 +191,7 @@ Debug.dump(callerGraph, "after %s", callee); if (OptCanonicalizer.getValue()) { - int markBeforeCanonicalization = callerGraph.getMark(); + Mark markBeforeCanonicalization = callerGraph.getMark(); canonicalizer.applyIncremental(callerGraph, context, invokeUsages, markBeforeInlining); // process invokes that are possibly created during canonicalization diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Tue Nov 05 19:54:32 2013 +0100 @@ -29,6 +29,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.graph.iterators.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.StructuredGraph.GuardsStage; @@ -169,10 +170,10 @@ * @throws AssertionError if the check fails */ private boolean checkPostLowering(StructuredGraph graph, PhaseContext context) { - int expectedMark = graph.getMark(); + Mark expectedMark = graph.getMark(); lower(graph, context, 1); - int mark = graph.getMark(); - assert mark == expectedMark : graph + ": a second round in the current lowering phase introduced these new nodes: " + graph.getNewNodes(mark).snapshot(); + Mark mark = graph.getMark(); + assert mark.equals(expectedMark) : graph + ": a second round in the current lowering phase introduced these new nodes: " + graph.getNewNodes(mark).snapshot(); return true; } @@ -198,15 +199,15 @@ * @param preLoweringMark the graph mark before {@code node} was lowered * @throws AssertionError if the check fails */ - private static boolean checkPostNodeLowering(Node node, LoweringToolImpl loweringTool, int preLoweringMark) { + private static boolean checkPostNodeLowering(Node node, LoweringToolImpl loweringTool, Mark preLoweringMark) { StructuredGraph graph = (StructuredGraph) node.graph(); - int postLoweringMark = graph.getMark(); + Mark postLoweringMark = graph.getMark(); NodeIterable newNodesAfterLowering = graph.getNewNodes(preLoweringMark); for (Node n : newNodesAfterLowering) { if (n instanceof Lowerable) { ((Lowerable) n).lower(loweringTool); - int mark = graph.getMark(); - assert postLoweringMark == mark : graph + ": lowering of " + node + " produced lowerable " + n + " that should have been recursively lowered as it introduces these new nodes: " + + Mark mark = graph.getMark(); + assert postLoweringMark.equals(mark) : graph + ": lowering of " + node + " produced lowerable " + n + " that should have been recursively lowered as it introduces these new nodes: " + graph.getNewNodes(postLoweringMark).snapshot(); } } @@ -285,7 +286,7 @@ if (node instanceof Lowerable) { assert checkUsagesAreScheduled(node); - int preLoweringMark = node.graph().getMark(); + Mark preLoweringMark = node.graph().getMark(); ((Lowerable) node).lower(loweringTool); assert checkPostNodeLowering(node, loweringTool, preLoweringMark); } diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java Tue Nov 05 19:54:32 2013 +0100 @@ -29,6 +29,7 @@ import com.oracle.graal.debug.*; import com.oracle.graal.graph.Graph.DuplicationReplacement; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.VirtualState.NodeClosure; import com.oracle.graal.nodes.extended.*; @@ -232,7 +233,7 @@ private void duplicate(PhaseContext phaseContext) { Debug.log("tail duplication at merge %s in %s", merge, graph.method()); - int startMark = graph.getMark(); + Mark startMark = graph.getMark(); ValueAnchorNode anchor = addValueAnchor(); diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Tue Nov 05 19:54:32 2013 +0100 @@ -34,6 +34,7 @@ import com.oracle.graal.debug.*; import com.oracle.graal.debug.internal.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.graph.iterators.*; import com.oracle.graal.loop.*; import com.oracle.graal.nodes.*; @@ -506,7 +507,7 @@ LoopBeginNode loopBegin = explodeLoop.findLoopBegin(); if (loopBegin != null) { LoopEx loop = new LoopsData(snippetCopy).loop(loopBegin); - int mark = snippetCopy.getMark(); + Mark mark = snippetCopy.getMark(); LoopTransformations.fullUnroll(loop, phaseContext, new CanonicalizerPhase(true)); new CanonicalizerPhase(true).applyIncremental(snippetCopy, phaseContext, mark); } diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Tue Nov 05 19:54:32 2013 +0100 @@ -34,6 +34,7 @@ import com.oracle.graal.debug.*; import com.oracle.graal.debug.internal.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.graph.Node; import com.oracle.graal.graph.spi.*; import com.oracle.graal.java.*; @@ -211,7 +212,7 @@ if (inlineGraph != null) { int nodeCountBefore = graph.getNodeCount(); - int mark = graph.getMark(); + Mark mark = graph.getMark(); InliningUtil.inline(methodCallTargetNode.invoke(), inlineGraph, false); if (Debug.isDumpEnabled()) { int nodeCountAfter = graph.getNodeCount(); diff -r 478c82dde838 -r ca8ab182026f graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java Tue Nov 05 19:44:09 2013 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java Tue Nov 05 19:54:32 2013 +0100 @@ -32,6 +32,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.graph.Node; import com.oracle.graal.graph.spi.*; import com.oracle.graal.java.*; @@ -114,7 +115,7 @@ CanonicalizerPhase canonicalizerPhase = new CanonicalizerPhase(!AOTCompilation.getValue()); PartialEscapePhase partialEscapePhase = new PartialEscapePhase(false, canonicalizerPhase); - int mark = 0; + Mark mark = null; while (true) { partialEscapePhase.apply(graph, phaseContext); @@ -128,7 +129,7 @@ boolean inliningProgress = false; for (MethodCallTargetNode methodCallTarget : graph.getNodes(MethodCallTargetNode.class)) { - if (graph.getMark() != mark) { + if (graph.getMark().equals(mark)) { // Make sure macro substitutions such as // CompilerDirectives.transferToInterpreter get processed first. for (Node newNode : graph.getNewNodes(mark)) { @@ -153,7 +154,7 @@ } } List argumentSnapshot = methodCallTarget.arguments().snapshot(); - int beforeInvokeMark = graph.getMark(); + Mark beforeInvokeMark = graph.getMark(); expandInvoke(methodCallTarget); for (Node arg : argumentSnapshot) { if (arg != null && arg.recordsUsages()) {