--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewArrayNode.java 2017-03-20 17:40:55.000000000 -0700 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewArrayNode.java 2017-03-20 17:40:55.000000000 -0700 @@ -24,18 +24,29 @@ import java.util.Collections; +import org.graalvm.compiler.core.common.calc.Condition; +import org.graalvm.compiler.core.common.type.IntegerStamp; +import org.graalvm.compiler.core.common.type.Stamp; import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.core.common.type.TypeReference; import org.graalvm.compiler.graph.NodeClass; +import org.graalvm.compiler.graph.spi.Simplifiable; +import org.graalvm.compiler.graph.spi.SimplifierTool; import org.graalvm.compiler.nodeinfo.NodeInfo; import org.graalvm.compiler.nodes.ConstantNode; +import org.graalvm.compiler.nodes.FixedGuardNode; import org.graalvm.compiler.nodes.FrameState; +import org.graalvm.compiler.nodes.LogicNode; import org.graalvm.compiler.nodes.ValueNode; +import org.graalvm.compiler.nodes.calc.CompareNode; import org.graalvm.compiler.nodes.spi.VirtualizableAllocation; import org.graalvm.compiler.nodes.spi.VirtualizerTool; +import org.graalvm.compiler.nodes.util.GraphUtil; import org.graalvm.compiler.nodes.virtual.VirtualArrayNode; import org.graalvm.compiler.nodes.virtual.VirtualObjectNode; +import jdk.vm.ci.meta.DeoptimizationAction; +import jdk.vm.ci.meta.DeoptimizationReason; import jdk.vm.ci.meta.ResolvedJavaType; /** @@ -44,7 +55,7 @@ */ // JaCoCo Exclude @NodeInfo -public class NewArrayNode extends AbstractNewArrayNode implements VirtualizableAllocation { +public class NewArrayNode extends AbstractNewArrayNode implements VirtualizableAllocation, Simplifiable { public static final NodeClass TYPE = NodeClass.create(NewArrayNode.class); private final ResolvedJavaType elementType; @@ -104,4 +115,26 @@ protected ConstantNode defaultElementValue() { return ConstantNode.defaultForKind(elementType().getJavaKind(), graph()); } + + @Override + public void simplify(SimplifierTool tool) { + if (hasNoUsages()) { + Stamp lengthStamp = length().stamp(); + if (lengthStamp instanceof IntegerStamp) { + IntegerStamp lengthIntegerStamp = (IntegerStamp) lengthStamp; + if (lengthIntegerStamp.isPositive()) { + GraphUtil.removeFixedWithUnusedInputs(this); + return; + } + } + // Should be areFrameStatesAtSideEffects but currently SVM will complain about + // RuntimeConstraint + if (graph().getGuardsStage().allowsFloatingGuards()) { + LogicNode lengthNegativeCondition = CompareNode.createCompareNode(graph(), Condition.LT, length(), ConstantNode.forInt(0, graph()), tool.getConstantReflection()); + // we do not have a non-deopting path for that at the moment so action=None. + FixedGuardNode guard = graph().add(new FixedGuardNode(lengthNegativeCondition, DeoptimizationReason.RuntimeConstraint, DeoptimizationAction.None, true)); + graph().replaceFixedWithFixed(this, guard); + } + } + } }