# HG changeset patch # User Doug Simon # Date 1415988968 -3600 # Node ID 3aaf2747961cc9a805aa050aaae6751302d788d0 # Parent c57c3777fa72f8794043e3da1f8645cf53a4bb7e use LinkedHashSets for node sets when created within the scope of a replay compilation context diff -r c57c3777fa72 -r 3aaf2747961c 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 Fri Nov 14 16:26:38 2014 +0100 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Fri Nov 14 19:16:08 2014 +0100 @@ -31,13 +31,14 @@ import sun.misc.*; import com.oracle.graal.compiler.common.*; +import com.oracle.graal.compiler.common.remote.*; import com.oracle.graal.graph.Graph.NodeEventListener; import com.oracle.graal.graph.iterators.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodeinfo.*; /** - * This class is the base class for all nodes, it represent a node which can be inserted in a + * This class is the base class for all nodes. It represents a node that can be inserted in a * {@link Graph}. *

* Once a node has been added to a graph, it has a graph-unique {@link #id()}. Edges in the @@ -48,6 +49,11 @@ *

* Nodes which are be value numberable should implement the {@link ValueNumberable} interface. * + *

Replay Compilation

+ * + * To enable deterministic replay compilation, node hash set creation within a compilation scope + * must {@link #newNodeHashSet()} or {@link #newNodeHashSet(Collection)}. + * *

Assertions and Verification

* * The Node class supplies the {@link #assertTrue(boolean, String, Object...)} and @@ -193,6 +199,22 @@ } /** + * Creates a {@link Node} hash set. The return set will be a {@link LinkedHashSet} if the + * current thread has an active compilation replay scope. This is requires to make replay + * compilations deterministic. + */ + public static HashSet newNodeHashSet() { + return Context.getCurrent() == null ? new HashSet<>() : new LinkedHashSet<>(); + } + + /** + * @see #newNodeHashSet() + */ + public static HashSet newNodeHashSet(Collection c) { + return Context.getCurrent() == null ? new HashSet<>(c) : new LinkedHashSet<>(c); + } + + /** * Gets the graph context of this node. */ public Graph graph() { diff -r c57c3777fa72 -r 3aaf2747961c 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 Fri Nov 14 16:26:38 2014 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java Fri Nov 14 19:16:08 2014 +0100 @@ -434,7 +434,7 @@ // build the intersection belowBound.intersect(aboveBound); - HashSet result = new HashSet<>(); + HashSet result = Node.newNodeHashSet(); for (Node node : belowBound) { result.add(node); } @@ -491,7 +491,7 @@ } private void processUsages(Node duplicated, HashSet duplicatedNodes, MergeNode newBottomMerge, Deque worklist) { - HashSet unique = new HashSet<>(); + HashSet unique = Node.newNodeHashSet(); duplicated.usages().snapshotTo(unique); Node newOutsideClone = null; for (Node usage : unique) { diff -r c57c3777fa72 -r 3aaf2747961c graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ValueAnchorCleanupPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ValueAnchorCleanupPhase.java Fri Nov 14 16:26:38 2014 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ValueAnchorCleanupPhase.java Fri Nov 14 19:16:08 2014 +0100 @@ -42,11 +42,11 @@ private final HashSet anchoredValues; public State() { - anchoredValues = new HashSet<>(); + anchoredValues = Node.newNodeHashSet(); } public State(State other) { - anchoredValues = new HashSet<>(other.anchoredValues); + anchoredValues = Node.newNodeHashSet(other.anchoredValues); } @Override diff -r c57c3777fa72 -r 3aaf2747961c graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java Fri Nov 14 16:26:38 2014 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java Fri Nov 14 19:16:08 2014 +0100 @@ -22,37 +22,28 @@ */ package com.oracle.graal.phases.common.inlining.walker; -import com.oracle.graal.api.code.Assumptions; -import com.oracle.graal.api.code.BailoutException; -import com.oracle.graal.api.meta.JavaTypeProfile; -import com.oracle.graal.api.meta.ResolvedJavaMethod; -import com.oracle.graal.api.meta.ResolvedJavaType; -import com.oracle.graal.compiler.common.GraalInternalError; -import com.oracle.graal.compiler.common.type.ObjectStamp; -import com.oracle.graal.debug.Debug; -import com.oracle.graal.debug.DebugMetric; -import com.oracle.graal.graph.Graph; -import com.oracle.graal.graph.Node; -import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.java.AbstractNewObjectNode; -import com.oracle.graal.nodes.java.MethodCallTargetNode; -import com.oracle.graal.nodes.virtual.AllocatedObjectNode; -import com.oracle.graal.nodes.virtual.VirtualObjectNode; -import com.oracle.graal.phases.OptimisticOptimizations; -import com.oracle.graal.phases.common.CanonicalizerPhase; -import com.oracle.graal.phases.common.inlining.InliningUtil; -import com.oracle.graal.phases.common.inlining.info.*; -import com.oracle.graal.phases.common.inlining.info.elem.Inlineable; -import com.oracle.graal.phases.common.inlining.info.elem.InlineableGraph; -import com.oracle.graal.phases.common.inlining.info.elem.InlineableMacroNode; -import com.oracle.graal.phases.common.inlining.policy.InliningPolicy; -import com.oracle.graal.phases.tiers.HighTierContext; -import com.oracle.graal.phases.util.Providers; +import static com.oracle.graal.compiler.common.GraalOptions.*; +import static com.oracle.graal.phases.common.inlining.walker.CallsiteHolderDummy.*; import java.util.*; -import static com.oracle.graal.compiler.common.GraalOptions.*; -import static com.oracle.graal.phases.common.inlining.walker.CallsiteHolderDummy.DUMMY_CALLSITE_HOLDER; +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.common.*; +import com.oracle.graal.compiler.common.type.*; +import com.oracle.graal.debug.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.virtual.*; +import com.oracle.graal.phases.*; +import com.oracle.graal.phases.common.*; +import com.oracle.graal.phases.common.inlining.*; +import com.oracle.graal.phases.common.inlining.info.*; +import com.oracle.graal.phases.common.inlining.info.elem.*; +import com.oracle.graal.phases.common.inlining.policy.*; +import com.oracle.graal.phases.tiers.*; +import com.oracle.graal.phases.util.*; /** *

@@ -368,7 +359,7 @@ InlineInfo calleeInfo = calleeInvocation.callee(); try { try (Debug.Scope scope = Debug.scope("doInline", callerGraph)) { - Set canonicalizedNodes = new HashSet<>(); + Set canonicalizedNodes = Node.newNodeHashSet(); calleeInfo.invoke().asNode().usages().snapshotTo(canonicalizedNodes); Collection parameterUsages = calleeInfo.inline(new Providers(context), callerAssumptions); canonicalizedNodes.addAll(parameterUsages); diff -r c57c3777fa72 -r 3aaf2747961c graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java Fri Nov 14 16:26:38 2014 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java Fri Nov 14 19:16:08 2014 +0100 @@ -40,7 +40,7 @@ * Creates a {@link NodeEventListener} that collects nodes from all events. */ public HashSetNodeEventListener() { - this.nodes = new HashSet<>(); + this.nodes = Node.newNodeHashSet(); this.filter = EnumSet.allOf(NodeEvent.class); } diff -r c57c3777fa72 -r 3aaf2747961c graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java Fri Nov 14 16:26:38 2014 +0100 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java Fri Nov 14 19:16:08 2014 +0100 @@ -84,7 +84,7 @@ @Override public void print(Graph graph, String title, SchedulePhase predefinedSchedule) { beginGraph(title); - Set noBlockNodes = new HashSet<>(); + Set noBlockNodes = Node.newNodeHashSet(); SchedulePhase schedule = predefinedSchedule; if (schedule == null && tryToSchedule) { if (PrintIdealGraphSchedule.getValue()) { @@ -249,7 +249,7 @@ endSuccessors(); beginBlockNodes(); - Set nodes = new HashSet<>(); + Set nodes = Node.newNodeHashSet(); if (nodeToBlock != null) { for (Node n : graph.getNodes()) { @@ -270,7 +270,7 @@ } } - Set snapshot = new HashSet<>(nodes); + Set snapshot = Node.newNodeHashSet(nodes); // add all framestates and phis to their blocks for (Node node : snapshot) { if (node instanceof StateSplit && ((StateSplit) node).stateAfter() != null) {