changeset 16985:a1cb03f6b606

Merge.
author Doug Simon <doug.simon@oracle.com>
date Wed, 27 Aug 2014 20:02:06 +0200
parents a65b459ab270 (diff) 74520179dda8 (current diff)
children f7359a0ce946
files
diffstat 24 files changed, 72 insertions(+), 109 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRBuilder.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRBuilder.java	Wed Aug 27 20:02:06 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;
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Wed Aug 27 20:02:06 2014 +0200
@@ -94,7 +94,7 @@
     private ValueNode currentInstruction;
     private ValueNode lastInstructionPrinted; // Debugging only
 
-    private Map<Class<? extends ValueNode>, List<MatchStatement>> matchRules;
+    private Map<NodeClass, List<MatchStatement>> matchRules;
 
     public NodeLIRBuilder(StructuredGraph graph, LIRGeneratorTool gen) {
         this.gen = gen;
@@ -277,7 +277,7 @@
                         continue;
                     }
                     // See if this node is the root of any MatchStatements
-                    List<MatchStatement> statements = matchRules.get(node.getClass());
+                    List<MatchStatement> statements = matchRules.get(node.getNodeClass());
                     if (statements != null) {
                         for (MatchStatement statement : statements) {
                             if (statement.generate(this, index, node, nodes)) {
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchPattern.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchPattern.java	Wed Aug 27 20:02:06 2014 +0200
@@ -185,7 +185,7 @@
     }
 
     private Result matchType(ValueNode node) {
-        if (nodeClass != null && node.getClass() != nodeClass) {
+        if (nodeClass != null && node.getNodeClass() != NodeClass.get(nodeClass)) {
             return Result.WRONG_CLASS(node, this);
         }
         return Result.OK;
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchRuleRegistry.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/match/MatchRuleRegistry.java	Wed Aug 27 20:02:06 2014 +0200
@@ -79,7 +79,7 @@
         return result;
     }
 
-    private static final HashMap<Class<? extends NodeLIRBuilder>, Map<Class<? extends ValueNode>, List<MatchStatement>>> registry = new HashMap<>();
+    private static final HashMap<Class<? extends NodeLIRBuilder>, Map<NodeClass, List<MatchStatement>>> registry = new HashMap<>();
 
     /**
      * Collect all the {@link MatchStatement}s defined by the superclass chain of theClass.
@@ -87,12 +87,12 @@
      * @param theClass
      * @return the set of {@link MatchStatement}s applicable to theClass.
      */
-    public synchronized static Map<Class<? extends ValueNode>, List<MatchStatement>> lookup(Class<? extends NodeLIRBuilder> theClass) {
-        Map<Class<? extends ValueNode>, List<MatchStatement>> result = registry.get(theClass);
+    public synchronized static Map<NodeClass, List<MatchStatement>> lookup(Class<? extends NodeLIRBuilder> theClass) {
+        Map<NodeClass, List<MatchStatement>> result = registry.get(theClass);
 
         if (result == null) {
             NodeClassLookup lookup = new DefaultNodeClassLookup();
-            Map<Class<? extends ValueNode>, List<MatchStatement>> rules = createRules(theClass, lookup);
+            Map<NodeClass, List<MatchStatement>> rules = createRules(theClass, lookup);
             registry.put(theClass, rules);
             assert registry.get(theClass) == rules;
             result = rules;
@@ -100,7 +100,7 @@
             if (LogVerbose.getValue()) {
                 try (Scope s = Debug.scope("MatchComplexExpressions")) {
                     Debug.log("Match rules for %s", theClass.getSimpleName());
-                    for (Entry<Class<? extends ValueNode>, List<MatchStatement>> entry : result.entrySet()) {
+                    for (Entry<NodeClass, List<MatchStatement>> entry : result.entrySet()) {
                         Debug.log("  For node class: %s", entry.getKey());
                         for (MatchStatement statement : entry.getValue()) {
                             Debug.log("    %s", statement.getPattern());
@@ -120,7 +120,7 @@
      * This is a separate, public method so that external clients can create rules with a custom
      * lookup and without the default caching behavior.
      */
-    public static Map<Class<? extends ValueNode>, List<MatchStatement>> createRules(Class<? extends NodeLIRBuilder> theClass, NodeClassLookup lookup) {
+    public static Map<NodeClass, List<MatchStatement>> createRules(Class<? extends NodeLIRBuilder> theClass, NodeClassLookup lookup) {
         HashMap<Class<? extends NodeLIRBuilder>, MatchStatementSet> matchSets = new HashMap<>();
         Iterable<MatchStatementSet> sl = Services.load(MatchStatementSet.class);
         for (MatchStatementSet rules : sl) {
@@ -129,14 +129,14 @@
 
         // Walk the class hierarchy collecting lists and merge them together. The subclass
         // rules are first which gives them preference over earlier rules.
-        Map<Class<? extends ValueNode>, List<MatchStatement>> rules = new HashMap<>();
+        Map<NodeClass, List<MatchStatement>> rules = new HashMap<>();
         Class<?> currentClass = theClass;
         do {
             MatchStatementSet matchSet = matchSets.get(currentClass);
             if (matchSet != null) {
                 List<MatchStatement> statements = matchSet.statements(lookup);
                 for (MatchStatement statement : statements) {
-                    Class<? extends ValueNode> nodeClass = statement.getPattern().nodeClass();
+                    NodeClass nodeClass = NodeClass.get(statement.getPattern().nodeClass());
                     List<MatchStatement> current = rules.get(nodeClass);
                     if (current == null) {
                         current = new ArrayList<>();
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Wed Aug 27 20:02:06 2014 +0200
@@ -56,7 +56,7 @@
 @NodeInfo
 public abstract class Node implements Cloneable, Formattable {
 
-    public final static boolean USE_GENERATED_NODES = Boolean.getBoolean("graal.useGeneratedNodes");
+    public final static boolean USE_GENERATED_NODES = Boolean.parseBoolean(System.getProperty("graal.useGeneratedNodes", "true"));
 
     static final int DELETED_ID_START = -1000000000;
     static final int INITIAL_ID = -1;
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Wed Aug 27 20:02:06 2014 +0200
@@ -54,8 +54,7 @@
      */
     @SuppressWarnings("unchecked")
     public static NodeClass get(Class<?> c) {
-        GeneratedNode gen = c.getAnnotation(GeneratedNode.class);
-        Class<? extends Node> key = gen == null ? (Class<? extends Node>) c : (Class<? extends Node>) gen.value();
+        Class<? extends Node> key = (Class<? extends Node>) 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<? extends Node> genKey = (Class<? extends Node>) 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<InputType> 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<? extends Node> 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) {
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Wed Aug 27 20:02:06 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;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -42,10 +42,6 @@
         return USE_GENERATED_NODES ? new BeginNodeGen() : new BeginNode();
     }
 
-    public static Class<? extends BeginNode> getGenClass() {
-        return USE_GENERATED_NODES ? BeginNodeGen.class : BeginNode.class;
-    }
-
     protected BeginNode() {
         super(StampFactory.forVoid());
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EndNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EndNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -30,10 +30,6 @@
         return USE_GENERATED_NODES ? new EndNodeGen() : new EndNode();
     }
 
-    public static Class<? extends EndNode> getGenClass() {
-        return USE_GENERATED_NODES ? EndNodeGen.class : EndNode.class;
-    }
-
     EndNode() {
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Wed Aug 27 20:02:06 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();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -37,7 +37,7 @@
  * The {@code InvokeNode} represents all kinds of method calls.
  */
 @NodeInfo(nameTemplate = "Invoke#{p#targetMethod/s}", allowedUsageTypes = {InputType.Memory})
-public class InvokeNode extends AbstractMemoryCheckpoint implements Invoke, LIRLowerable, MemoryCheckpoint.Single, IterableNodeType {
+public class InvokeNode extends AbstractMemoryCheckpoint implements Invoke, LIRLowerable, MemoryCheckpoint.Single {
 
     @Input(InputType.Extension) CallTargetNode callTarget;
     @OptionalInput(InputType.State) FrameState stateDuring;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -43,10 +43,6 @@
         return USE_GENERATED_NODES ? new MergeNodeGen() : new MergeNode();
     }
 
-    public static Class<? extends MergeNode> getGenClass() {
-        return USE_GENERATED_NODES ? MergeNodeGen.class : MergeNode.class;
-    }
-
     protected MergeNode() {
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -39,10 +39,6 @@
         return USE_GENERATED_NODES ? new AndNodeGen(x, y) : new AndNode(x, y);
     }
 
-    public static Class<? extends AndNode> 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());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -37,10 +37,6 @@
         return USE_GENERATED_NODES ? new FloatAddNodeGen(x, y, isStrictFP) : new FloatAddNode(x, y, isStrictFP);
     }
 
-    public static Class<? extends FloatAddNode> getGenClass() {
-        return USE_GENERATED_NODES ? FloatAddNodeGen.class : FloatAddNode.class;
-    }
-
     protected FloatAddNode(ValueNode x, ValueNode y, boolean isStrictFP) {
         super(x.stamp().unrestricted(), x, y, isStrictFP);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -37,10 +37,6 @@
         return USE_GENERATED_NODES ? new FloatMulNodeGen(x, y, isStrictFP) : new FloatMulNode(x, y, isStrictFP);
     }
 
-    public static Class<? extends FloatMulNode> getGenClass() {
-        return USE_GENERATED_NODES ? FloatMulNodeGen.class : FloatMulNode.class;
-    }
-
     protected FloatMulNode(ValueNode x, ValueNode y, boolean isStrictFP) {
         super(x.stamp().unrestricted(), x, y, isStrictFP);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -38,10 +38,6 @@
         return USE_GENERATED_NODES ? new FloatSubNodeGen(x, y, isStrictFP) : new FloatSubNode(x, y, isStrictFP);
     }
 
-    public static Class<? extends FloatSubNode> getGenClass() {
-        return USE_GENERATED_NODES ? FloatSubNodeGen.class : FloatSubNode.class;
-    }
-
     protected FloatSubNode(ValueNode x, ValueNode y, boolean isStrictFP) {
         super(x.stamp().unrestricted(), x, y, isStrictFP);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -38,10 +38,6 @@
         return USE_GENERATED_NODES ? new IntegerAddNodeGen(x, y) : new IntegerAddNode(x, y);
     }
 
-    public static Class<? extends IntegerAddNode> getGenClass() {
-        return USE_GENERATED_NODES ? IntegerAddNodeGen.class : IntegerAddNode.class;
-    }
-
     protected IntegerAddNode(ValueNode x, ValueNode y) {
         super(StampTool.add(x.stamp(), y.stamp()), x, y);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -38,10 +38,6 @@
         return USE_GENERATED_NODES ? new IntegerMulNodeGen(x, y) : new IntegerMulNode(x, y);
     }
 
-    public static Class<? extends IntegerMulNode> 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());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -39,10 +39,6 @@
         return USE_GENERATED_NODES ? new IntegerSubNodeGen(x, y) : new IntegerSubNode(x, y);
     }
 
-    public static Class<? extends IntegerSubNode> getGenClass() {
-        return USE_GENERATED_NODES ? IntegerSubNodeGen.class : IntegerSubNode.class;
-    }
-
     protected IntegerSubNode(ValueNode x, ValueNode y) {
         super(StampTool.sub(x.stamp(), y.stamp()), x, y);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -39,10 +39,6 @@
         return USE_GENERATED_NODES ? new OrNodeGen(x, y) : new OrNode(x, y);
     }
 
-    public static Class<? extends OrNode> 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());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java	Wed Aug 27 20:02:06 2014 +0200
@@ -39,10 +39,6 @@
         return USE_GENERATED_NODES ? new XorNodeGen(x, y) : new XorNode(x, y);
     }
 
-    public static Class<? extends XorNode> 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());
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/ComputeInliningRelevance.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/ComputeInliningRelevance.java	Wed Aug 27 20:02:06 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);
                     }
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/verify/VerifyNoNodeClassLiteralIdentityTests.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/verify/VerifyNoNodeClassLiteralIdentityTests.java	Wed Aug 27 20:02:06 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:
  *
  * <pre>
  *     if (operation.getClass() == IntegerAddNode.class) { ... }
@@ -48,7 +48,7 @@
  * this should be used:
  *
  * <pre>
- *     if (operation.getClass() == IntegerAddNode.getGenClass()) { ... }
+ *     if (operation.getNodeClass().is(IntegerAddNode.class)) { ... }
  * </pre>
  *
  * 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<String, String> 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<Node> 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;
+    }
 }
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java	Wed Aug 27 17:54:09 2014 +0200
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java	Wed Aug 27 20:02:06 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) {