# HG changeset patch # User Lukas Stadler # Date 1404146801 -7200 # Node ID ddd68e267e34c6367fedc06d0fbfdda3b3d53ef3 # Parent c8b0f10e3220a957b35373c3462b4f46c08bc343 explicitly define optional inputs in @Input diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java 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); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java 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 successorListOffsets = new ArrayList<>(); public final HashMap types = new HashMap<>(); public final HashMap names = new HashMap<>(); + public final HashSet 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 { 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 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); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClassIterable.java --- 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 { @Override - public abstract NodeClassIterator iterator(); + NodeClassIterator iterator(); + + default NodeClassIterator withNullIterator() { + return iterator(); + } } diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/G1PreWriteBarrier.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrier.java --- 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) { diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopyNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractDeoptimizeNode.java --- 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()); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractStateSplit.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginStateSplitNode.java --- 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() { } diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizingFixedWithNextNode.java --- 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); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FloatingGuardedNode.java --- 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); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java --- 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 values; + @OptionalInput private final NodeInputList values; @Input(InputType.Association) private final NodeInputList monitorIds; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardPhiNode.java --- 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 values = new NodeInputList<>(this); + @OptionalInput(InputType.Guard) final NodeInputList values = new NodeInputList<>(this); public GuardPhiNode(MergeNode merge) { super(StampFactory.forVoid(), merge); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ReturnNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AbstractWriteNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/BytecodeExceptionNode.java --- 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 exceptionClass; @Input private final NodeInputList arguments; - @Input private FrameState deoptState; public BytecodeExceptionNode(MetaAccessProvider metaAccess, Class exceptionClass, ValueNode... arguments) { super(StampFactory.exactNonNull(metaAccess.lookupJavaType(exceptionClass))); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedAccessNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java --- 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); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java --- 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 arguments; - @Input(InputType.State) private FrameState stateDuring; + @OptionalInput(InputType.State) private FrameState stateDuring; private final ForeignCallsProvider foreignCalls; private final ForeignCallDescriptor descriptor; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java --- 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); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java --- 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); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java --- 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()); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java --- 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() { diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessMonitorNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredAtomicReadAndWriteNode.java --- 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); diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredCompareAndSwapNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java --- 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. diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java --- 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, LIRLowerable, Virtualizable, DeoptimizingNode.DeoptAfter { - @Input(InputType.State) private FrameState deoptState; + @OptionalInput(InputType.State) private FrameState deoptState; @Input private ValueNode value; public RegisterFinalizerNode(ValueNode value) { diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java --- 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; diff -r c8b0f10e3220 -r ddd68e267e34 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroStateSplitNode.java --- 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);