< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/StoreFieldNode.java
Print this page
*** 25,53 ****
package org.graalvm.compiler.nodes.java;
import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_8;
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.graph.NodeClass;
import org.graalvm.compiler.nodeinfo.InputType;
import org.graalvm.compiler.nodeinfo.NodeCycles;
import org.graalvm.compiler.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodes.FrameState;
import org.graalvm.compiler.nodes.StateSplit;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.spi.Virtualizable;
import org.graalvm.compiler.nodes.spi.VirtualizerTool;
import org.graalvm.compiler.nodes.virtual.VirtualInstanceNode;
import org.graalvm.compiler.nodes.virtual.VirtualObjectNode;
import jdk.vm.ci.meta.ResolvedJavaField;
/**
* The {@code StoreFieldNode} represents a write to a static or instance field.
*/
@NodeInfo(nameTemplate = "StoreField#{p#field/s}")
! public final class StoreFieldNode extends AccessFieldNode implements StateSplit, Virtualizable {
public static final NodeClass<StoreFieldNode> TYPE = NodeClass.create(StoreFieldNode.class);
@Input ValueNode value;
@OptionalInput(InputType.State) FrameState stateAfter;
--- 25,59 ----
package org.graalvm.compiler.nodes.java;
import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_8;
import org.graalvm.compiler.core.common.type.StampFactory;
+ import org.graalvm.compiler.graph.Node;
import org.graalvm.compiler.graph.NodeClass;
+ import org.graalvm.compiler.graph.spi.Canonicalizable;
+ import org.graalvm.compiler.graph.spi.CanonicalizerTool;
import org.graalvm.compiler.nodeinfo.InputType;
import org.graalvm.compiler.nodeinfo.NodeCycles;
import org.graalvm.compiler.nodeinfo.NodeInfo;
+ import org.graalvm.compiler.nodes.DeoptimizeNode;
import org.graalvm.compiler.nodes.FrameState;
import org.graalvm.compiler.nodes.StateSplit;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.spi.Virtualizable;
import org.graalvm.compiler.nodes.spi.VirtualizerTool;
import org.graalvm.compiler.nodes.virtual.VirtualInstanceNode;
import org.graalvm.compiler.nodes.virtual.VirtualObjectNode;
+ import jdk.vm.ci.meta.DeoptimizationAction;
+ import jdk.vm.ci.meta.DeoptimizationReason;
import jdk.vm.ci.meta.ResolvedJavaField;
/**
* The {@code StoreFieldNode} represents a write to a static or instance field.
*/
@NodeInfo(nameTemplate = "StoreField#{p#field/s}")
! public final class StoreFieldNode extends AccessFieldNode implements StateSplit, Virtualizable, Canonicalizable {
public static final NodeClass<StoreFieldNode> TYPE = NodeClass.create(StoreFieldNode.class);
@Input ValueNode value;
@OptionalInput(InputType.State) FrameState stateAfter;
*** 109,114 ****
--- 115,128 ----
if (isVolatile()) {
return CYCLES_8;
}
return super.estimatedNodeCycles();
}
+
+ @Override
+ public Node canonical(CanonicalizerTool tool) {
+ if (!field.isStatic() && object.isNullConstant()) {
+ return new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.NullCheckException);
+ }
+ return this;
+ }
}
< prev index next >