# HG changeset patch # User Thomas Wuerthinger # Date 1423089212 -3600 # Node ID 149427a9a39771bbee453c4dba90e63f677a6299 # Parent bf6eed01c1ef435c694fa0ace4791d9cfabf46ff Add null check in Unbox graph builder plugin. diff -r bf6eed01c1ef -r 149427a9a397 graal/com.oracle.graal.java/src/com/oracle/graal/java/StandardGraphBuilderPluginsProvider.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/StandardGraphBuilderPluginsProvider.java Wed Feb 04 21:29:52 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/StandardGraphBuilderPluginsProvider.java Wed Feb 04 23:33:32 2015 +0100 @@ -22,14 +22,21 @@ */ package com.oracle.graal.java; +import static com.oracle.graal.api.meta.DeoptimizationAction.*; +import static com.oracle.graal.api.meta.DeoptimizationReason.*; +import static com.oracle.graal.compiler.common.type.StampFactory.*; + import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; +import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.java.GraphBuilderPlugins.InvocationPlugin; import com.oracle.graal.java.GraphBuilderPlugins.Registration; import com.oracle.graal.java.GraphBuilderPlugins.Registration.Receiver; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.type.*; /** * Provider of non-runtime specific {@link GraphBuilderPlugin}s. @@ -86,7 +93,14 @@ } public boolean apply(GraphBuilderContext builder, ValueNode value) { - builder.push(kind.getStackKind(), builder.append(new UnboxNode(value, kind))); + ValueNode nonNullValue = value; + ObjectStamp receiverStamp = (ObjectStamp) value.stamp(); + if (!StampTool.isPointerNonNull(receiverStamp)) { + IsNullNode condition = builder.append(new IsNullNode(value)); + Stamp stamp = receiverStamp.join(objectNonNull()); + nonNullValue = builder.append(new GuardingPiNode(value, condition, true, NullCheckException, InvalidateReprofile, stamp)); + } + builder.push(kind.getStackKind(), builder.append(new UnboxNode(nonNullValue, kind))); return true; }