changeset 17276:ffb974bef674

moved Node valueNumber and valueEquals logic (optionally) to generated nodes
author Doug Simon <doug.simon@oracle.com>
date Wed, 01 Oct 2014 07:39:47 +0200
parents 846c059e3ecf
children 730aa0eb20e5
files graal/com.oracle.graal.graph.test/src/com/oracle/graal/graph/test/TypedNodeIteratorTest.java graal/com.oracle.graal.graph.test/src/com/oracle/graal/graph/test/TypedNodeIteratorTest2.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64RawNativeCallNode.java graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/replacements/HSAILDirectStoreReleaseNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/AllocaNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CStringNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentJavaThreadNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentLockNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DeoptimizationFetchUnrollInfoCallNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DeoptimizeCallerNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DimensionsNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PostWriteBarrier.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PreWriteBarrier.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1ReferentFieldReadBarrier.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewMultiArrayStubCall.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/SaveAllRegistersNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/SerialWriteBarrier.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubStartNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/UncommonTrapCallNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrier.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyCallNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopyNode.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractFixedGuardNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractLocalNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConditionAnchorNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InfopointNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/KillingBeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConstantNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoweredCallTargetNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryPhiNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ShortCircuitOrNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SimpleInfopointNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeProfileProxyNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AddNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/MulNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/debug/DynamicCounterNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractWriteNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BoxNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BytecodeExceptionNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedAccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IntegerSwitchNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/JavaReadNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/JavaWriteNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadMethodNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnboxNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeAccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AbstractNewArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AbstractNewObjectNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessIndexedNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AtomicReadAndAddNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AtomicReadAndWriteNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorIdNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewMultiArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/SelfReplacingMethodCallTargetNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/CommitAllocationNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualBoxingNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64FloatConvertNode.java graal/com.oracle.graal.replacements.hsail/src/com/oracle/graal/replacements/hsail/HSAILMathIntrinsicsNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ArrayEqualsNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/AssertionNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectObjectStoreNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectStoreNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MathIntrinsicNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReadRegisterNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/WriteRegisterNode.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/asserts/NeverPartOfCompilationNode.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/NewFrameNode.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadFinalNode.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/UnsafeTypeCastMacroNode.java graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/SnippetLocationNode.java
diffstat 123 files changed, 390 insertions(+), 256 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph.test/src/com/oracle/graal/graph/test/TypedNodeIteratorTest.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.graph.test/src/com/oracle/graal/graph/test/TypedNodeIteratorTest.java	Wed Oct 01 07:39:47 2014 +0200
@@ -36,7 +36,7 @@
     @NodeInfo
     static class TestNode extends Node implements IterableNodeType, TestNodeInterface {
 
-        private final String name;
+        protected final String name;
 
         public static TestNode create(String name) {
             return USE_GENERATED_NODES ? new TypedNodeIteratorTest_TestNodeGen(name) : new TestNode(name);
--- a/graal/com.oracle.graal.graph.test/src/com/oracle/graal/graph/test/TypedNodeIteratorTest2.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.graph.test/src/com/oracle/graal/graph/test/TypedNodeIteratorTest2.java	Wed Oct 01 07:39:47 2014 +0200
@@ -34,7 +34,7 @@
     @NodeInfo
     static class NodeA extends Node implements TestNodeInterface {
 
-        private final String name;
+        protected final String name;
 
         public static NodeA create(String name) {
             return USE_GENERATED_NODES ? new TypedNodeIteratorTest2_NodeAGen(name) : new NodeA(name);
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java	Wed Oct 01 07:39:47 2014 +0200
@@ -453,9 +453,4 @@
     public Type type() {
         return type;
     }
-
-    @Override
-    public String toString() {
-        return super.toString() + ":" + type;
-    }
 }
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java	Wed Oct 01 07:39:47 2014 +0200
@@ -91,14 +91,14 @@
         private final Node node;
 
         public CacheEntry(Node node) {
-            assert node.getNodeClass().valueNumberable();
+            assert node instanceof ValueNumberable;
             assert node.isLeafNode();
             this.node = node;
         }
 
         @Override
         public int hashCode() {
-            return node.getNodeClass().valueNumber(node);
+            return Node.USE_GENERATED_NODES ? node.getValueNumber() : node.getNodeClass().valueNumber(node);
         }
 
         @Override
@@ -108,9 +108,8 @@
             }
             if (obj instanceof CacheEntry) {
                 CacheEntry other = (CacheEntry) obj;
-                NodeClass nodeClass = node.getNodeClass();
                 if (other.node.getClass() == node.getClass()) {
-                    return nodeClass.valueEqual(node, other.node);
+                    return node.valueEquals(other.node);
                 }
             }
             return false;
@@ -498,7 +497,7 @@
             }
             if (minCountNode != null) {
                 for (Node usage : minCountNode.usages()) {
-                    if (usage != node && nodeClass == usage.getNodeClass() && nodeClass.valueEqual(node, usage) && nodeClass.getEdges(Inputs).areEqualIn(node, usage) &&
+                    if (usage != node && nodeClass == usage.getNodeClass() && node.valueEquals(usage) && nodeClass.getEdges(Inputs).areEqualIn(node, usage) &&
                                     nodeClass.getEdges(Successors).areEqualIn(node, usage)) {
                         return usage;
                     }
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Wed Oct 01 07:39:47 2014 +0200
@@ -995,4 +995,40 @@
             }
         }
     }
+
+    /**
+     * If this node is {@link ValueNumberable}, gets a digest for this node based on the current
+     * value of it's {@link NodeClass#getData() data} fields. If this node is not
+     * {@link ValueNumberable}, 0 is returned.
+     *
+     * Overridden by a method generated for {@link ValueNumberable} subclasses.
+     */
+    public int getValueNumber() {
+        assert !(this instanceof ValueNumberable);
+        return 0;
+    }
+
+    /**
+     * Overridden by a generated method.
+     *
+     * @param other
+     */
+    protected boolean valueEqualsGen(Node other) {
+        return true;
+    }
+
+    /**
+     * Determines if this node's {@link NodeClass#getData() data} fields are equal to the data
+     * fields of another node of the same type. Primitive fields are compared by value and
+     * non-primitive fields are compared by {@link Objects#equals(Object, Object)}.
+     *
+     * The result of this method undefined if {@code other.getClass() != this.getClass()} or if this
+     * node is not {@link ValueNumberable}
+     *
+     * @param other a node of exactly the same type as this node
+     * @return true if the data fields of this object and {@code other} are equal
+     */
+    public boolean valueEquals(Node other) {
+        return USE_GENERATED_NODES ? valueEqualsGen(other) : getNodeClass().valueEqual(this, other);
+    }
 }
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Wed Oct 01 07:39:47 2014 +0200
@@ -274,15 +274,18 @@
         return nodeClass == getClazz();
     }
 
+    private String shortName;
+
     public String shortName() {
-        NodeInfo info = getClazz().getAnnotation(NodeInfo.class);
-        String shortName;
-        if (!info.shortName().isEmpty()) {
-            shortName = info.shortName();
-        } else {
-            shortName = getClazz().getSimpleName();
-            if (shortName.endsWith("Node") && !shortName.equals("StartNode") && !shortName.equals("EndNode")) {
-                shortName = shortName.substring(0, shortName.length() - 4);
+        if (shortName == null) {
+            NodeInfo info = getClazz().getAnnotation(NodeInfo.class);
+            if (!info.shortName().isEmpty()) {
+                shortName = info.shortName();
+            } else {
+                shortName = getClazz().getSimpleName();
+                if (shortName.endsWith("Node") && !shortName.equals("StartNode") && !shortName.equals("EndNode")) {
+                    shortName = shortName.substring(0, shortName.length() - 4);
+                }
             }
         }
         return shortName;
@@ -552,9 +555,7 @@
     }
 
     public boolean valueEqual(Node a, Node b) {
-        if (a.getClass() != b.getClass()) {
-            return a == b;
-        }
+        assert a.getClass() == b.getClass();
         for (int i = 0; i < data.getCount(); ++i) {
             Class<?> type = data.getType(i);
             if (type.isPrimitive()) {
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64RawNativeCallNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64RawNativeCallNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -35,7 +35,7 @@
 @NodeInfo
 public class AMD64RawNativeCallNode extends FixedWithNextNode implements LIRLowerable {
 
-    private final Constant functionPointer;
+    protected final Constant functionPointer;
     @Input NodeInputList<ValueNode> args;
 
     public static AMD64RawNativeCallNode create(Kind returnType, Constant functionPointer, ValueNode[] args) {
--- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/replacements/HSAILDirectStoreReleaseNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/replacements/HSAILDirectStoreReleaseNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -45,8 +45,8 @@
     public void generate(NodeLIRBuilderTool gen) {
         HSAILHotSpotLIRGenerator hsailgen = (HSAILHotSpotLIRGenerator) (gen.getLIRGeneratorTool());
         Value v = gen.operand(getValue());
-        LIRKind kind = hsailgen.getLIRKind(getValue().stamp());
-        hsailgen.emitStoreRelease(kind, gen.operand(getAddress()), v, null);
+        LIRKind lirKind = hsailgen.getLIRKind(getValue().stamp());
+        hsailgen.emitStoreRelease(lirKind, gen.operand(getAddress()), v, null);
     }
 
     @NodeIntrinsic
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/AllocaNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/AllocaNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -42,14 +42,14 @@
     /**
      * The number of slots in block.
      */
-    private final int slots;
+    protected final int slots;
 
     /**
      * The indexes of the object pointer slots in the block. Each such object pointer slot must be
      * initialized before any safepoint in the method otherwise the garbage collector will see
      * garbage values when processing these slots.
      */
-    private final BitSet objects;
+    protected final BitSet objects;
 
     public static AllocaNode create(int slots, BitSet objects) {
         return USE_GENERATED_NODES ? new AllocaNodeGen(slots, objects) : new AllocaNode(slots, objects);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,7 +40,7 @@
 @NodeInfo(allowedUsageTypes = {InputType.Memory})
 public class BeginLockScopeNode extends AbstractMemoryCheckpoint implements LIRLowerable, MonitorEnter, MemoryCheckpoint.Single {
 
-    private int lockDepth;
+    protected int lockDepth;
 
     public static BeginLockScopeNode create(int lockDepth) {
         return USE_GENERATED_NODES ? new BeginLockScopeNodeGen(lockDepth) : new BeginLockScopeNode(lockDepth);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CStringNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CStringNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -34,7 +34,7 @@
 @NodeInfo
 public class CStringNode extends FloatingNode implements LIRLowerable {
 
-    private final String string;
+    protected final String string;
 
     public static CStringNode create(String string) {
         return USE_GENERATED_NODES ? new CStringNodeGen(string) : new CStringNode(string);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -47,8 +47,8 @@
         Uncompress
     }
 
-    private final CompressionOp op;
-    private final CompressEncoding encoding;
+    protected final CompressionOp op;
+    protected final CompressEncoding encoding;
 
     public static CompressionNode create(CompressionOp op, ValueNode input, CompressEncoding encoding) {
         return USE_GENERATED_NODES ? new CompressionNodeGen(op, input, encoding) : new CompressionNode(op, input, encoding);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentJavaThreadNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentJavaThreadNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,7 +40,7 @@
 @NodeInfo
 public class CurrentJavaThreadNode extends FloatingNode implements LIRLowerable {
 
-    private LIRKind wordKind;
+    protected LIRKind wordKind;
 
     public static CurrentJavaThreadNode create(Kind kind) {
         return USE_GENERATED_NODES ? new CurrentJavaThreadNodeGen(kind) : new CurrentJavaThreadNode(kind);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentLockNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentLockNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -36,7 +36,7 @@
 @NodeInfo
 public class CurrentLockNode extends FixedWithNextNode implements LIRLowerable {
 
-    private int lockDepth;
+    protected int lockDepth;
 
     public static CurrentLockNode create(int lockDepth) {
         return USE_GENERATED_NODES ? new CurrentLockNodeGen(lockDepth) : new CurrentLockNode(lockDepth);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DeoptimizationFetchUnrollInfoCallNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DeoptimizationFetchUnrollInfoCallNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -42,7 +42,7 @@
 public class DeoptimizationFetchUnrollInfoCallNode extends FixedWithNextNode implements LIRLowerable, MemoryCheckpoint.Multi {
 
     @Input SaveAllRegistersNode registerSaver;
-    private final ForeignCallsProvider foreignCalls;
+    protected final ForeignCallsProvider foreignCalls;
 
     public static DeoptimizationFetchUnrollInfoCallNode create(@InjectedNodeParameter ForeignCallsProvider foreignCalls, ValueNode registerSaver) {
         return USE_GENERATED_NODES ? new DeoptimizationFetchUnrollInfoCallNodeGen(foreignCalls, registerSaver) : new DeoptimizationFetchUnrollInfoCallNode(foreignCalls, registerSaver);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DeoptimizeCallerNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DeoptimizeCallerNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -35,8 +35,8 @@
 @NodeInfo(shortName = "DeoptCaller", nameTemplate = "DeoptCaller {p#reason/s}")
 public class DeoptimizeCallerNode extends ControlSinkNode implements LIRLowerable {
 
-    private final DeoptimizationAction action;
-    private final DeoptimizationReason reason;
+    protected final DeoptimizationAction action;
+    protected final DeoptimizationReason reason;
 
     public static DeoptimizeCallerNode create(DeoptimizationAction action, DeoptimizationReason reason) {
         return USE_GENERATED_NODES ? new DeoptimizeCallerNodeGen(action, reason) : new DeoptimizeCallerNode(action, reason);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DimensionsNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DimensionsNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -41,7 +41,7 @@
 @NodeInfo
 public class DimensionsNode extends FixedWithNextNode implements LIRLowerable {
 
-    private final int rank;
+    protected final int rank;
 
     public static DimensionsNode create(int rank) {
         return USE_GENERATED_NODES ? new DimensionsNodeGen(rank) : new DimensionsNode(rank);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -45,7 +45,7 @@
     @Input ValueNode expectedValue;
     @Input ValueNode newValue;
 
-    private final LocationIdentity locationIdentity;
+    protected final LocationIdentity locationIdentity;
 
     public static DirectCompareAndSwapNode create(ValueNode object, ValueNode offset, ValueNode expected, ValueNode newValue, LocationIdentity locationIdentity) {
         return USE_GENERATED_NODES ? new DirectCompareAndSwapNodeGen(object, offset, expected, newValue, locationIdentity) : new DirectCompareAndSwapNode(object, offset, expected, newValue,
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PostWriteBarrier.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PostWriteBarrier.java	Wed Oct 01 07:39:47 2014 +0200
@@ -29,7 +29,7 @@
 @NodeInfo
 public class G1PostWriteBarrier extends WriteBarrier {
 
-    private final boolean alwaysNull;
+    protected final boolean alwaysNull;
 
     public static G1PostWriteBarrier create(ValueNode object, ValueNode value, LocationNode location, boolean precise, boolean alwaysNull) {
         return USE_GENERATED_NODES ? new G1PostWriteBarrierGen(object, value, location, precise, alwaysNull) : new G1PostWriteBarrier(object, value, location, precise, alwaysNull);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PreWriteBarrier.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PreWriteBarrier.java	Wed Oct 01 07:39:47 2014 +0200
@@ -30,8 +30,8 @@
 public class G1PreWriteBarrier extends WriteBarrier implements DeoptimizingNode.DeoptBefore {
 
     @OptionalInput(InputType.State) FrameState stateBefore;
-    private final boolean nullCheck;
-    private final boolean doLoad;
+    protected final boolean nullCheck;
+    protected final boolean doLoad;
 
     public static G1PreWriteBarrier create(ValueNode object, ValueNode expectedObject, LocationNode location, boolean doLoad, boolean nullCheck) {
         return USE_GENERATED_NODES ? new G1PreWriteBarrierGen(object, expectedObject, location, doLoad, nullCheck) : new G1PreWriteBarrier(object, expectedObject, location, doLoad, nullCheck);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1ReferentFieldReadBarrier.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1ReferentFieldReadBarrier.java	Wed Oct 01 07:39:47 2014 +0200
@@ -35,7 +35,7 @@
 @NodeInfo
 public class G1ReferentFieldReadBarrier extends WriteBarrier {
 
-    private final boolean doLoad;
+    protected final boolean doLoad;
 
     public static G1ReferentFieldReadBarrier create(ValueNode object, ValueNode expectedObject, LocationNode location, boolean doLoad) {
         return USE_GENERATED_NODES ? new G1ReferentFieldReadBarrierGen(object, expectedObject, location, doLoad) : new G1ReferentFieldReadBarrier(object, expectedObject, location, doLoad);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewMultiArrayStubCall.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewMultiArrayStubCall.java	Wed Oct 01 07:39:47 2014 +0200
@@ -44,7 +44,7 @@
 
     @Input ValueNode hub;
     @Input ValueNode dims;
-    private final int rank;
+    protected final int rank;
 
     public static NewMultiArrayStubCall create(@InjectedNodeParameter ForeignCallsProvider foreignCalls, ValueNode hub, int rank, ValueNode dims) {
         return USE_GENERATED_NODES ? new NewMultiArrayStubCallGen(foreignCalls, hub, rank, dims) : new NewMultiArrayStubCall(foreignCalls, hub, rank, dims);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/SaveAllRegistersNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/SaveAllRegistersNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -37,7 +37,7 @@
 @NodeInfo(allowedUsageTypes = {InputType.Memory})
 public class SaveAllRegistersNode extends FixedWithNextNode implements LIRLowerable, MemoryCheckpoint.Single {
 
-    private SaveRegistersOp saveRegistersOp;
+    protected SaveRegistersOp saveRegistersOp;
 
     public static SaveAllRegistersNode create() {
         return USE_GENERATED_NODES ? new SaveAllRegistersNodeGen() : new SaveAllRegistersNode();
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/SerialWriteBarrier.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/SerialWriteBarrier.java	Wed Oct 01 07:39:47 2014 +0200
@@ -29,7 +29,7 @@
 @NodeInfo
 public class SerialWriteBarrier extends WriteBarrier {
 
-    private final boolean alwaysNull;
+    protected final boolean alwaysNull;
 
     public static SerialWriteBarrier create(ValueNode object, LocationNode location, boolean precise, boolean alwaysNull) {
         return USE_GENERATED_NODES ? new SerialWriteBarrierGen(object, location, precise, alwaysNull) : new SerialWriteBarrier(object, location, precise, alwaysNull);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -41,9 +41,9 @@
 public class StubForeignCallNode extends FixedWithNextNode implements LIRLowerable, MemoryCheckpoint.Multi {
 
     @Input NodeInputList<ValueNode> arguments;
-    private final ForeignCallsProvider foreignCalls;
+    protected final ForeignCallsProvider foreignCalls;
 
-    private final ForeignCallDescriptor descriptor;
+    protected final ForeignCallDescriptor descriptor;
 
     public static StubForeignCallNode create(@InjectedNodeParameter ForeignCallsProvider foreignCalls, ForeignCallDescriptor descriptor, ValueNode... arguments) {
         return USE_GENERATED_NODES ? new StubForeignCallNodeGen(foreignCalls, descriptor, arguments) : new StubForeignCallNode(foreignCalls, descriptor, arguments);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubStartNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubStartNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -32,7 +32,7 @@
 @NodeInfo
 public class StubStartNode extends StartNode {
 
-    private final Stub stub;
+    protected final Stub stub;
 
     public static StubStartNode create(Stub stub) {
         return USE_GENERATED_NODES ? new StubStartNodeGen(stub) : new StubStartNode(stub);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/UncommonTrapCallNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/UncommonTrapCallNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -43,7 +43,7 @@
 
     @Input ValueNode trapRequest;
     @Input SaveAllRegistersNode registerSaver;
-    private final ForeignCallsProvider foreignCalls;
+    protected final ForeignCallsProvider foreignCalls;
 
     public static UncommonTrapCallNode create(@InjectedNodeParameter ForeignCallsProvider foreignCalls, ValueNode registerSaver, ValueNode trapRequest) {
         return USE_GENERATED_NODES ? new UncommonTrapCallNodeGen(foreignCalls, registerSaver, trapRequest) : new UncommonTrapCallNode(foreignCalls, registerSaver, trapRequest);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,7 +40,7 @@
 @NodeInfo
 public class VMErrorNode extends DeoptimizingStubCall implements LIRLowerable {
 
-    private final String format;
+    protected final String format;
     @Input ValueNode value;
 
     public static VMErrorNode create(String format, ValueNode value) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrier.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrier.java	Wed Oct 01 07:39:47 2014 +0200
@@ -34,7 +34,7 @@
     @Input protected ValueNode object;
     @OptionalInput protected ValueNode value;
     @OptionalInput(InputType.Association) protected LocationNode location;
-    private final boolean precise;
+    protected final boolean precise;
 
     public WriteBarrier(ValueNode object, ValueNode value, LocationNode location, boolean precise) {
         super(StampFactory.forVoid());
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyCallNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyCallNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -49,14 +49,14 @@
     @Input ValueNode destPos;
     @Input ValueNode length;
 
-    private Kind elementKind;
+    protected Kind elementKind;
 
     /**
      * Aligned means that the offset of the copy is heap word aligned.
      */
-    private boolean aligned;
-    private boolean disjoint;
-    private boolean uninitialized;
+    protected boolean aligned;
+    protected boolean disjoint;
+    protected boolean uninitialized;
 
     public static ArrayCopyCallNode create(ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, Kind elementKind, boolean aligned, boolean disjoint,
                     boolean uninitialized) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -49,11 +49,11 @@
 public class MethodHandleNode extends MacroStateSplitNode implements Simplifiable {
 
     /** The method that this node is representing. */
-    private final IntrinsicMethod intrinsicMethod;
+    protected final IntrinsicMethod intrinsicMethod;
 
     // Replacement method data
-    private ResolvedJavaMethod replacementTargetMethod;
-    private JavaType replacementReturnType;
+    protected ResolvedJavaMethod replacementTargetMethod;
+    protected JavaType replacementReturnType;
     @Input NodeInputList<ValueNode> replacementArguments;
 
     public static MethodHandleNode create(Invoke invoke) {
@@ -171,11 +171,11 @@
      * Helper function to get the {@link InvokeNode} for the targetMethod of a
      * java.lang.invoke.MemberName.
      *
-     * @param targetMethod the target, already loaded from the member name node
+     * @param target the target, already loaded from the member name node
      * @return invoke node for the member name target
      */
-    private InvokeNode getTargetInvokeNode(ResolvedJavaMethod targetMethod) {
-        if (targetMethod == null) {
+    private InvokeNode getTargetInvokeNode(ResolvedJavaMethod target) {
+        if (target == null) {
             return null;
         }
 
@@ -183,19 +183,19 @@
         // involving class loaders. When we optimize a method handle invoke
         // to a direct call we must cast the receiver and arguments to its
         // actual types.
-        Signature signature = targetMethod.getSignature();
-        final boolean isStatic = targetMethod.isStatic();
+        Signature signature = target.getSignature();
+        final boolean isStatic = target.isStatic();
         final int receiverSkip = isStatic ? 0 : 1;
 
         // Cast receiver to its type.
         if (!isStatic) {
-            JavaType receiverType = targetMethod.getDeclaringClass();
+            JavaType receiverType = target.getDeclaringClass();
             maybeCastArgument(0, receiverType);
         }
 
         // Cast reference arguments to its type.
         for (int index = 0; index < signature.getParameterCount(false); index++) {
-            JavaType parameterType = signature.getParameterType(index, targetMethod.getDeclaringClass());
+            JavaType parameterType = signature.getParameterType(index, target.getDeclaringClass());
             maybeCastArgument(receiverSkip + index, parameterType);
         }
 
@@ -203,18 +203,18 @@
         if (intrinsicMethod == IntrinsicMethod.LINK_TO_VIRTUAL || intrinsicMethod == IntrinsicMethod.LINK_TO_INTERFACE) {
             ResolvedJavaType receiverType = StampTool.typeOrNull(getReceiver().stamp());
             if (receiverType != null) {
-                ResolvedJavaMethod concreteMethod = receiverType.findUniqueConcreteMethod(targetMethod);
+                ResolvedJavaMethod concreteMethod = receiverType.findUniqueConcreteMethod(target);
                 if (concreteMethod != null) {
                     return createTargetInvokeNode(concreteMethod);
                 }
             }
         }
 
-        if (targetMethod.canBeStaticallyBound()) {
-            return createTargetInvokeNode(targetMethod);
+        if (target.canBeStaticallyBound()) {
+            return createTargetInvokeNode(target);
         }
 
-        ResolvedJavaMethod concreteMethod = targetMethod.getDeclaringClass().findUniqueConcreteMethod(targetMethod);
+        ResolvedJavaMethod concreteMethod = target.getDeclaringClass().findUniqueConcreteMethod(target);
         if (concreteMethod != null) {
             return createTargetInvokeNode(concreteMethod);
         }
@@ -247,12 +247,12 @@
      * Creates an {@link InvokeNode} for the given target method. The {@link CallTargetNode} passed
      * to the InvokeNode is in fact a {@link SelfReplacingMethodCallTargetNode}.
      *
-     * @param targetMethod the method the be called
+     * @param target the method to be called
      * @return invoke node for the member name target
      */
-    private InvokeNode createTargetInvokeNode(ResolvedJavaMethod targetMethod) {
-        InvokeKind invokeKind = targetMethod.isStatic() ? InvokeKind.Static : InvokeKind.Special;
-        JavaType returnType = targetMethod.getSignature().getReturnType(null);
+    private InvokeNode createTargetInvokeNode(ResolvedJavaMethod target) {
+        InvokeKind targetInvokeKind = target.isStatic() ? InvokeKind.Static : InvokeKind.Special;
+        JavaType targetReturnType = target.getSignature().getReturnType(null);
 
         // MethodHandleLinkTo* nodes have a trailing MemberName argument which
         // needs to be popped.
@@ -275,10 +275,10 @@
         // If there is already replacement information, use that instead.
         MethodCallTargetNode callTarget;
         if (replacementTargetMethod == null) {
-            callTarget = SelfReplacingMethodCallTargetNode.create(invokeKind, targetMethod, targetArguments, returnType, getTargetMethod(), originalArguments, getReturnType());
+            callTarget = SelfReplacingMethodCallTargetNode.create(targetInvokeKind, target, targetArguments, targetReturnType, getTargetMethod(), originalArguments, getReturnType());
         } else {
             ValueNode[] args = replacementArguments.toArray(new ValueNode[replacementArguments.size()]);
-            callTarget = SelfReplacingMethodCallTargetNode.create(invokeKind, targetMethod, targetArguments, returnType, replacementTargetMethod, args, replacementReturnType);
+            callTarget = SelfReplacingMethodCallTargetNode.create(targetInvokeKind, target, targetArguments, targetReturnType, replacementTargetMethod, args, replacementReturnType);
         }
         graph().add(callTarget);
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopyNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopyNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -42,7 +42,7 @@
     @Input ValueNode length;
     @OptionalInput ValueNode layoutHelper;
 
-    private Kind elementKind;
+    protected Kind elementKind;
 
     public static UnsafeArrayCopyNode create(ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, ValueNode layoutHelper, Kind elementKind) {
         return USE_GENERATED_NODES ? new UnsafeArrayCopyNodeGen(src, srcPos, dest, destPos, length, layoutHelper, elementKind) : new UnsafeArrayCopyNode(src, srcPos, dest, destPos, length,
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Wed Oct 01 07:39:47 2014 +0200
@@ -108,7 +108,7 @@
              * the !NODE_CLASS.isAssignableFrom(type) guarantee in
              * NodeClass.FieldScanner.scanField() to fail.
              */
-            private final Object nextPlaceholder;
+            protected final Object nextPlaceholder;
 
             public static BlockPlaceholderNode create(BytecodeParser builder) {
                 return USE_GENERATED_NODES ? new GraphBuilderPhase_Instance_BlockPlaceholderNodeGen(builder) : new BlockPlaceholderNode(builder);
--- a/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java	Wed Oct 01 07:39:47 2014 +0200
@@ -60,6 +60,7 @@
     @SuppressWarnings("unused") private final TypeElement NodeList;
     private final TypeElement NodeInputList;
     private final TypeElement NodeSuccessorList;
+    private final TypeElement ValueNumberable;
     @SuppressWarnings("unused") private final TypeElement Position;
 
     private final List<VariableElement> inputFields = new ArrayList<>();
@@ -87,6 +88,7 @@
         this.NodeInputList = getTypeElement("com.oracle.graal.graph.NodeInputList");
         this.NodeSuccessorList = getTypeElement("com.oracle.graal.graph.NodeSuccessorList");
         this.Position = getTypeElement("com.oracle.graal.graph.Position");
+        this.ValueNumberable = getTypeElement("com.oracle.graal.graph.Node.ValueNumberable");
     }
 
     @SafeVarargs
@@ -243,6 +245,11 @@
                     if (isAssignableWithErasure(field, NodeSuccessorList)) {
                         throw new ElementException(field, "NodeSuccessorList field must be annotated with @" + Successor.getSimpleName());
                     }
+                    if (modifiers.contains(PUBLIC) && !modifiers.contains(FINAL)) {
+                        throw new ElementException(field, "Data field must be final if public otherwise it must be protected or package-private");
+                    } else if (modifiers.contains(PRIVATE)) {
+                        throw new ElementException(field, "Data field must be protected or package-private");
+                    }
                     dataFields.add(field);
                 }
             }
@@ -334,6 +341,9 @@
             if (hasInputs || hasSuccessors) {
                 createIsLeafNodeMethod();
             }
+
+            createValueNumberMethod(node);
+            createValueEqualsMethod();
         }
         compilationUnit.add(genClass);
         return compilationUnit;
@@ -395,7 +405,6 @@
         genClassName = null;
     }
 
-    @SuppressWarnings("unused")
     private CodeVariableElement addParameter(CodeExecutableElement method, TypeMirror type, String name) {
         return addParameter(method, type, name, true);
     }
@@ -432,6 +441,98 @@
         checkOnlyInGenNode(method);
     }
 
+    private void createValueNumberMethod(TypeElement node) {
+        if (isAssignableWithErasure(node, ValueNumberable)) {
+            genClass.add(new CodeVariableElement(modifiers(PRIVATE), getType(int.class), "valueNumber"));
+
+            CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), getType(int.class), "getValueNumber");
+            CodeTreeBuilder b = method.createBuilder();
+            b.startIf().string("valueNumber == 0").end().startBlock();
+            b.startStatement().string("int number = " + node.hashCode()).end();
+            for (VariableElement f : dataFields) {
+                String fname = f.getSimpleName().toString();
+                switch (f.asType().getKind()) {
+                    case BOOLEAN:
+                        b.startIf().string(fname).end().startBlock();
+                        b.startStatement().string("number += 7").end();
+                        b.end();
+                        break;
+                    case BYTE:
+                    case SHORT:
+                    case CHAR:
+                    case INT:
+                        b.startStatement().string("number += 13 * ", fname).end();
+                        break;
+                    case FLOAT:
+                        b.startStatement().string("number += 17 * Float.floatToRawIntBits(", fname, ")").end();
+                        break;
+                    case LONG:
+                        b.startStatement().string("number += 19 * ", fname + " ^ (", fname, " >>> 32)").end();
+                        break;
+                    case DOUBLE:
+                        b.startStatement().string("long longValue = Double.doubleToRawLongBits(", fname, ")").end();
+                        b.startStatement().string("number += 23 * longValue ^ (longValue >>> 32)").end();
+                        break;
+                    default:
+                        b.startIf().string(fname, " != null").end().startBlock();
+                        b.startStatement().string("number += 29 * ", fname + ".hashCode()").end();
+                        b.end();
+                        break;
+                }
+            }
+            b.startStatement().string("valueNumber = number").end();
+            b.end();
+            b.startReturn().string("valueNumber").end();
+            genClass.add(method);
+            checkOnlyInGenNode(method);
+        }
+    }
+
+    private void createValueEqualsMethod() {
+        CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), getType(boolean.class), "valueEqualsGen");
+        addParameter(method, Node.asType(), "other");
+        CodeTreeBuilder b = method.createBuilder();
+        if (!dataFields.isEmpty()) {
+            String other = "o";
+            b.declaration(genClassName, other, "(" + genClassName + ") other");
+
+            for (VariableElement f : dataFields) {
+                String fname = f.getSimpleName().toString();
+                switch (f.asType().getKind()) {
+                    case BOOLEAN:
+                    case BYTE:
+                    case SHORT:
+                    case CHAR:
+                    case INT:
+                    case FLOAT:
+                    case LONG:
+                    case DOUBLE:
+                        b.startIf().string(other, ".", fname, " != ", fname).end().startBlock();
+                        b.startStatement().string("return false").end();
+                        b.end();
+                        break;
+                    case ARRAY:
+                        if (((ArrayType) f.asType()).getComponentType().getKind().isPrimitive()) {
+                            b.startIf().string("!").type(getType(Arrays.class)).string(".equals(", other, ".", fname, ", ", fname, ")").end().startBlock();
+                        } else {
+                            b.startIf().string("!").type(getType(Arrays.class)).string(".deepEquals(", other, ".", fname, ", ", fname, ")").end().startBlock();
+                        }
+                        b.startStatement().string("return false").end();
+                        b.end();
+                        break;
+                    default:
+                        b.startIf().string("!").type(getType(Objects.class)).string(".equals(", other, ".", fname, ", ", fname, ")").end().startBlock();
+                        b.startStatement().string("return false").end();
+                        b.end();
+                        break;
+                }
+            }
+        }
+        b.startReturn().string("true").end();
+        genClass.add(method);
+        checkOnlyInGenNode(method);
+    }
+
     private boolean hidesField(String name) {
         for (VariableElement field : concat(inputFields, inputListFields, successorFields, successorListFields, dataFields)) {
             if (field.getSimpleName().contentEquals(name)) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractFixedGuardNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractFixedGuardNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -33,9 +33,9 @@
 public abstract class AbstractFixedGuardNode extends DeoptimizingFixedWithNextNode implements Simplifiable, GuardingNode {
 
     @Input(InputType.Condition) protected LogicNode condition;
-    private final DeoptimizationReason reason;
-    private final DeoptimizationAction action;
-    private boolean negated;
+    protected final DeoptimizationReason reason;
+    protected final DeoptimizationAction action;
+    protected boolean negated;
 
     public LogicNode condition() {
         return condition;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractLocalNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractLocalNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -29,7 +29,7 @@
 @NodeInfo
 public abstract class AbstractLocalNode extends FloatingNode {
 
-    private final int index;
+    protected final int index;
 
     public AbstractLocalNode(int index, Stamp stamp) {
         super(stamp);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -44,8 +44,8 @@
     }
 
     @Input protected NodeInputList<ValueNode> arguments;
-    private ResolvedJavaMethod targetMethod;
-    private InvokeKind invokeKind;
+    protected ResolvedJavaMethod targetMethod;
+    protected InvokeKind invokeKind;
 
     public CallTargetNode(ValueNode[] arguments, ResolvedJavaMethod targetMethod, InvokeKind invokeKind) {
         super(StampFactory.forVoid());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConditionAnchorNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConditionAnchorNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -33,7 +33,7 @@
 public class ConditionAnchorNode extends FixedWithNextNode implements Canonicalizable.Unary<Node>, Lowerable, GuardingNode {
 
     @Input(InputType.Condition) LogicNode condition;
-    private boolean negated;
+    protected boolean negated;
 
     public static ConditionAnchorNode create(LogicNode condition) {
         return USE_GENERATED_NODES ? new ConditionAnchorNodeGen(condition) : new ConditionAnchorNode(condition);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -43,7 +43,7 @@
 
     private static final DebugMetric ConstantNodes = Debug.metric("ConstantNodes");
 
-    private final Constant value;
+    protected final Constant value;
 
     private static ConstantNode createPrimitive(Constant value) {
         assert value.getKind() != Kind.Object;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -29,10 +29,10 @@
 @NodeInfo(shortName = "Deopt", nameTemplate = "Deopt {p#reason/s}")
 public class DeoptimizeNode extends AbstractDeoptimizeNode implements Lowerable, LIRLowerable {
 
-    private final DeoptimizationAction action;
-    private final DeoptimizationReason reason;
-    private final int debugId;
-    private final Constant speculation;
+    protected final DeoptimizationAction action;
+    protected final DeoptimizationReason reason;
+    protected final int debugId;
+    protected final Constant speculation;
 
     public static DeoptimizeNode create(DeoptimizationAction action, DeoptimizationReason reason) {
         return USE_GENERATED_NODES ? new DeoptimizeNodeGen(action, reason) : new DeoptimizeNode(action, reason);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java	Wed Oct 01 07:39:47 2014 +0200
@@ -51,9 +51,9 @@
     /**
      * @see BytecodeFrame#rethrowException
      */
-    private boolean rethrowException;
+    protected boolean rethrowException;
 
-    private boolean duringCall;
+    protected boolean duringCall;
 
     @OptionalInput(value = InputType.State) FrameState outerFrameState;
 
@@ -71,7 +71,7 @@
      */
     public final int bci;
 
-    private final ResolvedJavaMethod method;
+    protected final ResolvedJavaMethod method;
 
     /**
      * Creates a {@code FrameState} with the given locals, stack expressions and locked monitors.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -45,10 +45,10 @@
 public class GuardNode extends FloatingAnchoredNode implements Canonicalizable, IterableNodeType, GuardingNode {
 
     @Input(InputType.Condition) protected LogicNode condition;
-    private final DeoptimizationReason reason;
-    private Constant speculation;
-    private DeoptimizationAction action;
-    private boolean negated;
+    protected final DeoptimizationReason reason;
+    protected Constant speculation;
+    protected DeoptimizationAction action;
+    protected boolean negated;
 
     public static GuardNode create(LogicNode condition, AnchoringNode anchor, DeoptimizationReason reason, DeoptimizationAction action, boolean negated, Constant speculation) {
         return USE_GENERATED_NODES ? new GuardNodeGen(condition, anchor, reason, action, negated, speculation) : new GuardNode(condition, anchor, reason, action, negated, speculation);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,7 +40,7 @@
 public class GuardedValueNode extends FloatingGuardedNode implements LIRLowerable, Virtualizable, IterableNodeType, Canonicalizable, ValueProxy {
 
     @Input ValueNode object;
-    private final Stamp piStamp;
+    protected final Stamp piStamp;
 
     public static GuardedValueNode create(ValueNode object, GuardingNode guard, Stamp stamp) {
         return USE_GENERATED_NODES ? new GuardedValueNodeGen(object, guard, stamp) : new GuardedValueNode(object, guard, stamp);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,10 +40,10 @@
 
     @Input ValueNode object;
     @Input(InputType.Condition) LogicNode condition;
-    private final DeoptimizationReason reason;
-    private final DeoptimizationAction action;
-    private final Stamp piStamp;
-    private boolean negated;
+    protected final DeoptimizationReason reason;
+    protected final DeoptimizationAction action;
+    protected final Stamp piStamp;
+    protected boolean negated;
 
     public ValueNode object() {
         return object;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -52,7 +52,7 @@
     @Successor BeginNode trueSuccessor;
     @Successor BeginNode falseSuccessor;
     @Input(InputType.Condition) LogicNode condition;
-    private double trueSuccessorProbability;
+    protected double trueSuccessorProbability;
 
     public LogicNode condition() {
         return condition;
@@ -228,7 +228,7 @@
                 FixedWithNextNode falseNext = (FixedWithNextNode) falseSucc.next();
                 NodeClass nodeClass = trueNext.getNodeClass();
                 if (trueNext.getClass() == falseNext.getClass()) {
-                    if (nodeClass.getEdges(Inputs).areEqualIn(trueNext, falseNext) && nodeClass.valueEqual(trueNext, falseNext)) {
+                    if (nodeClass.getEdges(Inputs).areEqualIn(trueNext, falseNext) && trueNext.valueEquals(falseNext)) {
                         falseNext.replaceAtUsages(trueNext);
                         graph().removeFixed(falseNext);
                         GraphUtil.unlinkFixedNode(trueNext);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InfopointNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InfopointNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -28,7 +28,7 @@
 
 @NodeInfo
 public abstract class InfopointNode extends FixedWithNextNode {
-    private final InfopointReason reason;
+    protected final InfopointReason reason;
 
     public InfopointNode(InfopointReason reason) {
         super(StampFactory.forVoid());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -42,9 +42,9 @@
     @Input(InputType.Extension) CallTargetNode callTarget;
     @OptionalInput(InputType.State) FrameState stateDuring;
     @OptionalInput(InputType.Guard) GuardingNode guard;
-    private final int bci;
-    private boolean polymorphic;
-    private boolean useForInlining;
+    protected final int bci;
+    protected boolean polymorphic;
+    protected boolean useForInlining;
 
     /**
      * Constructs a new Invoke instruction.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -43,10 +43,10 @@
     @OptionalInput(InputType.State) FrameState stateDuring;
     @OptionalInput(InputType.State) FrameState stateAfter;
     @OptionalInput(InputType.Guard) GuardingNode guard;
-    private final int bci;
-    private boolean polymorphic;
-    private boolean useForInlining;
-    private double exceptionProbability;
+    protected final int bci;
+    protected boolean polymorphic;
+    protected boolean useForInlining;
+    protected double exceptionProbability;
 
     public static InvokeWithExceptionNode create(CallTargetNode callTarget, BeginNode exceptionEdge, int bci) {
         return USE_GENERATED_NODES ? new InvokeWithExceptionNodeGen(callTarget, exceptionEdge, bci) : new InvokeWithExceptionNode(callTarget, exceptionEdge, bci);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/KillingBeginNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/KillingBeginNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -29,7 +29,7 @@
 @NodeInfo(allowedUsageTypes = {InputType.Memory})
 public class KillingBeginNode extends BeginNode implements MemoryCheckpoint.Single {
 
-    private LocationIdentity locationIdentity;
+    protected LocationIdentity locationIdentity;
 
     public static KillingBeginNode create(LocationIdentity locationIdentity) {
         return USE_GENERATED_NODES ? new KillingBeginNodeGen(locationIdentity) : new KillingBeginNode(locationIdentity);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConstantNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConstantNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -32,7 +32,7 @@
 @NodeInfo(nameTemplate = "{p#value}")
 public class LogicConstantNode extends LogicNode implements LIRLowerable {
 
-    public final boolean value;
+    protected final boolean value;
 
     public static LogicConstantNode create(boolean value) {
         return USE_GENERATED_NODES ? new LogicConstantNodeGen(value) : new LogicConstantNode(value);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -39,9 +39,9 @@
 @NodeInfo
 public class LoopBeginNode extends MergeNode implements IterableNodeType, LIRLowerable {
 
-    private double loopFrequency;
-    private int nextEndIndex;
-    private int unswitches;
+    protected double loopFrequency;
+    protected int nextEndIndex;
+    protected int unswitches;
     @OptionalInput(InputType.Guard) GuardingNode overflowGuard;
 
     public static LoopBeginNode create() {
@@ -283,7 +283,7 @@
                 if (phi != null) {
                     nextPhi: for (int otherPhiIndex = phiIndex + 1; otherPhiIndex < phiCount; otherPhiIndex++) {
                         PhiNode otherPhi = phis[otherPhiIndex];
-                        if (otherPhi == null || phi.getNodeClass() != otherPhi.getNodeClass() || !phi.getNodeClass().valueEqual(phi, otherPhi)) {
+                        if (otherPhi == null || phi.getNodeClass() != otherPhi.getNodeClass() || !phi.valueEquals(otherPhi)) {
                             continue nextPhi;
                         }
                         if (selfIncrement[phiIndex] == null) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -32,8 +32,8 @@
 public class LoopEndNode extends AbstractEndNode {
 
     @Input(InputType.Association) LoopBeginNode loopBegin;
-    private boolean canSafepoint;
-    private int endIndex;
+    protected boolean canSafepoint;
+    protected int endIndex;
 
     public static LoopEndNode create(LoopBeginNode begin) {
         return USE_GENERATED_NODES ? new LoopEndNodeGen(begin) : new LoopEndNode(begin);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoweredCallTargetNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoweredCallTargetNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -32,9 +32,9 @@
 @NodeInfo
 public abstract class LoweredCallTargetNode extends CallTargetNode {
 
-    private final Stamp returnStamp;
-    private final JavaType[] signature;
-    private final CallingConvention.Type callType;
+    protected final Stamp returnStamp;
+    protected final JavaType[] signature;
+    protected final CallingConvention.Type callType;
 
     public LoweredCallTargetNode(List<ValueNode> arguments, Stamp returnStamp, JavaType[] signature, ResolvedJavaMethod target, CallingConvention.Type callType, InvokeKind invokeKind) {
         super(arguments, target, invokeKind);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -37,7 +37,7 @@
 @NodeInfo(allowedUsageTypes = {InputType.Extension})
 public class MemoryMapNode extends FloatingNode implements MemoryMap, LIRLowerable {
 
-    private final List<LocationIdentity> locationIdentities;
+    protected final List<LocationIdentity> locationIdentities;
     @Input(InputType.Memory) NodeInputList<ValueNode> nodes;
 
     private boolean checkOrder(Map<LocationIdentity, MemoryNode> mmap) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryPhiNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryPhiNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -35,7 +35,7 @@
 public class MemoryPhiNode extends PhiNode implements MemoryNode {
 
     @Input(InputType.Memory) NodeInputList<ValueNode> values;
-    private final LocationIdentity locationIdentity;
+    protected final LocationIdentity locationIdentity;
 
     public static MemoryPhiNode create(MergeNode merge, LocationIdentity locationIdentity) {
         return USE_GENERATED_NODES ? new MemoryPhiNodeGen(merge, locationIdentity) : new MemoryPhiNode(merge, locationIdentity);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -45,7 +45,7 @@
 public class PiNode extends FloatingGuardedNode implements LIRLowerable, Virtualizable, IterableNodeType, Canonicalizable, ValueProxy {
 
     @Input ValueNode object;
-    private final Stamp piStamp;
+    protected final Stamp piStamp;
 
     public ValueNode object() {
         return object;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ShortCircuitOrNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ShortCircuitOrNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -31,9 +31,9 @@
 
     @Input(InputType.Condition) LogicNode x;
     @Input(InputType.Condition) LogicNode y;
-    private boolean xNegated;
-    private boolean yNegated;
-    private double shortCircuitProbability;
+    protected boolean xNegated;
+    protected boolean yNegated;
+    protected double shortCircuitProbability;
 
     public static ShortCircuitOrNode create(LogicNode x, boolean xNegated, LogicNode y, boolean yNegated, double shortCircuitProbability) {
         return USE_GENERATED_NODES ? new ShortCircuitOrNodeGen(x, xNegated, y, yNegated, shortCircuitProbability) : new ShortCircuitOrNode(x, xNegated, y, yNegated, shortCircuitProbability);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SimpleInfopointNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SimpleInfopointNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -30,7 +30,7 @@
 
 @NodeInfo
 public class SimpleInfopointNode extends InfopointNode implements LIRLowerable, IterableNodeType, Simplifiable {
-    private BytecodePosition position;
+    protected BytecodePosition position;
 
     public static SimpleInfopointNode create(InfopointReason reason, BytecodePosition position) {
         return USE_GENERATED_NODES ? new SimpleInfopointNodeGen(reason, position) : new SimpleInfopointNode(reason, position);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeProfileProxyNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeProfileProxyNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -39,9 +39,9 @@
 @NodeInfo
 public class TypeProfileProxyNode extends UnaryNode implements IterableNodeType, ValueProxy {
 
-    private final JavaTypeProfile profile;
-    private transient ResolvedJavaType lastCheckedType;
-    private transient JavaTypeProfile lastCheckedProfile;
+    protected final JavaTypeProfile profile;
+    protected transient ResolvedJavaType lastCheckedType;
+    protected transient JavaTypeProfile lastCheckedProfile;
 
     public static ValueNode proxify(ValueNode object, JavaTypeProfile profile) {
         if (StampTool.isExactType(object)) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -38,7 +38,7 @@
      * The kind of this value. This is {@link Kind#Void} for instructions that produce no value.
      * This kind is guaranteed to be a {@linkplain Kind#getStackKind() stack kind}.
      */
-    private Stamp stamp;
+    protected Stamp stamp;
 
     public ValueNode(Stamp stamp) {
         this.stamp = stamp;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AddNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AddNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -95,9 +95,9 @@
         assert op1 != null : getX() + ", this=" + this;
         Value op2 = builder.operand(getY());
         if (!getY().isConstant() && !BinaryArithmeticNode.livesLonger(this, getY(), builder)) {
-            Value op = op1;
+            Value tmp = op1;
             op1 = op2;
-            op2 = op;
+            op2 = tmp;
         }
         builder.setResult(this, gen.emitAdd(op1, op2));
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -35,7 +35,7 @@
 @NodeInfo
 public abstract class BinaryArithmeticNode extends BinaryNode implements ArithmeticLIRLowerable {
 
-    private final BinaryOp op;
+    protected final BinaryOp op;
 
     public BinaryArithmeticNode(BinaryOp op, ValueNode x, ValueNode y) {
         super(op.foldStamp(x.stamp(), y.stamp()), x, y);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -39,7 +39,7 @@
 @NodeInfo
 public class FloatConvertNode extends ConvertNode implements Lowerable, ArithmeticLIRLowerable {
 
-    private final FloatConvert op;
+    protected final FloatConvert op;
 
     public static FloatConvertNode create(FloatConvert op, ValueNode input) {
         return USE_GENERATED_NODES ? new FloatConvertNodeGen(op, input) : new FloatConvertNode(op, input);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -33,7 +33,7 @@
 @NodeInfo(shortName = "<")
 public class FloatLessThanNode extends CompareNode {
 
-    private final boolean unorderedIsTrue;
+    protected final boolean unorderedIsTrue;
 
     /**
      * Constructs a new floating point comparison node.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -33,7 +33,7 @@
 @NodeInfo
 public abstract class IntegerConvertNode extends ConvertNode implements ArithmeticLIRLowerable {
 
-    private final int resultBits;
+    protected final int resultBits;
 
     protected IntegerConvertNode(Stamp stamp, ValueNode input, int resultBits) {
         super(stamp, input);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -99,7 +99,7 @@
 
         if (next() instanceof IntegerDivNode) {
             NodeClass nodeClass = getNodeClass();
-            if (next().getClass() == this.getClass() && nodeClass.getEdges(Inputs).areEqualIn(this, next()) && nodeClass.valueEqual(this, next())) {
+            if (next().getClass() == this.getClass() && nodeClass.getEdges(Inputs).areEqualIn(this, next()) && valueEquals(next())) {
                 return next();
             }
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/MulNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/MulNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -103,9 +103,9 @@
         Value op1 = builder.operand(getX());
         Value op2 = builder.operand(getY());
         if (!getY().isConstant() && !BinaryArithmeticNode.livesLonger(this, getY(), builder)) {
-            Value op = op1;
+            Value tmp = op1;
             op1 = op2;
-            op2 = op;
+            op2 = tmp;
         }
         builder.setResult(this, gen.emitMul(op1, op2));
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -37,7 +37,7 @@
 @NodeInfo
 public class NormalizeCompareNode extends BinaryNode implements Lowerable {
 
-    public final boolean isUnorderedLess;
+    protected final boolean isUnorderedLess;
 
     /**
      * Creates a new compare operation.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -32,7 +32,7 @@
 @NodeInfo
 public abstract class UnaryArithmeticNode extends UnaryNode implements ArithmeticLIRLowerable {
 
-    private final UnaryOp op;
+    protected final UnaryOp op;
 
     protected UnaryArithmeticNode(UnaryOp op, ValueNode value) {
         super(op.foldStamp(value.stamp()), value);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/debug/DynamicCounterNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/debug/DynamicCounterNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,9 +40,9 @@
 
     @Input ValueNode increment;
 
-    private final String name;
-    private final String group;
-    private final boolean withContext;
+    protected final String name;
+    protected final String group;
+    protected final boolean withContext;
 
     public static DynamicCounterNode create(String name, String group, ValueNode increment, boolean withContext) {
         return USE_GENERATED_NODES ? new DynamicCounterNodeGen(name, group, increment, withContext) : new DynamicCounterNode(name, group, increment, withContext);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractWriteNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractWriteNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -35,7 +35,7 @@
     @OptionalInput(InputType.State) FrameState stateAfter;
     @OptionalInput(InputType.Memory) Node lastLocationAccess;
 
-    private final boolean initialization;
+    protected final boolean initialization;
 
     public FrameState stateAfter() {
         return stateAfter;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BoxNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BoxNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -42,7 +42,7 @@
 @NodeInfo
 public class BoxNode extends UnaryNode implements VirtualizableAllocation, Lowerable {
 
-    private final Kind boxingKind;
+    protected final Kind boxingKind;
 
     public static BoxNode create(ValueNode value, ResolvedJavaType resultType, Kind boxingKind) {
         return USE_GENERATED_NODES ? new BoxNodeGen(value, resultType, boxingKind) : new BoxNode(value, resultType, boxingKind);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BytecodeExceptionNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BytecodeExceptionNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -36,7 +36,7 @@
 @NodeInfo
 public class BytecodeExceptionNode extends AbstractMemoryCheckpoint implements Lowerable, MemoryCheckpoint.Single {
 
-    private final Class<? extends Throwable> exceptionClass;
+    protected final Class<? extends Throwable> exceptionClass;
     @Input NodeInputList<ValueNode> arguments;
 
     public static BytecodeExceptionNode create(MetaAccessProvider metaAccess, Class<? extends Throwable> exceptionClass, ValueNode... arguments) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -36,9 +36,9 @@
 @NodeInfo(nameTemplate = "Loc {p#locationIdentity/s}")
 public class ConstantLocationNode extends LocationNode {
 
-    private final Kind valueKind;
-    private final LocationIdentity locationIdentity;
-    private final long displacement;
+    protected final Kind valueKind;
+    protected final LocationIdentity locationIdentity;
+    protected final long displacement;
 
     public static ConstantLocationNode create(LocationIdentity identity, Kind kind, long displacement, Graph graph) {
         return graph.unique(ConstantLocationNode.create(identity, kind, displacement));
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedAccessNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedAccessNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -36,8 +36,8 @@
     @OptionalInput(InputType.Guard) protected GuardingNode guard;
     @Input protected ValueNode object;
     @Input(InputType.Association) protected ValueNode location;
-    private boolean nullCheck;
-    private BarrierType barrierType;
+    protected boolean nullCheck;
+    protected BarrierType barrierType;
 
     public ValueNode object() {
         return object;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -32,7 +32,7 @@
 
     @Input ValueNode object;
     @Input(InputType.Association) LocationNode location;
-    private BarrierType barrierType;
+    protected BarrierType barrierType;
 
     public ValueNode object() {
         return object;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,9 +40,9 @@
 
     @Input protected NodeInputList<ValueNode> arguments;
     @OptionalInput(InputType.State) protected FrameState stateDuring;
-    private final ForeignCallsProvider foreignCalls;
+    protected final ForeignCallsProvider foreignCalls;
 
-    private final ForeignCallDescriptor descriptor;
+    protected final ForeignCallDescriptor descriptor;
 
     public static ForeignCallNode create(@InjectedNodeParameter ForeignCallsProvider foreignCalls, ForeignCallDescriptor descriptor, ValueNode... arguments) {
         return USE_GENERATED_NODES ? new ForeignCallNodeGen(foreignCalls, descriptor, arguments) : new ForeignCallNode(foreignCalls, descriptor, arguments);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -41,11 +41,11 @@
 @NodeInfo(nameTemplate = "IdxLoc {p#locationIdentity/s}")
 public class IndexedLocationNode extends LocationNode implements Canonicalizable {
 
-    private final Kind valueKind;
-    private final LocationIdentity locationIdentity;
-    private final long displacement;
+    protected final Kind valueKind;
+    protected final LocationIdentity locationIdentity;
+    protected final long displacement;
     @Input ValueNode index;
-    private final int indexScaling;
+    protected final int indexScaling;
 
     /**
      * Gets the index or offset of this location.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IntegerSwitchNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IntegerSwitchNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -39,7 +39,7 @@
 @NodeInfo
 public class IntegerSwitchNode extends SwitchNode implements LIRLowerable, Simplifiable {
 
-    private final int[] keys;
+    protected final int[] keys;
 
     /**
      * Constructs a integer switch instruction. The keyProbabilities and keySuccessors array contain
@@ -148,11 +148,11 @@
             tool.addToWorkList(blockSuccessor(survivingEdge));
             graph().removeSplit(this, blockSuccessor(survivingEdge));
         } else if (value().stamp() instanceof IntegerStamp) {
-            IntegerStamp stamp = (IntegerStamp) value().stamp();
-            if (!stamp.isUnrestricted()) {
+            IntegerStamp integerStamp = (IntegerStamp) value().stamp();
+            if (!integerStamp.isUnrestricted()) {
                 int validKeys = 0;
                 for (int i = 0; i < keyCount(); i++) {
-                    if (stamp.contains(keys[i])) {
+                    if (integerStamp.contains(keys[i])) {
                         validKeys++;
                     }
                 }
@@ -167,7 +167,7 @@
                     double totalProbability = 0;
                     int current = 0;
                     for (int i = 0; i < keyCount() + 1; i++) {
-                        if (i == keyCount() || stamp.contains(keys[i])) {
+                        if (i == keyCount() || integerStamp.contains(keys[i])) {
                             int index = newSuccessors.indexOf(keySuccessor(i));
                             if (index == -1) {
                                 index = newSuccessors.size();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/JavaReadNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/JavaReadNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -34,7 +34,7 @@
 @NodeInfo
 public class JavaReadNode extends FixedAccessNode implements Lowerable, GuardingNode {
 
-    private final boolean compressible;
+    protected final boolean compressible;
 
     public static JavaReadNode create(ValueNode object, LocationNode location, BarrierType barrierType, boolean compressible) {
         return USE_GENERATED_NODES ? new JavaReadNodeGen(object, location, barrierType, compressible) : new JavaReadNode(object, location, barrierType, compressible);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/JavaWriteNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/JavaWriteNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -33,7 +33,7 @@
 @NodeInfo
 public class JavaWriteNode extends AbstractWriteNode implements Lowerable, StateSplit, MemoryAccess, MemoryCheckpoint.Single {
 
-    private final boolean compressible;
+    protected final boolean compressible;
 
     public static JavaWriteNode create(ValueNode object, ValueNode value, ValueNode location, BarrierType barrierType, boolean compressible, boolean initialization) {
         return USE_GENERATED_NODES ? new JavaWriteNodeGen(object, value, location, barrierType, compressible, initialization) : new JavaWriteNode(object, value, location, barrierType, compressible,
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -75,15 +75,15 @@
     public ValueNode canonical(CanonicalizerTool tool) {
         MetaAccessProvider metaAccess = tool.getMetaAccess();
         if (metaAccess != null && getValue().stamp() instanceof ObjectStamp) {
-            ObjectStamp stamp = (ObjectStamp) getValue().stamp();
+            ObjectStamp objectStamp = (ObjectStamp) getValue().stamp();
 
             ResolvedJavaType exactType;
-            if (stamp.isExactType()) {
-                exactType = stamp.type();
-            } else if (stamp.type() != null && tool.assumptions().useOptimisticAssumptions()) {
-                exactType = stamp.type().findUniqueConcreteSubtype();
+            if (objectStamp.isExactType()) {
+                exactType = objectStamp.type();
+            } else if (objectStamp.type() != null && tool.assumptions().useOptimisticAssumptions()) {
+                exactType = objectStamp.type().findUniqueConcreteSubtype();
                 if (exactType != null) {
-                    tool.assumptions().recordConcreteSubtype(stamp.type(), exactType);
+                    tool.assumptions().recordConcreteSubtype(objectStamp.type(), exactType);
                 }
             } else {
                 exactType = null;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadMethodNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadMethodNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -38,8 +38,8 @@
 public class LoadMethodNode extends FixedWithNextNode implements Lowerable, Canonicalizable {
 
     @Input ValueNode hub;
-    private final ResolvedJavaMethod method;
-    private final ResolvedJavaType receiverType;
+    protected final ResolvedJavaMethod method;
+    protected final ResolvedJavaType receiverType;
 
     public ValueNode getHub() {
         return hub;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -42,7 +42,7 @@
 @NodeInfo(allowedUsageTypes = {InputType.Memory})
 public class MembarNode extends FixedWithNextNode implements LIRLowerable, MemoryCheckpoint.Single {
 
-    private final int barriers;
+    protected final int barriers;
 
     /**
      * @param barriers a mask of the barrier constants defined in {@link MemoryBarriers}
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -41,8 +41,8 @@
     @Input protected ValueNode value;
 
     // do not change the contents of these arrays:
-    private final double[] keyProbabilities;
-    private final int[] keySuccessors;
+    protected final double[] keyProbabilities;
+    protected final int[] keySuccessors;
 
     /**
      * Constructs a new Switch.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnboxNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnboxNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -33,7 +33,7 @@
 @NodeInfo
 public class UnboxNode extends UnaryNode implements Virtualizable, Lowerable {
 
-    private final Kind boxingKind;
+    protected final Kind boxingKind;
 
     public static UnboxNode create(ValueNode value, Kind boxingKind) {
         return USE_GENERATED_NODES ? new UnboxNodeGen(value, boxingKind) : new UnboxNode(value, boxingKind);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeAccessNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeAccessNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -35,8 +35,8 @@
 
     @Input ValueNode object;
     @Input ValueNode offset;
-    private final Kind accessKind;
-    private final LocationIdentity locationIdentity;
+    protected final Kind accessKind;
+    protected final LocationIdentity locationIdentity;
 
     public UnsafeAccessNode(Stamp stamp, ValueNode object, ValueNode offset, Kind accessKind, LocationIdentity locationIdentity) {
         super(stamp);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AbstractNewArrayNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AbstractNewArrayNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -74,8 +74,8 @@
 
     @Override
     public void simplify(SimplifierTool tool) {
-        Stamp stamp = length.stamp();
-        if (stamp instanceof IntegerStamp && ((IntegerStamp) stamp).isPositive()) {
+        Stamp lengthStamp = length.stamp();
+        if (lengthStamp instanceof IntegerStamp && ((IntegerStamp) lengthStamp).isPositive()) {
             // otherwise, removing the allocation might swallow a NegativeArraySizeException
             super.simplify(tool);
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AbstractNewObjectNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AbstractNewObjectNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -38,7 +38,7 @@
 @NodeInfo
 public class AbstractNewObjectNode extends DeoptimizingFixedWithNextNode implements Simplifiable, Lowerable {
 
-    private final boolean fillContents;
+    protected final boolean fillContents;
 
     /**
      * Constructs a new AbstractNewObjectNode.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessIndexedNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessIndexedNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -36,7 +36,7 @@
 public abstract class AccessIndexedNode extends AccessArrayNode implements Lowerable {
 
     @Input protected ValueNode index;
-    private final Kind elementKind;
+    protected final Kind elementKind;
 
     public ValueNode index() {
         return index;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AtomicReadAndAddNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AtomicReadAndAddNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -42,7 +42,7 @@
     @Input ValueNode offset;
     @Input ValueNode delta;
 
-    private final LocationIdentity locationIdentity;
+    protected final LocationIdentity locationIdentity;
 
     public static AtomicReadAndAddNode create(ValueNode object, ValueNode offset, ValueNode delta, LocationIdentity locationIdentity) {
         return USE_GENERATED_NODES ? new AtomicReadAndAddNodeGen(object, offset, delta, locationIdentity) : new AtomicReadAndAddNode(object, offset, delta, locationIdentity);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AtomicReadAndWriteNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AtomicReadAndWriteNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -43,8 +43,8 @@
     @Input ValueNode offset;
     @Input ValueNode newValue;
 
-    private final Kind valueKind;
-    private final LocationIdentity locationIdentity;
+    protected final Kind valueKind;
+    protected final LocationIdentity locationIdentity;
 
     public static AtomicReadAndWriteNode create(ValueNode object, ValueNode offset, ValueNode newValue, Kind valueKind, LocationIdentity locationIdentity) {
         return USE_GENERATED_NODES ? new AtomicReadAndWriteNodeGen(object, offset, newValue, valueKind, locationIdentity) : new AtomicReadAndWriteNode(object, offset, newValue, valueKind,
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -43,7 +43,7 @@
      * Determines the exception thrown by this node if the check fails: {@link ClassCastException}
      * if false; {@link ArrayStoreException} if true.
      */
-    private final boolean forStoreCheck;
+    protected final boolean forStoreCheck;
 
     /**
      * @param hub the type being cast to
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -44,14 +44,14 @@
 public class CheckCastNode extends FixedWithNextNode implements Canonicalizable, Simplifiable, Lowerable, Virtualizable, ValueProxy {
 
     @Input protected ValueNode object;
-    private final ResolvedJavaType type;
-    private final JavaTypeProfile profile;
+    protected final ResolvedJavaType type;
+    protected final JavaTypeProfile profile;
 
     /**
      * Determines the exception thrown by this node if the check fails: {@link ClassCastException}
      * if false; {@link ArrayStoreException} if true.
      */
-    private final boolean forStoreCheck;
+    protected final boolean forStoreCheck;
 
     /**
      * Creates a new CheckCast instruction.
@@ -104,16 +104,16 @@
      */
     @Override
     public void lower(LoweringTool tool) {
-        Stamp stamp = StampFactory.declared(type, false, true);
+        Stamp newStamp = StampFactory.declared(type, false, true);
         if (stamp() instanceof ObjectStamp && object().stamp() instanceof ObjectStamp) {
-            stamp = ((ObjectStamp) object().stamp()).castTo((ObjectStamp) stamp);
+            newStamp = ((ObjectStamp) object().stamp()).castTo((ObjectStamp) newStamp);
         }
         ValueNode condition;
         ValueNode theValue = object;
-        if (stamp instanceof IllegalStamp) {
+        if (newStamp instanceof IllegalStamp) {
             // This is a check cast that will always fail
             condition = LogicConstantNode.contradiction(graph());
-            stamp = StampFactory.declared(type, false, true);
+            newStamp = StampFactory.declared(type, false, true);
         } else if (StampTool.isObjectNonNull(object)) {
             condition = graph().addWithoutUnique(InstanceOfNode.create(type, object, profile));
         } else {
@@ -129,7 +129,7 @@
                  * optimized away.
                  */
                 theValue = nullGuarded;
-                stamp = stamp.join(StampFactory.objectNonNull());
+                newStamp = newStamp.join(StampFactory.objectNonNull());
                 nullCheck.lower(tool);
             } else {
                 // TODO (ds) replace with probability of null-seen when available
@@ -138,7 +138,7 @@
                 condition = LogicNode.or(graph().unique(IsNullNode.create(object)), typeTest, shortCircuitProbability);
             }
         }
-        GuardingPiNode checkedObject = graph().add(GuardingPiNode.create(theValue, condition, false, forStoreCheck ? ArrayStoreException : ClassCastException, InvalidateReprofile, stamp));
+        GuardingPiNode checkedObject = graph().add(GuardingPiNode.create(theValue, condition, false, forStoreCheck ? ArrayStoreException : ClassCastException, InvalidateReprofile, newStamp));
         graph().replaceFixedWithFixed(this, checkedObject);
         checkedObject.lower(tool);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -43,8 +43,8 @@
     @Input ValueNode expected;
     @Input ValueNode newValue;
 
-    private final Kind valueKind;
-    private final LocationIdentity locationIdentity;
+    protected final Kind valueKind;
+    protected final LocationIdentity locationIdentity;
 
     public static CompareAndSwapNode create(ValueNode object, ValueNode offset, ValueNode expected, ValueNode newValue, Kind valueKind, LocationIdentity locationIdentity) {
         return USE_GENERATED_NODES ? new CompareAndSwapNodeGen(object, offset, expected, newValue, valueKind, locationIdentity) : new CompareAndSwapNode(object, offset, expected, newValue, valueKind,
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -36,8 +36,8 @@
 @NodeInfo
 public class InstanceOfNode extends UnaryOpLogicNode implements Lowerable, Virtualizable {
 
-    private final ResolvedJavaType type;
-    private JavaTypeProfile profile;
+    protected final ResolvedJavaType type;
+    protected JavaTypeProfile profile;
 
     /**
      * Constructs a new InstanceOfNode.
@@ -63,11 +63,10 @@
 
     @Override
     public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) {
-        Stamp stamp = forValue.stamp();
-        if (!(stamp instanceof ObjectStamp)) {
+        if (!(forValue.stamp() instanceof ObjectStamp)) {
             return this;
         }
-        ObjectStamp objectStamp = (ObjectStamp) stamp;
+        ObjectStamp objectStamp = (ObjectStamp) forValue.stamp();
         if (objectStamp.alwaysNull()) {
             return LogicConstantNode.contradiction();
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -32,7 +32,7 @@
 
 @NodeInfo
 public class MethodCallTargetNode extends CallTargetNode implements IterableNodeType, Canonicalizable {
-    private final JavaType returnType;
+    protected final JavaType returnType;
 
     /**
      * @param arguments
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorIdNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorIdNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -36,7 +36,7 @@
 @NodeInfo(allowedUsageTypes = {InputType.Association})
 public class MonitorIdNode extends ValueNode implements IterableNodeType, LIRLowerable {
 
-    private int lockDepth;
+    protected int lockDepth;
 
     public static MonitorIdNode create(int lockDepth) {
         return USE_GENERATED_NODES ? new MonitorIdNodeGen(lockDepth) : new MonitorIdNode(lockDepth);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -38,7 +38,7 @@
 @NodeInfo(nameTemplate = "New {p#instanceClass/s}")
 public class NewInstanceNode extends AbstractNewObjectNode implements VirtualizableAllocation {
 
-    private final ResolvedJavaType instanceClass;
+    protected final ResolvedJavaType instanceClass;
 
     /**
      * Constructs a NewInstanceNode.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewMultiArrayNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewMultiArrayNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -36,7 +36,7 @@
 public class NewMultiArrayNode extends DeoptimizingFixedWithNextNode implements Lowerable, ArrayLengthProvider {
 
     @Input protected NodeInputList<ValueNode> dimensions;
-    private final ResolvedJavaType type;
+    protected final ResolvedJavaType type;
 
     public ValueNode dimension(int index) {
         return dimensions.get(index);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -66,16 +66,16 @@
             return this;
         }
 
-        ObjectStamp stamp = (ObjectStamp) forValue.stamp();
+        ObjectStamp objectStamp = (ObjectStamp) forValue.stamp();
 
         boolean needsCheck = true;
-        if (stamp.isExactType()) {
-            needsCheck = stamp.type().hasFinalizer();
-        } else if (stamp.type() != null && !stamp.type().hasFinalizableSubclass()) {
+        if (objectStamp.isExactType()) {
+            needsCheck = objectStamp.type().hasFinalizer();
+        } else if (objectStamp.type() != null && !objectStamp.type().hasFinalizableSubclass()) {
             // if either the declared type of receiver or the holder
             // can be assumed to have no finalizers
             if (tool.assumptions().useOptimisticAssumptions()) {
-                tool.assumptions().recordNoFinalizableSubclassAssumption(stamp.type());
+                tool.assumptions().recordNoFinalizableSubclassAssumption(objectStamp.type());
                 needsCheck = false;
             }
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/SelfReplacingMethodCallTargetNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/SelfReplacingMethodCallTargetNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,8 +40,8 @@
 public class SelfReplacingMethodCallTargetNode extends MethodCallTargetNode implements Lowerable {
 
     // Replacement method data
-    private final ResolvedJavaMethod replacementTargetMethod;
-    private final JavaType replacementReturnType;
+    protected final ResolvedJavaMethod replacementTargetMethod;
+    protected final JavaType replacementReturnType;
     @Input NodeInputList<ValueNode> replacementArguments;
 
     public static SelfReplacingMethodCallTargetNode create(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] arguments, JavaType returnType,
@@ -72,9 +72,9 @@
 
     @Override
     public void lower(LoweringTool tool) {
-        InvokeKind invokeKind = replacementTargetMethod.isStatic() ? InvokeKind.Static : InvokeKind.Special;
+        InvokeKind replacementInvokeKind = replacementTargetMethod.isStatic() ? InvokeKind.Static : InvokeKind.Special;
         MethodCallTargetNode replacement = graph().add(
-                        MethodCallTargetNode.create(invokeKind, replacementTargetMethod, replacementArguments.toArray(new ValueNode[replacementArguments.size()]), replacementReturnType));
+                        MethodCallTargetNode.create(replacementInvokeKind, replacementTargetMethod, replacementArguments.toArray(new ValueNode[replacementArguments.size()]), replacementReturnType));
 
         // Replace myself...
         this.replaceAndDelete(replacement);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -41,7 +41,7 @@
 @NodeInfo
 public class TypeSwitchNode extends SwitchNode implements LIRLowerable, Simplifiable {
 
-    private final ResolvedJavaType[] keys;
+    protected final ResolvedJavaType[] keys;
 
     /**
      * Constructs a type switch instruction. The keyProbabilities array contain key.length + 1
@@ -152,11 +152,11 @@
             graph().removeSplit(this, blockSuccessor(survivingEdge));
         }
         if (value() instanceof LoadHubNode && ((LoadHubNode) value()).getValue().stamp() instanceof ObjectStamp) {
-            ObjectStamp stamp = (ObjectStamp) ((LoadHubNode) value()).getValue().stamp();
-            if (stamp.type() != null) {
+            ObjectStamp objectStamp = (ObjectStamp) ((LoadHubNode) value()).getValue().stamp();
+            if (objectStamp.type() != null) {
                 int validKeys = 0;
                 for (int i = 0; i < keyCount(); i++) {
-                    if (stamp.type().isAssignableFrom(keys[i])) {
+                    if (objectStamp.type().isAssignableFrom(keys[i])) {
                         validKeys++;
                     }
                 }
@@ -171,7 +171,7 @@
                     double totalProbability = 0;
                     int current = 0;
                     for (int i = 0; i < keyCount() + 1; i++) {
-                        if (i == keyCount() || stamp.type().isAssignableFrom(keys[i])) {
+                        if (i == keyCount() || objectStamp.type().isAssignableFrom(keys[i])) {
                             int index = newSuccessors.indexOf(keySuccessor(i));
                             if (index == -1) {
                                 index = newSuccessors.size();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/CommitAllocationNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/CommitAllocationNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -38,7 +38,7 @@
     @Input NodeInputList<VirtualObjectNode> virtualObjects = new NodeInputList<>(this);
     @Input NodeInputList<ValueNode> values = new NodeInputList<>(this);
     @Input(InputType.Association) NodeInputList<MonitorIdNode> locks = new NodeInputList<>(this);
-    private ArrayList<Integer> lockIndexes = new ArrayList<>(Arrays.asList(0));
+    protected ArrayList<Integer> lockIndexes = new ArrayList<>(Arrays.asList(0));
 
     public static CommitAllocationNode create() {
         return USE_GENERATED_NODES ? new CommitAllocationNodeGen() : new CommitAllocationNode();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualBoxingNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualBoxingNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -30,7 +30,7 @@
 @NodeInfo
 public class VirtualBoxingNode extends VirtualInstanceNode {
 
-    private final Kind boxingKind;
+    protected final Kind boxingKind;
 
     public static VirtualBoxingNode create(ResolvedJavaType type, Kind boxingKind) {
         return USE_GENERATED_NODES ? new VirtualBoxingNodeGen(type, boxingKind) : new VirtualBoxingNode(type, boxingKind);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -32,7 +32,7 @@
 @NodeInfo
 public abstract class VirtualObjectNode extends ValueNode implements LIRLowerable, IterableNodeType {
 
-    private boolean hasIdentity;
+    protected boolean hasIdentity;
 
     public VirtualObjectNode(ResolvedJavaType type, boolean hasIdentity) {
         super(StampFactory.exactNonNull(type));
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Wed Oct 01 07:39:47 2014 +0200
@@ -310,6 +310,9 @@
                 if (canonical != null && !canonical.isAlive()) {
                     assert !canonical.isDeleted();
                     canonical = graph.addOrUniqueWithInputs(canonical);
+                    if (canonical == node) {
+                        graph.addOrUniqueWithInputs(newCanonical);
+                    }
                 }
                 if (node instanceof FloatingNode) {
                     if (canonical == null) {
--- a/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64FloatConvertNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64FloatConvertNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -41,7 +41,7 @@
 @NodeInfo
 public class AMD64FloatConvertNode extends UnaryNode implements ArithmeticLIRLowerable {
 
-    private final FloatConvert op;
+    protected final FloatConvert op;
 
     public static AMD64FloatConvertNode create(Stamp stamp, FloatConvert op, ValueNode value) {
         return USE_GENERATED_NODES ? new AMD64FloatConvertNodeGen(stamp, op, value) : new AMD64FloatConvertNode(stamp, op, value);
--- a/graal/com.oracle.graal.replacements.hsail/src/com/oracle/graal/replacements/hsail/HSAILMathIntrinsicsNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements.hsail/src/com/oracle/graal/replacements/hsail/HSAILMathIntrinsicsNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -49,7 +49,7 @@
     /**
      * The math operation that this Node represents.
      */
-    private final HSAILArithmetic operation;
+    protected final HSAILArithmetic operation;
 
     /**
      * Gets the parameter passed to the math operation that this node represents.
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ArrayEqualsNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ArrayEqualsNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -39,7 +39,7 @@
 public class ArrayEqualsNode extends FixedWithNextNode implements LIRLowerable, Canonicalizable, Virtualizable, MemoryAccess {
 
     /** {@link Kind} of the arrays to compare. */
-    private final Kind kind;
+    protected final Kind kind;
 
     /** One array to be tested for equality. */
     @Input ValueNode array1;
@@ -58,8 +58,8 @@
         super(StampFactory.forKind(Kind.Boolean));
 
         assert array1.stamp().equals(array2.stamp());
-        ObjectStamp stamp = (ObjectStamp) array1.stamp();
-        ResolvedJavaType componentType = stamp.type().getComponentType();
+        ObjectStamp array1Stamp = (ObjectStamp) array1.stamp();
+        ResolvedJavaType componentType = array1Stamp.type().getComponentType();
         this.kind = componentType.getKind();
 
         this.array1 = array1;
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/AssertionNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/AssertionNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,8 +40,8 @@
 
     @Input ValueNode value;
 
-    private final boolean compileTimeAssertion;
-    private final String message;
+    protected final boolean compileTimeAssertion;
+    protected final String message;
 
     public static AssertionNode create(boolean compileTimeAssertion, ValueNode value, String message) {
         return USE_GENERATED_NODES ? new AssertionNodeGen(compileTimeAssertion, value, message) : new AssertionNode(compileTimeAssertion, value, message);
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectObjectStoreNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectObjectStoreNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,8 +40,8 @@
     @Input ValueNode object;
     @Input ValueNode value;
     @Input ValueNode offset;
-    private final int displacement;
-    private final LocationIdentity locationIdentity;
+    protected final int displacement;
+    protected final LocationIdentity locationIdentity;
 
     public static DirectObjectStoreNode create(ValueNode object, int displacement, ValueNode offset, ValueNode value, LocationIdentity locationIdentity) {
         return USE_GENERATED_NODES ? new DirectObjectStoreNodeGen(object, displacement, offset, value, locationIdentity) : new DirectObjectStoreNode(object, displacement, offset, value,
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -39,7 +39,7 @@
 public class DirectReadNode extends FixedWithNextNode implements LIRLowerable {
 
     @Input protected ValueNode address;
-    private final Kind readKind;
+    protected final Kind readKind;
 
     public static DirectReadNode create(ValueNode address, Kind readKind) {
         return USE_GENERATED_NODES ? new DirectReadNodeGen(address, readKind) : new DirectReadNode(address, readKind);
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectStoreNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectStoreNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -40,7 +40,7 @@
 
     @Input protected ValueNode address;
     @Input protected ValueNode value;
-    private final Kind kind;
+    protected final Kind kind;
 
     public static DirectStoreNode create(ValueNode address, ValueNode value, Kind kind) {
         return USE_GENERATED_NODES ? new DirectStoreNodeGen(address, value, kind) : new DirectStoreNode(address, value, kind);
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -61,10 +61,10 @@
 
     @Input protected NodeInputList<ValueNode> arguments;
 
-    private final int bci;
-    private final ResolvedJavaMethod targetMethod;
-    private final JavaType returnType;
-    private final InvokeKind invokeKind;
+    protected final int bci;
+    protected final ResolvedJavaMethod targetMethod;
+    protected final JavaType returnType;
+    protected final InvokeKind invokeKind;
 
     public static MacroNode create(Invoke invoke) {
         return USE_GENERATED_NODES ? new MacroNodeGen(invoke) : new MacroNode(invoke);
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MathIntrinsicNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MathIntrinsicNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -35,7 +35,7 @@
 @NodeInfo
 public class MathIntrinsicNode extends UnaryNode implements ArithmeticLIRLowerable {
 
-    private final Operation operation;
+    protected final Operation operation;
 
     public enum Operation {
         ABS,
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReadRegisterNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReadRegisterNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -38,20 +38,20 @@
     /**
      * The fixed register to access.
      */
-    private final Register register;
+    protected final Register register;
 
     /**
      * When true, subsequent uses of this node use the fixed register; when false, the value is
      * moved into a new virtual register so that the fixed register is not seen by uses.
      */
-    private final boolean directUse;
+    protected final boolean directUse;
 
     /**
      * When true, this node is also an implicit definition of the value for the register allocator,
      * i.e., the register is an implicit incoming value; when false, the register must be defined in
      * the same method or must be an register excluded from register allocation.
      */
-    private final boolean incoming;
+    protected final boolean incoming;
 
     public static ReadRegisterNode create(Register register, Kind kind, boolean directUse, boolean incoming) {
         return USE_GENERATED_NODES ? new ReadRegisterNodeGen(register, kind, directUse, incoming) : new ReadRegisterNode(register, kind, directUse, incoming);
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/WriteRegisterNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/WriteRegisterNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -38,7 +38,7 @@
     /**
      * The fixed register to access.
      */
-    private final Register register;
+    protected final Register register;
 
     /**
      * The new value assigned to the register.
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/asserts/NeverPartOfCompilationNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/asserts/NeverPartOfCompilationNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -30,7 +30,7 @@
 @NodeInfo
 public class NeverPartOfCompilationNode extends MacroStateSplitNode implements IterableNodeType {
 
-    private final String message;
+    protected final String message;
 
     public static NeverPartOfCompilationNode create(Invoke invoke) {
         return USE_GENERATED_NODES ? new NeverPartOfCompilationNodeGen(invoke) : new NeverPartOfCompilationNode(invoke);
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/NewFrameNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/frame/NewFrameNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -106,7 +106,7 @@
     @NodeInfo
     public static class VirtualOnlyInstanceNode extends VirtualInstanceNode {
 
-        private boolean allowMaterialization;
+        protected boolean allowMaterialization;
 
         public static VirtualOnlyInstanceNode create(ResolvedJavaType type, ResolvedJavaField[] fields) {
             return USE_GENERATED_NODES ? new NewFrameNode_VirtualOnlyInstanceNodeGen(type, fields) : new VirtualOnlyInstanceNode(type, fields);
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadFinalNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadFinalNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -46,7 +46,7 @@
     @Input ValueNode offset;
     @Input ValueNode condition;
     @Input ValueNode location;
-    private final Kind accessKind;
+    protected final Kind accessKind;
 
     public static CustomizedUnsafeLoadFinalNode create(ValueNode object, ValueNode offset, ValueNode condition, ValueNode location, Kind accessKind) {
         return USE_GENERATED_NODES ? new CustomizedUnsafeLoadFinalNodeGen(object, offset, condition, location, accessKind) : new CustomizedUnsafeLoadFinalNode(object, offset, condition, location,
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/UnsafeTypeCastMacroNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/UnsafeTypeCastMacroNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -67,10 +67,10 @@
                 replaceAtUsages(objectArgument);
                 GraphUtil.removeFixedWithUnusedInputs(this);
             } else {
-                Stamp stamp = StampFactory.declared(lookupJavaType, nonNullArgument.asConstant().asInt() != 0, true);
+                Stamp piStamp = StampFactory.declared(lookupJavaType, nonNullArgument.asConstant().asInt() != 0, true);
                 ConditionAnchorNode valueAnchorNode = graph().add(
                                 ConditionAnchorNode.create(CompareNode.createCompareNode(graph(), Condition.EQ, conditionArgument, ConstantNode.forBoolean(true, graph()))));
-                PiNode piCast = graph().unique(PiNode.create(objectArgument, stamp, valueAnchorNode));
+                PiNode piCast = graph().unique(PiNode.create(objectArgument, piStamp, valueAnchorNode));
                 replaceAtUsages(piCast);
                 graph().replaceFixedWithFixed(this, valueAnchorNode);
             }
--- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/SnippetLocationNode.java	Tue Sep 30 23:42:08 2014 +0200
+++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/SnippetLocationNode.java	Wed Oct 01 07:39:47 2014 +0200
@@ -46,7 +46,7 @@
 @NodeInfo
 public class SnippetLocationNode extends LocationNode implements Canonicalizable {
 
-    private final SnippetReflectionProvider snippetReflection;
+    protected final SnippetReflectionProvider snippetReflection;
 
     @Input ValueNode valueKind;
     @Input(InputType.Association) ValueNode locationIdentity;