# HG changeset patch # User Doug Simon # Date 1380740231 -7200 # Node ID 51059863da7381d5ed47b2237fa45ee55dc4daf0 # Parent da9db8331658f3a9dd949e9919a5fba62473995d replace instanceof type tests for Canonicalizable and Simplifiable with extra boolean properties in NodeClass (GRAAL-506) diff -r da9db8331658 -r 51059863da73 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 Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Wed Oct 02 20:57:11 2013 +0200 @@ -31,6 +31,7 @@ import com.oracle.graal.graph.NodeClass.NodeClassIterator; import com.oracle.graal.graph.NodeClass.Position; import com.oracle.graal.graph.iterators.*; +import com.oracle.graal.graph.spi.*; /** * This class is the base class for all nodes, it represent a node which can be inserted in a @@ -600,6 +601,28 @@ return clone(into, true); } + /** + * Must be overridden buy subclasses that implement {@link Canonicalizable}. The implementation + * in {@link Node} exists to obviate the need to cast a node before invoking + * {@link Canonicalizable#canonical(CanonicalizerTool)}. + * + * @param tool + */ + public Node canonical(CanonicalizerTool tool) { + throw new UnsupportedOperationException(); + } + + /** + * Must be overridden buy subclasses that implement {@link Simplifiable}. The implementation in + * {@link Node} exists to obviate the need to cast a node before invoking + * {@link Simplifiable#simplify(SimplifierTool)}. + * + * @param tool + */ + public void simplify(SimplifierTool tool) { + throw new UnsupportedOperationException(); + } + final Node clone(Graph into, boolean clearInputsAndSuccessors) { NodeClass nodeClass = getNodeClass(); if (nodeClass.valueNumberable() && nodeClass.isLeafNode()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Wed Oct 02 20:57:11 2013 +0200 @@ -33,6 +33,7 @@ import com.oracle.graal.graph.Node.Input; import com.oracle.graal.graph.Node.Successor; import com.oracle.graal.graph.Node.Verbosity; +import com.oracle.graal.graph.spi.*; /** * Lazily associated metadata for every {@link Node} type. The metadata includes: @@ -148,9 +149,21 @@ private static final DebugMetric ITERABLE_NODE_TYPES = Debug.metric("IterableNodeTypes"); private final DebugMetric nodeIterableCount; + /** + * Determines if this node type implements {@link Canonicalizable}. + */ + private final boolean isCanonicalizable; + + /** + * Determines if this node type implements {@link Simplifiable}. + */ + private final boolean isSimplifiable; + private NodeClass(Class clazz) { super(clazz); assert NODE_CLASS.isAssignableFrom(clazz); + this.isCanonicalizable = Canonicalizable.class.isAssignableFrom(clazz); + this.isSimplifiable = Simplifiable.class.isAssignableFrom(clazz); FieldScanner scanner = new FieldScanner(new DefaultCalcOffset()); scanner.scan(clazz); @@ -259,6 +272,20 @@ return isLeafNode; } + /** + * Determines if this node type implements {@link Canonicalizable}. + */ + public boolean isCanonicalizable() { + return isCanonicalizable; + } + + /** + * Determines if this node type implements {@link Simplifiable}. + */ + public boolean isSimplifiable() { + return isSimplifiable; + } + public static int cacheSize() { return nextIterableId; } diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassCastNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassCastNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassCastNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -49,6 +49,7 @@ return arguments.get(1); } + @Override public Node canonical(CanonicalizerTool tool) { ValueNode javaClass = getJavaClass(); if (javaClass.isConstant()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetComponentTypeNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetComponentTypeNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetComponentTypeNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -43,6 +43,7 @@ return arguments.get(0); } + @Override public Node canonical(CanonicalizerTool tool) { ValueNode javaClass = getJavaClass(); if (javaClass.isConstant()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetModifiersNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetModifiersNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetModifiersNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -43,6 +43,7 @@ return arguments.get(0); } + @Override public Node canonical(CanonicalizerTool tool) { ValueNode javaClass = getJavaClass(); if (javaClass.isConstant()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetSuperclassNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetSuperclassNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetSuperclassNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -43,6 +43,7 @@ return arguments.get(0); } + @Override public Node canonical(CanonicalizerTool tool) { ValueNode javaClass = getJavaClass(); if (javaClass.isConstant()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsArrayNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsArrayNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsArrayNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -43,6 +43,7 @@ return arguments.get(0); } + @Override public Node canonical(CanonicalizerTool tool) { ValueNode javaClass = getJavaClass(); if (javaClass.isConstant()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInstanceNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInstanceNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInstanceNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -50,6 +50,7 @@ return arguments.get(1); } + @Override public Node canonical(CanonicalizerTool tool) { ValueNode javaClass = getJavaClass(); if (javaClass.isConstant()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInterfaceNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInterfaceNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInterfaceNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -43,6 +43,7 @@ return arguments.get(0); } + @Override public Node canonical(CanonicalizerTool tool) { ValueNode javaClass = getJavaClass(); if (javaClass.isConstant()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsPrimitiveNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsPrimitiveNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsPrimitiveNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -43,6 +43,7 @@ return arguments.get(0); } + @Override public Node canonical(CanonicalizerTool tool) { ValueNode javaClass = getJavaClass(); if (javaClass.isConstant()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectGetClassNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectGetClassNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectGetClassNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -59,6 +59,7 @@ } } + @Override public Node canonical(CanonicalizerTool tool) { if (AOTCompilation.getValue()) { return this; diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -75,6 +75,7 @@ } } + @Override public Node canonical(CanonicalizerTool tool) { if (getGuard() == graph().start()) { if (stamp().equals(object().stamp())) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicNegationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicNegationNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicNegationNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -40,6 +40,7 @@ return input; } + @Override public Node canonical(CanonicalizerTool tool) { if (input instanceof LogicNegationNode) { return ((LogicNegationNode) input).getInput(); diff -r da9db8331658 -r 51059863da73 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 Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Wed Oct 02 20:57:11 2013 +0200 @@ -179,13 +179,14 @@ if (node.isAlive()) { METRIC_PROCESSED_NODES.increment(); - if (tryGlobalValueNumbering(node)) { + NodeClass nodeClass = node.getNodeClass(); + if (tryGlobalValueNumbering(node, nodeClass)) { return; } StructuredGraph graph = (StructuredGraph) node.graph(); int mark = graph.getMark(); if (!tryKillUnused(node)) { - if (!tryCanonicalize(node)) { + if (!tryCanonicalize(node, nodeClass)) { if (node instanceof ValueNode) { ValueNode valueNode = (ValueNode) node; boolean improvedStamp = tryInferStamp(valueNode); @@ -194,7 +195,7 @@ performReplacement(valueNode, ConstantNode.forConstant(constant, runtime, valueNode.graph())); } else if (improvedStamp) { // the improved stamp may enable additional canonicalization - tryCanonicalize(valueNode); + tryCanonicalize(valueNode, nodeClass); } } } @@ -214,8 +215,7 @@ return false; } - public static boolean tryGlobalValueNumbering(Node node) { - NodeClass nodeClass = node.getNodeClass(); + public static boolean tryGlobalValueNumbering(Node node, NodeClass nodeClass) { if (nodeClass.valueNumberable() && !nodeClass.isLeafNode()) { Node newNode = node.graph().findDuplicate(node); if (newNode != null) { @@ -230,8 +230,8 @@ return false; } - public boolean tryCanonicalize(final Node node) { - boolean result = baseTryCanonicalize(node); + public boolean tryCanonicalize(final Node node, NodeClass nodeClass) { + boolean result = baseTryCanonicalize(node, nodeClass); if (!result && customCanonicalizer != null && node instanceof ValueNode) { ValueNode valueNode = (ValueNode) node; ValueNode canonical = customCanonicalizer.canonicalize(valueNode); @@ -240,24 +240,24 @@ return result; } - public boolean baseTryCanonicalize(final Node node) { - if (node instanceof Canonicalizable) { - assert !(node instanceof Simplifiable); + public boolean baseTryCanonicalize(final Node node, NodeClass nodeClass) { + if (nodeClass.isCanonicalizable()) { + assert !nodeClass.isSimplifiable(); METRIC_CANONICALIZATION_CONSIDERED_NODES.increment(); return Debug.scope("CanonicalizeNode", node, new Callable() { public Boolean call() { - Node canonical = ((Canonicalizable) node).canonical(tool); + Node canonical = node.canonical(tool); return performReplacement(node, canonical); } }); - } else if (node instanceof Simplifiable) { + } else if (nodeClass.isSimplifiable()) { Debug.log("Canonicalizer: simplifying %s", node); METRIC_SIMPLIFICATION_CONSIDERED_NODES.increment(); Debug.scope("SimplifyNode", node, new Runnable() { public void run() { - ((Simplifiable) node).simplify(tool); + node.simplify(tool); } }); } diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/PureFunctionMacroNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/PureFunctionMacroNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/PureFunctionMacroNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -43,6 +43,7 @@ */ protected abstract Constant evaluate(Constant param, MetaAccessProvider metaAccess); + @Override public Node canonical(CanonicalizerTool tool) { if (usages().isEmpty()) { return null; diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/AssumptionNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/AssumptionNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/AssumptionNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -39,6 +39,7 @@ return arguments.first(); } + @Override public void simplify(SimplifierTool tool) { ValueNode assumption = getAssumption(); if (tool.assumptions() != null && assumption.isConstant()) { diff -r da9db8331658 -r 51059863da73 graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/WordCastNode.java --- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/WordCastNode.java Tue Oct 01 20:38:25 2013 +0200 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/WordCastNode.java Wed Oct 02 20:57:11 2013 +0200 @@ -57,6 +57,7 @@ return input; } + @Override public Node canonical(CanonicalizerTool tool) { if (usages().count() == 0) { /* If the cast is unused, it can be eliminated. */