# HG changeset patch # User Doug Simon # Date 1409158695 -7200 # Node ID 5762848171e7894a53bf6fc6de48be41b05f117f # Parent 6e05e73c942ca0f1b73e770bc6aac3db8778ef0f replaced 'node.getClass() == .getGenClass()' idiom with new 'NodeClass.is(Class cls)' mechanism diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRBuilder.java --- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRBuilder.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRBuilder.java Wed Aug 27 18:58:15 2014 +0200 @@ -275,63 +275,63 @@ protected AMD64Arithmetic getOp(ValueNode operation, Access access) { Kind memoryKind = getMemoryKind(access); - if (operation.getClass() == IntegerAddNode.getGenClass()) { + if (operation.getNodeClass().is(IntegerAddNode.class)) { switch (memoryKind) { case Int: return IADD; case Long: return LADD; } - } else if (operation.getClass() == FloatAddNode.getGenClass()) { + } else if (operation.getNodeClass().is(FloatAddNode.class)) { switch (memoryKind) { case Float: return FADD; case Double: return DADD; } - } else if (operation.getClass() == AndNode.getGenClass()) { + } else if (operation.getNodeClass().is(AndNode.class)) { switch (memoryKind) { case Int: return IAND; case Long: return LAND; } - } else if (operation.getClass() == OrNode.getGenClass()) { + } else if (operation.getNodeClass().is(OrNode.class)) { switch (memoryKind) { case Int: return IOR; case Long: return LOR; } - } else if (operation.getClass() == XorNode.getGenClass()) { + } else if (operation.getNodeClass().is(XorNode.class)) { switch (memoryKind) { case Int: return IXOR; case Long: return LXOR; } - } else if (operation.getClass() == IntegerSubNode.getGenClass()) { + } else if (operation.getNodeClass().is(IntegerSubNode.class)) { switch (memoryKind) { case Int: return ISUB; case Long: return LSUB; } - } else if (operation.getClass() == FloatSubNode.getGenClass()) { + } else if (operation.getNodeClass().is(FloatSubNode.class)) { switch (memoryKind) { case Float: return FSUB; case Double: return DSUB; } - } else if (operation.getClass() == IntegerMulNode.getGenClass()) { + } else if (operation.getNodeClass().is(IntegerMulNode.class)) { switch (memoryKind) { case Int: return IMUL; case Long: return LMUL; } - } else if (operation.getClass() == FloatMulNode.getGenClass()) { + } else if (operation.getNodeClass().is(FloatMulNode.class)) { switch (memoryKind) { case Float: return FMUL; diff -r 6e05e73c942c -r 5762848171e7 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 Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Wed Aug 27 18:58:15 2014 +0200 @@ -54,8 +54,7 @@ */ @SuppressWarnings("unchecked") public static NodeClass get(Class c) { - GeneratedNode gen = c.getAnnotation(GeneratedNode.class); - Class key = gen == null ? (Class) c : (Class) gen.value(); + Class key = (Class) c; NodeClass value = (NodeClass) allClasses.get(key); // The fact that {@link ConcurrentHashMap#put} and {@link ConcurrentHashMap#get} @@ -66,7 +65,14 @@ synchronized (GetNodeClassLock) { value = (NodeClass) allClasses.get(key); if (value == null) { - value = new NodeClass(key); + GeneratedNode gen = c.getAnnotation(GeneratedNode.class); + if (gen != null) { + Class genKey = (Class) gen.value(); + value = (NodeClass) allClasses.get(genKey); + assert value != null; + } else { + value = new NodeClass(key); + } Object old = allClasses.putIfAbsent(key, value); assert old == null : old + " " + key; } @@ -158,15 +164,12 @@ } String newNameTemplate = null; NodeInfo info = clazz.getAnnotation(NodeInfo.class); - if (info != null) { - if (!info.shortName().isEmpty()) { - newShortName = info.shortName(); - } - if (!info.nameTemplate().isEmpty()) { - newNameTemplate = info.nameTemplate(); - } - } else { - System.out.println("No NodeInfo for " + clazz); + assert info != null : "missing " + NodeInfo.class.getSimpleName() + " annotation on " + clazz; + if (!info.shortName().isEmpty()) { + newShortName = info.shortName(); + } + if (!info.nameTemplate().isEmpty()) { + newNameTemplate = info.nameTemplate(); } EnumSet newAllowedUsageTypes = EnumSet.noneOf(InputType.class); Class current = clazz; @@ -234,14 +237,12 @@ fieldTypes.putAll(scanner.fieldTypes); } - private boolean isNodeClassFor(Node n) { - if (Node.USE_GENERATED_NODES) { - GeneratedNode gen = n.getClass().getAnnotation(GeneratedNode.class); - assert gen != null; - return gen.value() == getClazz(); - } else { - return n.getNodeClass().getClazz() == n.getClass(); - } + /** + * Determines if a given {@link Node} class is described by the {@link NodeClass} object. + */ + public boolean is(Class nodeClass) { + assert nodeClass.getAnnotation(GeneratedNode.class) == null; + return nodeClass.equals(getClazz()); } public String shortName() { @@ -1214,7 +1215,7 @@ * @param newNode the node to which the inputs should be copied. */ public void copyInputs(Node node, Node newNode) { - assert isNodeClassFor(node) && isNodeClassFor(newNode); + assert node.getNodeClass() == this && newNode.getNodeClass() == this; int index = 0; while (index < directInputCount) { @@ -1236,7 +1237,7 @@ * @param newNode the node to which the successors should be copied. */ public void copySuccessors(Node node, Node newNode) { - assert isNodeClassFor(node) && isNodeClassFor(newNode); + assert node.getNodeClass() == this && newNode.getNodeClass() == this; int index = 0; while (index < directSuccessorCount) { @@ -1255,7 +1256,7 @@ } public boolean inputsEqual(Node node, Node other) { - assert isNodeClassFor(node) && isNodeClassFor(other); + assert node.getNodeClass() == this && other.getNodeClass() == this; int index = 0; while (index < directInputCount) { if (getNode(other, inputOffsets[index]) != getNode(node, inputOffsets[index])) { @@ -1274,7 +1275,7 @@ } public boolean successorsEqual(Node node, Node other) { - assert isNodeClassFor(node) && isNodeClassFor(other); + assert node.getNodeClass() == this && other.getNodeClass() == this; int index = 0; while (index < directSuccessorCount) { if (getNode(other, successorOffsets[index]) != getNode(node, successorOffsets[index])) { @@ -1293,7 +1294,7 @@ } public boolean inputContains(Node node, Node other) { - assert isNodeClassFor(node); + assert node.getNodeClass() == this; int index = 0; while (index < directInputCount) { @@ -1313,7 +1314,7 @@ } public boolean successorContains(Node node, Node other) { - assert isNodeClassFor(node); + assert node.getNodeClass() == this; int index = 0; while (index < directSuccessorCount) { diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Wed Aug 27 18:58:15 2014 +0200 @@ -1334,7 +1334,7 @@ frameState.clearNonLiveLocals(currentBlock, liveness, false); } if (lastInstr instanceof StateSplit) { - if (lastInstr.getClass() == BeginNode.getGenClass()) { + if (lastInstr.getNodeClass().is(BeginNode.class)) { // BeginNodes do not need a frame state } else { StateSplit stateSplit = (StateSplit) lastInstr; diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -42,10 +42,6 @@ return USE_GENERATED_NODES ? new BeginNodeGen() : new BeginNode(); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? BeginNodeGen.class : BeginNode.class; - } - protected BeginNode() { super(StampFactory.forVoid()); } diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EndNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EndNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EndNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -30,10 +30,6 @@ return USE_GENERATED_NODES ? new EndNodeGen() : new EndNode(); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? EndNodeGen.class : EndNode.class; - } - EndNode() { } } diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -220,7 +220,7 @@ do { BeginNode trueSucc = trueSuccessor(); BeginNode falseSucc = falseSuccessor(); - if (trueSucc.getClass() == BeginNode.getGenClass() && falseSucc.getClass() == BeginNode.getGenClass() && trueSucc.next() instanceof FixedWithNextNode && + if (trueSucc.getNodeClass().is(BeginNode.class) && falseSucc.getNodeClass().is(BeginNode.class) && trueSucc.next() instanceof FixedWithNextNode && falseSucc.next() instanceof FixedWithNextNode) { FixedWithNextNode trueNext = (FixedWithNextNode) trueSucc.next(); FixedWithNextNode falseNext = (FixedWithNextNode) falseSucc.next(); diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -43,10 +43,6 @@ return USE_GENERATED_NODES ? new MergeNodeGen() : new MergeNode(); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? MergeNodeGen.class : MergeNode.class; - } - protected MergeNode() { } diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -39,10 +39,6 @@ return USE_GENERATED_NODES ? new AndNodeGen(x, y) : new AndNode(x, y); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? AndNodeGen.class : AndNode.class; - } - AndNode(ValueNode x, ValueNode y) { super(StampTool.and(x.stamp(), y.stamp()), x, y); assert x.stamp().isCompatible(y.stamp()); diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -37,10 +37,6 @@ return USE_GENERATED_NODES ? new FloatAddNodeGen(x, y, isStrictFP) : new FloatAddNode(x, y, isStrictFP); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? FloatAddNodeGen.class : FloatAddNode.class; - } - protected FloatAddNode(ValueNode x, ValueNode y, boolean isStrictFP) { super(x.stamp().unrestricted(), x, y, isStrictFP); } diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -37,10 +37,6 @@ return USE_GENERATED_NODES ? new FloatMulNodeGen(x, y, isStrictFP) : new FloatMulNode(x, y, isStrictFP); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? FloatMulNodeGen.class : FloatMulNode.class; - } - protected FloatMulNode(ValueNode x, ValueNode y, boolean isStrictFP) { super(x.stamp().unrestricted(), x, y, isStrictFP); } diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -38,10 +38,6 @@ return USE_GENERATED_NODES ? new FloatSubNodeGen(x, y, isStrictFP) : new FloatSubNode(x, y, isStrictFP); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? FloatSubNodeGen.class : FloatSubNode.class; - } - protected FloatSubNode(ValueNode x, ValueNode y, boolean isStrictFP) { super(x.stamp().unrestricted(), x, y, isStrictFP); } diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -38,10 +38,6 @@ return USE_GENERATED_NODES ? new IntegerAddNodeGen(x, y) : new IntegerAddNode(x, y); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? IntegerAddNodeGen.class : IntegerAddNode.class; - } - protected IntegerAddNode(ValueNode x, ValueNode y) { super(StampTool.add(x.stamp(), y.stamp()), x, y); } diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -38,10 +38,6 @@ return USE_GENERATED_NODES ? new IntegerMulNodeGen(x, y) : new IntegerMulNode(x, y); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? IntegerMulNodeGen.class : IntegerMulNode.class; - } - protected IntegerMulNode(ValueNode x, ValueNode y) { super(x.stamp().unrestricted(), x, y); assert x.stamp().isCompatible(y.stamp()); diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -39,10 +39,6 @@ return USE_GENERATED_NODES ? new IntegerSubNodeGen(x, y) : new IntegerSubNode(x, y); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? IntegerSubNodeGen.class : IntegerSubNode.class; - } - protected IntegerSubNode(ValueNode x, ValueNode y) { super(StampTool.sub(x.stamp(), y.stamp()), x, y); } diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -39,10 +39,6 @@ return USE_GENERATED_NODES ? new OrNodeGen(x, y) : new OrNode(x, y); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? OrNodeGen.class : OrNode.class; - } - OrNode(ValueNode x, ValueNode y) { super(StampTool.or(x.stamp(), y.stamp()), x, y); assert x.stamp().isCompatible(y.stamp()); diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Wed Aug 27 18:58:15 2014 +0200 @@ -39,10 +39,6 @@ return USE_GENERATED_NODES ? new XorNodeGen(x, y) : new XorNode(x, y); } - public static Class getGenClass() { - return USE_GENERATED_NODES ? XorNodeGen.class : XorNode.class; - } - protected XorNode(ValueNode x, ValueNode y) { super(StampTool.xor(x.stamp(), y.stamp()), x, y); assert x.stamp().isCompatible(y.stamp()); diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/ComputeInliningRelevance.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/ComputeInliningRelevance.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/ComputeInliningRelevance.java Wed Aug 27 18:58:15 2014 +0200 @@ -116,7 +116,7 @@ parent = loops.get(null); break; } else { - assert current.getClass() == MergeNode.getGenClass() : current; + assert current.getNodeClass().is(MergeNode.class) : current; // follow any path upwards - it doesn't matter which one current = ((MergeNode) current).forwardEndAt(0); } diff -r 6e05e73c942c -r 5762848171e7 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/verify/VerifyNoNodeClassLiteralIdentityTests.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/verify/VerifyNoNodeClassLiteralIdentityTests.java Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/verify/VerifyNoNodeClassLiteralIdentityTests.java Wed Aug 27 18:58:15 2014 +0200 @@ -38,8 +38,8 @@ * Since only {@linkplain GeneratedNode generated} {@link Node} types can be instantiated (which is * checked by an assertion in {@link Node#Node()}), any identity test of a node's * {@linkplain Object#getClass() class} against a class literal of a non-generated node types will - * always return false. Instead, a static {@code getGenClass()} helper method should be used for - * such identity tests. For example, instead of: + * always return false. Instead, the {@link NodeClass#is(Class)} method should be used. For example, + * instead of: * *
  *     if (operation.getClass() == IntegerAddNode.class) { ... }
@@ -48,7 +48,7 @@
  * this should be used:
  *
  * 
- *     if (operation.getClass() == IntegerAddNode.getGenClass()) { ... }
+ *     if (operation.getNodeClass().is(IntegerAddNode.class)) { ... }
  * 
* * This phase verifies there are no identity tests against class literals for non-generated Node @@ -60,8 +60,10 @@ protected boolean verify(StructuredGraph graph, PhaseContext context) { Map errors = new HashMap<>(); + MetaAccessProvider metaAccess = context.getMetaAccess(); + ResolvedJavaType nodeClassType = metaAccess.lookupJavaType(Node.class); + for (ConstantNode c : ConstantNode.getConstantNodes(graph)) { - ResolvedJavaType nodeClassType = context.getMetaAccess().lookupJavaType(Node.class); ResolvedJavaType nodeType = context.getConstantReflection().asJavaType(c.asConstant()); if (nodeType != null && nodeClassType.isAssignableFrom(nodeType)) { NodeIterable usages = c.usages(); @@ -69,10 +71,7 @@ if (!(n instanceof ObjectEqualsNode)) { continue; } - String loc = GraphUtil.approxSourceLocation(n); - if (loc == null) { - loc = graph.method().asStackTraceElement(0).toString() + " " + n; - } + String loc = getLocation(n, graph); errors.put(nodeType.toJavaName(false), loc); } } @@ -92,4 +91,15 @@ } throw new VerificationError(f.toString()); } + + private static String getLocation(Node node, StructuredGraph graph) { + String loc = GraphUtil.approxSourceLocation(node); + StackTraceElement ste = graph.method().asStackTraceElement(0); + if (loc == null) { + loc = ste.toString(); + } else { + loc = ste.getClassName() + "." + ste.getMethodName() + "(" + loc + ")"; + } + return loc; + } } diff -r 6e05e73c942c -r 5762848171e7 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 Wed Aug 27 17:01:57 2014 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java Wed Aug 27 18:58:15 2014 +0200 @@ -174,9 +174,9 @@ printProperty(bit, "true"); } } - if (node.getClass() == BeginNode.getGenClass()) { + if (node.getNodeClass().is(BeginNode.class)) { printProperty("shortName", "B"); - } else if (node.getClass() == EndNode.getGenClass()) { + } else if (node.getNodeClass().is(EndNode.class)) { printProperty("shortName", "E"); } if (node.predecessor() != null) {