src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java Mon Mar 20 17:40:39 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java Mon Mar 20 17:40:39 2017
*** 23,33 ****
--- 23,32 ----
package org.graalvm.compiler.nodes.calc;
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;
import org.graalvm.compiler.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodes.LogicConstantNode;
*** 35,67 ****
--- 34,66 ----
import org.graalvm.compiler.nodes.PiNode;
import org.graalvm.compiler.nodes.UnaryOpLogicNode;
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;
/**
* 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 static final NodeClass<IsNullNode> TYPE = NodeClass.create(IsNullNode.class);
public IsNullNode(ValueNode object) {
super(TYPE, object);
assert object != null;
}
public static LogicNode create(ValueNode forValue) {
LogicNode result = tryCanonicalize(forValue);
! return result == null ? new IsNullNode(GraphUtil.skipPi(forValue)) : result;
}
public static LogicNode tryCanonicalize(ValueNode forValue) {
if (StampTool.isPointerAlwaysNull(forValue)) {
return LogicConstantNode.tautology();
*** 83,94 ****
--- 82,109 ----
return super.verify();
}
@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
public void virtualize(VirtualizerTool tool) {
ValueNode alias = tool.getAlias(getValue());
*** 97,124 ****
--- 112,124 ----
tool.replaceWithValue(LogicConstantNode.forBoolean(fold.isTrue(), graph()));
}
}
@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
public TriState tryFold(Stamp valueStamp) {
if (valueStamp instanceof ObjectStamp) {
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File