changeset 16332:ddd68e267e34

explicitly define optional inputs in @Input
author Lukas Stadler <lukas.stadler@oracle.com>
date Mon, 30 Jun 2014 18:46:41 +0200
parents c8b0f10e3220
children 75ea3123657f
files 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.graph/src/com/oracle/graal/graph/NodeClassIterable.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/WriteBarrier.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopyNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractDeoptimizeNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractStateSplit.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginStateSplitNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FloatingGuardedNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardPhiNode.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/LoopBeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ReturnNode.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/BytecodeExceptionNode.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/FloatingReadNode.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/UnsafeLoadNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessMonitorNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredAtomicReadAndWriteNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredCompareAndSwapNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.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/StoreFieldNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroStateSplitNode.java
diffstat 34 files changed, 123 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Mon Jun 30 18:46:41 2014 +0200
@@ -59,9 +59,10 @@
     static final int ALIVE_ID_START = 0;
 
     /**
-     * Denotes a node input. This should be applied to exactly the fields of a node that are of type
-     * {@link Node}. Nodes that update their inputs outside of their constructor should call
-     * {@link Node#updateUsages(Node, Node)} just prior to doing the update of the input.
+     * Denotes a non-optional node input. This should be applied to exactly the fields of a node
+     * that are of type {@link Node} or {@link NodeInputList}. Nodes that update fields of type
+     * {@link Node} outside of their constructor should call {@link Node#updateUsages(Node, Node)}
+     * just prior to doing the update of the input.
      */
     @Retention(RetentionPolicy.RUNTIME)
     @Target(ElementType.FIELD)
@@ -69,6 +70,18 @@
         InputType value() default InputType.Value;
     }
 
+    /**
+     * Denotes an optional node input. This should be applied to exactly the fields of a node that
+     * are of type {@link Node} or {@link NodeInputList}. Nodes that update fields of type
+     * {@link Node} outside of their constructor should call {@link Node#updateUsages(Node, Node)}
+     * just prior to doing the update of the input.
+     */
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target(ElementType.FIELD)
+    public static @interface OptionalInput {
+        InputType value() default InputType.Value;
+    }
+
     @Retention(RetentionPolicy.RUNTIME)
     @Target(ElementType.FIELD)
     public static @interface Successor {
@@ -881,6 +894,11 @@
                 }
             }
         }
+        NodeClassIterator iterator = inputs().withNullIterator();
+        while (iterator.hasNext()) {
+            Position pos = iterator.nextPosition();
+            assert pos.isInputOptional(this) || pos.get(this) != null : "non-optional input " + pos.getInputName(this) + " cannot be null in " + this + " (fix nullness or use @OptionalInput)";
+        }
         if (predecessor != null) {
             assertFalse(predecessor.isDeleted(), "predecessor %s must never be deleted", predecessor);
             assertTrue(predecessor.successors().contains(this), "missing successor in predecessor %s", predecessor);
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Mon Jun 30 18:46:41 2014 +0200
@@ -84,6 +84,7 @@
     private final int directInputCount;
     private final long[] inputOffsets;
     private final InputType[] inputTypes;
+    private final boolean[] inputOptional;
     private final int directSuccessorCount;
     private final long[] successorOffsets;
     private final Class<?>[] dataTypes;
@@ -130,9 +131,11 @@
         directInputCount = scanner.inputOffsets.size();
         inputOffsets = sortedLongCopy(scanner.inputOffsets, scanner.inputListOffsets);
         inputTypes = new InputType[inputOffsets.length];
+        inputOptional = new boolean[inputOffsets.length];
         for (int i = 0; i < inputOffsets.length; i++) {
             inputTypes[i] = scanner.types.get(inputOffsets[i]);
             assert inputTypes[i] != null;
+            inputOptional[i] = scanner.optionalInputs.contains(inputOffsets[i]);
         }
         directSuccessorCount = scanner.successorOffsets.size();
         successorOffsets = sortedLongCopy(scanner.successorOffsets, scanner.successorListOffsets);
@@ -281,6 +284,7 @@
         public final ArrayList<Long> successorListOffsets = new ArrayList<>();
         public final HashMap<Long, InputType> types = new HashMap<>();
         public final HashMap<Long, String> names = new HashMap<>();
+        public final HashSet<Long> optionalInputs = new HashSet<>();
 
         protected FieldScanner(CalcOffset calc) {
             super(calc);
@@ -288,9 +292,9 @@
 
         @Override
         protected void scanField(Field field, Class<?> type, long offset) {
-            if (field.isAnnotationPresent(Node.Input.class)) {
+            if (field.isAnnotationPresent(Node.Input.class) || field.isAnnotationPresent(Node.OptionalInput.class)) {
                 assert !field.isAnnotationPresent(Node.Successor.class) : "field cannot be both input and successor";
-                Input inputAnnotation = field.getAnnotation(Node.Input.class);
+                assert field.isAnnotationPresent(Node.Input.class) ^ field.isAnnotationPresent(Node.OptionalInput.class) : "inputs can either be optional or non-optional";
                 if (INPUT_LIST_CLASS.isAssignableFrom(type)) {
                     GraalInternalError.guarantee(Modifier.isFinal(field.getModifiers()), "NodeInputList input field %s should be final", field);
                     GraalInternalError.guarantee(!Modifier.isPublic(field.getModifiers()), "NodeInputList input field %s should not be public", field);
@@ -301,8 +305,15 @@
                     GraalInternalError.guarantee(Modifier.isPrivate(field.getModifiers()), "Node input field %s should be private", field);
                     inputOffsets.add(offset);
                 }
-                types.put(offset, inputAnnotation.value());
+                if (field.isAnnotationPresent(Node.Input.class)) {
+                    types.put(offset, field.getAnnotation(Node.Input.class).value());
+                } else {
+                    types.put(offset, field.getAnnotation(Node.OptionalInput.class).value());
+                }
                 names.put(offset, field.getName());
+                if (field.isAnnotationPresent(Node.OptionalInput.class)) {
+                    optionalInputs.add(offset);
+                }
             } else if (field.isAnnotationPresent(Node.Successor.class)) {
                 if (SUCCESSOR_LIST_CLASS.isAssignableFrom(type)) {
                     GraalInternalError.guarantee(Modifier.isFinal(field.getModifiers()), "NodeSuccessorList successor field % should be final", field);
@@ -378,6 +389,10 @@
             return node.getNodeClass().getName(this);
         }
 
+        public boolean isInputOptional(Node node) {
+            return node.getNodeClass().isInputOptional(this);
+        }
+
         public void set(Node node, Node value) {
             node.getNodeClass().set(node, this, value);
         }
@@ -466,8 +481,8 @@
      */
     public abstract static class NodeClassIterator implements Iterator<Node> {
         protected final Node node;
-        private int index;
-        private int subIndex;
+        protected int index;
+        protected int subIndex;
 
         /**
          * Creates an iterator that will iterate over fields in the given node.
@@ -583,6 +598,32 @@
         }
     }
 
+    private class NodeClassAllInputsIterator extends NodeClassInputsIterator {
+        NodeClassAllInputsIterator(Node node) {
+            super(node, true);
+        }
+
+        @Override
+        void forward() {
+            if (index < getDirectCount()) {
+                index++;
+                if (index < getDirectCount()) {
+                    return;
+                }
+            } else {
+                subIndex++;
+            }
+            while (index < getOffsets().length) {
+                NodeList<Node> list = getNodeList(node, getOffsets()[index]);
+                if (subIndex < list.size()) {
+                    return;
+                }
+                subIndex = 0;
+                index++;
+            }
+        }
+    }
+
     private final class NodeClassInputsWithModCountIterator extends NodeClassInputsIterator {
         private final int modCount;
 
@@ -892,6 +933,11 @@
         return inputTypes[pos.getIndex()];
     }
 
+    public boolean isInputOptional(Position pos) {
+        assert pos.isInput();
+        return inputOptional[pos.getIndex()];
+    }
+
     public NodeList<?> getNodeList(Node node, Position pos) {
         long offset = pos.isInput() ? inputOffsets[pos.getIndex()] : successorOffsets[pos.getIndex()];
         assert pos.getSubIndex() == NODE_LIST;
@@ -1102,6 +1148,10 @@
                 }
             }
 
+            public NodeClassIterator withNullIterator() {
+                return new NodeClassAllInputsIterator(node);
+            }
+
             @Override
             public boolean contains(Node other) {
                 return inputContains(node, other);
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClassIterable.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClassIterable.java	Mon Jun 30 18:46:41 2014 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,5 +33,9 @@
 public interface NodeClassIterable extends NodeIterable<Node> {
 
     @Override
-    public abstract NodeClassIterator iterator();
+    NodeClassIterator iterator();
+
+    default NodeClassIterator withNullIterator() {
+        return iterator();
+    }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PreWriteBarrier.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PreWriteBarrier.java	Mon Jun 30 18:46:41 2014 +0200
@@ -28,7 +28,7 @@
 
 public class G1PreWriteBarrier extends WriteBarrier implements DeoptimizingNode.DeoptBefore {
 
-    @Input(InputType.State) private FrameState stateBefore;
+    @OptionalInput(InputType.State) private FrameState stateBefore;
     private final boolean nullCheck;
     private final boolean doLoad;
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrier.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrier.java	Mon Jun 30 18:46:41 2014 +0200
@@ -31,8 +31,8 @@
 public abstract class WriteBarrier extends FixedWithNextNode implements Lowerable {
 
     @Input private ValueNode object;
-    @Input private ValueNode value;
-    @Input(InputType.Association) private LocationNode location;
+    @OptionalInput private ValueNode value;
+    @OptionalInput(InputType.Association) private LocationNode location;
     private final boolean precise;
 
     public WriteBarrier(ValueNode object, ValueNode value, LocationNode location, boolean precise) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopyNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopyNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -40,7 +40,7 @@
     @Input private ValueNode dest;
     @Input private ValueNode destPos;
     @Input private ValueNode length;
-    @Input private ValueNode layoutHelper;
+    @OptionalInput private ValueNode layoutHelper;
 
     private Kind elementKind;
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractDeoptimizeNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractDeoptimizeNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -34,7 +34,7 @@
  */
 public abstract class AbstractDeoptimizeNode extends ControlSinkNode implements IterableNodeType, DeoptimizingNode.DeoptBefore {
 
-    @Input(InputType.State) private FrameState stateBefore;
+    @OptionalInput(InputType.State) private FrameState stateBefore;
 
     public AbstractDeoptimizeNode() {
         super(StampFactory.forVoid());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractStateSplit.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractStateSplit.java	Mon Jun 30 18:46:41 2014 +0200
@@ -30,7 +30,7 @@
  */
 public abstract class AbstractStateSplit extends FixedWithNextNode implements StateSplit {
 
-    @Input(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
 
     public FrameState stateAfter() {
         return stateAfter;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginStateSplitNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginStateSplitNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -34,7 +34,7 @@
  */
 public abstract class BeginStateSplitNode extends BeginNode implements StateSplit {
 
-    @Input(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
 
     public BeginStateSplitNode() {
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -27,7 +27,7 @@
 
 public abstract class DeoptimizingFixedWithNextNode extends FixedWithNextNode implements DeoptimizingNode.DeoptBefore {
 
-    @Input(InputType.State) private FrameState stateBefore;
+    @OptionalInput(InputType.State) private FrameState stateBefore;
 
     public DeoptimizingFixedWithNextNode(Stamp stamp) {
         super(stamp);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FloatingGuardedNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FloatingGuardedNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -29,7 +29,7 @@
 
 public abstract class FloatingGuardedNode extends FloatingNode implements GuardedNode {
 
-    @Input(InputType.Guard) private GuardingNode guard;
+    @OptionalInput(InputType.Guard) private GuardingNode guard;
 
     public FloatingGuardedNode(Stamp stamp) {
         super(stamp);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java	Mon Jun 30 18:46:41 2014 +0200
@@ -54,12 +54,12 @@
 
     private boolean duringCall;
 
-    @Input(InputType.State) private FrameState outerFrameState;
+    @OptionalInput(value = InputType.State) private FrameState outerFrameState;
 
     /**
      * Contains the locals, the expressions and the locked objects, in this order.
      */
-    @Input private final NodeInputList<ValueNode> values;
+    @OptionalInput private final NodeInputList<ValueNode> values;
 
     @Input(InputType.Association) private final NodeInputList<MonitorIdNode> monitorIds;
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardPhiNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardPhiNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -29,7 +29,7 @@
 @NodeInfo(nameTemplate = "GuardPhi({i#values})", allowedUsageTypes = {InputType.Guard})
 public class GuardPhiNode extends PhiNode implements GuardingNode {
 
-    @Input(InputType.Guard) final NodeInputList<ValueNode> values = new NodeInputList<>(this);
+    @OptionalInput(InputType.Guard) final NodeInputList<ValueNode> values = new NodeInputList<>(this);
 
     public GuardPhiNode(MergeNode merge) {
         super(StampFactory.forVoid(), merge);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -39,8 +39,8 @@
 public final class InvokeNode extends AbstractMemoryCheckpoint implements Invoke, LIRLowerable, MemoryCheckpoint.Single, IterableNodeType {
 
     @Input(InputType.Extension) private CallTargetNode callTarget;
-    @Input(InputType.State) private FrameState stateDuring;
-    @Input(InputType.Guard) private GuardingNode guard;
+    @OptionalInput(InputType.State) private FrameState stateDuring;
+    @OptionalInput(InputType.Guard) private GuardingNode guard;
     private final int bci;
     private boolean polymorphic;
     private boolean useForInlining;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -39,9 +39,9 @@
     @Successor private BeginNode next;
     @Successor private BeginNode exceptionEdge;
     @Input(InputType.Extension) private CallTargetNode callTarget;
-    @Input(InputType.State) private FrameState stateDuring;
-    @Input(InputType.State) private FrameState stateAfter;
-    @Input(InputType.Guard) private GuardingNode guard;
+    @OptionalInput(InputType.State) private FrameState stateDuring;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.Guard) private GuardingNode guard;
     private final int bci;
     private boolean polymorphic;
     private boolean useForInlining;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -39,7 +39,7 @@
     private double loopFrequency;
     private int nextEndIndex;
     private int unswitches;
-    @Input(InputType.Guard) private GuardingNode overflowGuard;
+    @OptionalInput(InputType.Guard) private GuardingNode overflowGuard;
 
     public LoopBeginNode() {
         loopFrequency = 1;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ReturnNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ReturnNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -28,8 +28,8 @@
 
 public final class ReturnNode extends ControlSinkNode implements LIRLowerable, IterableNodeType {
 
-    @Input private ValueNode result;
-    @Input(InputType.Extension) private MemoryMapNode memoryMap;
+    @OptionalInput private ValueNode result;
+    @OptionalInput(InputType.Extension) private MemoryMapNode memoryMap;
 
     public ValueNode result() {
         return result;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractWriteNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractWriteNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -31,8 +31,8 @@
 public abstract class AbstractWriteNode extends FixedAccessNode implements StateSplit, MemoryCheckpoint.Single, MemoryAccess, GuardingNode {
 
     @Input private ValueNode value;
-    @Input(InputType.State) private FrameState stateAfter;
-    @Input(InputType.Memory) private Node lastLocationAccess;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.Memory) private Node lastLocationAccess;
 
     private final boolean initialization;
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BytecodeExceptionNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BytecodeExceptionNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -36,7 +36,6 @@
 
     private final Class<? extends Throwable> exceptionClass;
     @Input private final NodeInputList<ValueNode> arguments;
-    @Input private FrameState deoptState;
 
     public BytecodeExceptionNode(MetaAccessProvider metaAccess, Class<? extends Throwable> exceptionClass, ValueNode... arguments) {
         super(StampFactory.exactNonNull(metaAccess.lookupJavaType(exceptionClass)));
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedAccessNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedAccessNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -32,7 +32,7 @@
  */
 public abstract class FixedAccessNode extends DeoptimizingFixedWithNextNode implements Access {
 
-    @Input(InputType.Guard) private GuardingNode guard;
+    @OptionalInput(InputType.Guard) private GuardingNode guard;
     @Input private ValueNode object;
     @Input(InputType.Association) private ValueNode location;
     private boolean nullCheck;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -35,7 +35,7 @@
  */
 public final class FloatingReadNode extends FloatingAccessNode implements IterableNodeType, LIRLowerable, Canonicalizable {
 
-    @Input(InputType.Memory) private MemoryNode lastLocationAccess;
+    @OptionalInput(InputType.Memory) private MemoryNode lastLocationAccess;
 
     public FloatingReadNode(ValueNode object, LocationNode location, MemoryNode lastLocationAccess, Stamp stamp) {
         this(object, location, lastLocationAccess, stamp, null, BarrierType.NONE);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -38,7 +38,7 @@
 public class ForeignCallNode extends AbstractMemoryCheckpoint implements LIRLowerable, DeoptimizingNode.DeoptDuring, MemoryCheckpoint.Multi {
 
     @Input private final NodeInputList<ValueNode> arguments;
-    @Input(InputType.State) private FrameState stateDuring;
+    @OptionalInput(InputType.State) private FrameState stateDuring;
     private final ForeignCallsProvider foreignCalls;
 
     private final ForeignCallDescriptor descriptor;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -36,7 +36,7 @@
  * performed before the load.
  */
 public class UnsafeLoadNode extends UnsafeAccessNode implements Lowerable, Virtualizable {
-    @Input(InputType.Condition) private LogicNode guardingCondition;
+    @OptionalInput(InputType.Condition) private LogicNode guardingCondition;
 
     public UnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind, LocationIdentity locationIdentity) {
         this(object, offset, accessKind, locationIdentity, null);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -38,7 +38,7 @@
 public class UnsafeStoreNode extends UnsafeAccessNode implements StateSplit, Lowerable, Virtualizable, MemoryCheckpoint.Single {
 
     @Input private ValueNode value;
-    @Input(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
 
     public UnsafeStoreNode(ValueNode object, ValueNode offset, ValueNode value, Kind accessKind, LocationIdentity locationIdentity) {
         this(object, offset, value, accessKind, locationIdentity, null);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -36,7 +36,7 @@
 @NodeInfo(allowedUsageTypes = {InputType.Anchor, InputType.Guard})
 public final class ValueAnchorNode extends FixedWithNextNode implements LIRLowerable, Simplifiable, Virtualizable, AnchoringNode, GuardingNode {
 
-    @Input(InputType.Guard) private ValueNode anchored;
+    @OptionalInput(InputType.Guard) private ValueNode anchored;
 
     public ValueAnchorNode(ValueNode value) {
         super(StampFactory.forVoid());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -32,7 +32,7 @@
  */
 public abstract class AccessFieldNode extends FixedWithNextNode implements Lowerable {
 
-    @Input private ValueNode object;
+    @OptionalInput private ValueNode object;
 
     protected final ResolvedJavaField field;
 
@@ -42,7 +42,7 @@
 
     /**
      * Constructs a new access field object.
-     * 
+     *
      * @param object the instruction producing the receiver object
      * @param field the compiler interface representation of the field
      */
@@ -55,7 +55,7 @@
 
     /**
      * Gets the compiler interface field for this field access.
-     * 
+     *
      * @return the compiler interface field for this field access
      */
     public ResolvedJavaField field() {
@@ -64,7 +64,7 @@
 
     /**
      * Checks whether this field access is an access to a static field.
-     * 
+     *
      * @return {@code true} if this field access is to a static field
      */
     public boolean isStatic() {
@@ -73,7 +73,7 @@
 
     /**
      * Checks whether this field is declared volatile.
-     * 
+     *
      * @return {@code true} if the field is resolved and declared volatile
      */
     public boolean isVolatile() {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessMonitorNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessMonitorNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -37,7 +37,7 @@
 @NodeInfo(allowedUsageTypes = {InputType.Memory})
 public abstract class AccessMonitorNode extends AbstractMemoryCheckpoint implements MemoryCheckpoint, DeoptimizingNode.DeoptBefore, DeoptimizingNode.DeoptAfter {
 
-    @Input(InputType.State) private FrameState stateBefore;
+    @OptionalInput(InputType.State) private FrameState stateBefore;
     @Input private ValueNode object;
     @Input(InputType.Association) private MonitorIdNode monitorId;
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredAtomicReadAndWriteNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredAtomicReadAndWriteNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -38,7 +38,7 @@
 public class LoweredAtomicReadAndWriteNode extends FixedAccessNode implements StateSplit, LIRLowerable, MemoryCheckpoint.Single {
 
     @Input private ValueNode newValue;
-    @Input(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
 
     public LoweredAtomicReadAndWriteNode(ValueNode object, LocationNode location, ValueNode newValue, BarrierType barrierType) {
         super(object, location, newValue.stamp().unrestricted(), barrierType);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredCompareAndSwapNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredCompareAndSwapNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -37,7 +37,7 @@
 
     @Input private ValueNode expectedValue;
     @Input private ValueNode newValue;
-    @Input(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
 
     public FrameState stateAfter() {
         return stateAfter;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -37,7 +37,7 @@
  */
 public final class MonitorExitNode extends AccessMonitorNode implements Virtualizable, Simplifiable, Lowerable, IterableNodeType, MonitorExit, MemoryCheckpoint.Single {
 
-    @Input private ValueNode escapedReturnValue;
+    @OptionalInput private ValueNode escapedReturnValue;
 
     /**
      * Creates a new MonitorExitNode.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -37,7 +37,7 @@
  */
 public final class RegisterFinalizerNode extends AbstractStateSplit implements Canonicalizable.Unary<ValueNode>, LIRLowerable, Virtualizable, DeoptimizingNode.DeoptAfter {
 
-    @Input(InputType.State) private FrameState deoptState;
+    @OptionalInput(InputType.State) private FrameState deoptState;
     @Input private ValueNode value;
 
     public RegisterFinalizerNode(ValueNode value) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -36,7 +36,7 @@
 public final class StoreFieldNode extends AccessFieldNode implements StateSplit, VirtualizableRoot {
 
     @Input private ValueNode value;
-    @Input(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
 
     public FrameState stateAfter() {
         return stateAfter;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -35,7 +35,7 @@
 public final class StoreIndexedNode extends AccessIndexedNode implements StateSplit, Lowerable, Virtualizable {
 
     @Input private ValueNode value;
-    @Input(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
 
     public FrameState stateAfter() {
         return stateAfter;
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroStateSplitNode.java	Mon Jun 30 18:46:41 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroStateSplitNode.java	Mon Jun 30 18:46:41 2014 +0200
@@ -36,7 +36,7 @@
  */
 public class MacroStateSplitNode extends MacroNode implements StateSplit, MemoryCheckpoint.Single {
 
-    @Input(InputType.State) private FrameState stateAfter;
+    @OptionalInput(InputType.State) private FrameState stateAfter;
 
     protected MacroStateSplitNode(Invoke invoke) {
         super(invoke);