Mercurial > hg > graal-compiler
changeset 19138:149427a9a397
Add null check in Unbox graph builder plugin.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Wed, 04 Feb 2015 23:33:32 +0100 |
parents | bf6eed01c1ef |
children | a884856ac5d0 |
files | graal/com.oracle.graal.java/src/com/oracle/graal/java/StandardGraphBuilderPluginsProvider.java |
diffstat | 1 files changed, 15 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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; }