--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ArrayLengthNode.java 2019-05-06 15:58:56.043349819 +0200 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ArrayLengthNode.java 2019-05-06 15:58:55.635347206 +0200 @@ -33,6 +33,7 @@ import org.graalvm.compiler.graph.spi.CanonicalizerTool; import org.graalvm.compiler.nodeinfo.NodeInfo; import org.graalvm.compiler.nodes.ConstantNode; +import org.graalvm.compiler.nodes.DeoptimizeNode; import org.graalvm.compiler.nodes.FixedWithNextNode; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.spi.ArrayLengthProvider; @@ -44,6 +45,8 @@ import org.graalvm.compiler.nodes.virtual.VirtualArrayNode; import jdk.vm.ci.meta.ConstantReflectionProvider; +import jdk.vm.ci.meta.DeoptimizationAction; +import jdk.vm.ci.meta.DeoptimizationReason; /** * The {@code ArrayLength} instruction gets the length of an array. @@ -83,6 +86,9 @@ @Override public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) { + if (forValue.isNullConstant()) { + return new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.NullCheckException); + } ValueNode length = readArrayLength(forValue, tool.getConstantReflection()); if (length != null) { return length;