--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java 2017-03-20 17:40:39.000000000 -0700 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java 2017-03-20 17:40:39.000000000 -0700 @@ -25,7 +25,6 @@ import org.graalvm.compiler.core.common.type.AbstractPointerStamp; import org.graalvm.compiler.core.common.type.ObjectStamp; import org.graalvm.compiler.core.common.type.Stamp; -import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.graph.NodeClass; import org.graalvm.compiler.graph.spi.CanonicalizerTool; import org.graalvm.compiler.nodeinfo.NodeCycles; @@ -37,10 +36,10 @@ import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.spi.LIRLowerable; import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool; -import org.graalvm.compiler.nodes.spi.PiPushable; import org.graalvm.compiler.nodes.spi.Virtualizable; import org.graalvm.compiler.nodes.spi.VirtualizerTool; import org.graalvm.compiler.nodes.type.StampTool; +import org.graalvm.compiler.nodes.util.GraphUtil; import jdk.vm.ci.meta.TriState; @@ -48,7 +47,7 @@ * An IsNullNode will be true if the supplied value is null, and false if it is non-null. */ @NodeInfo(cycles = NodeCycles.CYCLES_2) -public final class IsNullNode extends UnaryOpLogicNode implements LIRLowerable, Virtualizable, PiPushable { +public final class IsNullNode extends UnaryOpLogicNode implements LIRLowerable, Virtualizable { public static final NodeClass TYPE = NodeClass.create(IsNullNode.class); @@ -59,7 +58,7 @@ public static LogicNode create(ValueNode forValue) { LogicNode result = tryCanonicalize(forValue); - return result == null ? new IsNullNode(forValue) : result; + return result == null ? new IsNullNode(GraphUtil.skipPi(forValue)) : result; } public static LogicNode tryCanonicalize(ValueNode forValue) { @@ -85,8 +84,24 @@ @Override public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) { + LogicNode result = tryCanonicalize(forValue); - return result == null ? this : result; + if (result != null) { + return result; + } + + if (forValue instanceof PiNode) { + return IsNullNode.create(GraphUtil.skipPi(forValue)); + } + + if (forValue instanceof ConvertNode) { + ConvertNode convertNode = (ConvertNode) forValue; + if (convertNode.mayNullCheckSkipConversion()) { + return IsNullNode.create(convertNode.getValue()); + } + } + + return this; } @Override @@ -99,24 +114,9 @@ } @Override - public boolean push(PiNode parent) { - if (parent.stamp() instanceof ObjectStamp && parent.object().stamp() instanceof ObjectStamp) { - ObjectStamp piStamp = (ObjectStamp) parent.stamp(); - ObjectStamp piValueStamp = (ObjectStamp) parent.object().stamp(); - if (piStamp.nonNull() == piValueStamp.nonNull() && piStamp.alwaysNull() == piValueStamp.alwaysNull()) { - replaceFirstInput(parent, parent.object()); - return true; - } - } - return false; - } - - @NodeIntrinsic - public static native IsNullNode isNull(Object object); - - @Override public Stamp getSucceedingStampForValue(boolean negated) { - return negated ? getValue().stamp().join(StampFactory.objectNonNull()) : StampFactory.alwaysNull(); + AbstractPointerStamp pointerStamp = (AbstractPointerStamp) getValue().stamp(); + return negated ? pointerStamp.asNonNull() : pointerStamp.asAlwaysNull(); } @Override