# HG changeset patch # User Thomas Wuerthinger # Date 1425999136 -3600 # Node ID 37969636e6f8a8e206215e57151f5f2b7f31a653 # Parent dde8a89e7f9254c09937ff20b70afc7c494308ee# Parent 39de568cbb02a18049668d52859684ecea9559f9 Merge. diff -r dde8a89e7f92 -r 37969636e6f8 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Value.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Value.java Tue Mar 10 15:52:07 2015 +0100 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Value.java Tue Mar 10 15:52:16 2015 +0100 @@ -37,7 +37,9 @@ @Override public boolean equals(Object other) { - return this == other; + // Due to de-serialization this object may exist multiple times. So we compare classes + // instead of the individual objects. (This anonymous class has always the same meaning) + return other != null && this.getClass() == other.getClass(); } }; diff -r dde8a89e7f92 -r 37969636e6f8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardPhiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardPhiNode.java Tue Mar 10 15:52:07 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardPhiNode.java Tue Mar 10 15:52:16 2015 +0100 @@ -41,6 +41,11 @@ this.values = new NodeInputList<>(this); } + public GuardPhiNode(AbstractMergeNode merge, ValueNode[] values) { + super(TYPE, StampFactory.forVoid(), merge); + this.values = new NodeInputList<>(this, values); + } + @Override public NodeInputList values() { return values; diff -r dde8a89e7f92 -r 37969636e6f8 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 Mar 10 15:52:07 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Tue Mar 10 15:52:16 2015 +0100 @@ -51,8 +51,25 @@ private boolean canonicalizeReads = true; private boolean simplify = true; + private final CustomCanonicalizer customCanonicalizer; + + public abstract static class CustomCanonicalizer { + + public Node canonicalize(Node node) { + return node; + } + + @SuppressWarnings("unused") + public void simplify(Node node, SimplifierTool tool) { + } + } public CanonicalizerPhase() { + this(null); + } + + public CanonicalizerPhase(CustomCanonicalizer customCanonicalizer) { + this.customCanonicalizer = customCanonicalizer; } public void disableReadCanonicalization() { @@ -227,6 +244,14 @@ } public boolean tryCanonicalize(final Node node, NodeClass nodeClass) { + if (customCanonicalizer != null) { + Node canonical = customCanonicalizer.canonicalize(node); + if (performReplacement(node, canonical)) { + return true; + } else { + customCanonicalizer.simplify(node, tool); + } + } if (nodeClass.isCanonicalizable()) { METRIC_CANONICALIZATION_CONSIDERED_NODES.increment(); try (Scope s = Debug.scope("CanonicalizeNode", node)) { @@ -397,4 +422,8 @@ } } } + + public boolean getCanonicalizeReads() { + return canonicalizeReads; + } }