36 import org.graalvm.compiler.graph.spi.CanonicalizerTool; |
36 import org.graalvm.compiler.graph.spi.CanonicalizerTool; |
37 import org.graalvm.compiler.nodeinfo.NodeCycles; |
37 import org.graalvm.compiler.nodeinfo.NodeCycles; |
38 import org.graalvm.compiler.nodeinfo.NodeInfo; |
38 import org.graalvm.compiler.nodeinfo.NodeInfo; |
39 import org.graalvm.compiler.nodes.ConstantNode; |
39 import org.graalvm.compiler.nodes.ConstantNode; |
40 import org.graalvm.compiler.nodes.DeoptimizeNode; |
40 import org.graalvm.compiler.nodes.DeoptimizeNode; |
|
41 import org.graalvm.compiler.nodes.FixedGuardNode; |
41 import org.graalvm.compiler.nodes.NodeView; |
42 import org.graalvm.compiler.nodes.NodeView; |
42 import org.graalvm.compiler.nodes.PhiNode; |
43 import org.graalvm.compiler.nodes.PhiNode; |
43 import org.graalvm.compiler.nodes.ValueNode; |
44 import org.graalvm.compiler.nodes.ValueNode; |
44 import org.graalvm.compiler.nodes.ValuePhiNode; |
45 import org.graalvm.compiler.nodes.ValuePhiNode; |
|
46 import org.graalvm.compiler.nodes.calc.IsNullNode; |
45 import org.graalvm.compiler.nodes.spi.UncheckedInterfaceProvider; |
47 import org.graalvm.compiler.nodes.spi.UncheckedInterfaceProvider; |
46 import org.graalvm.compiler.nodes.spi.Virtualizable; |
48 import org.graalvm.compiler.nodes.spi.Virtualizable; |
47 import org.graalvm.compiler.nodes.spi.VirtualizerTool; |
49 import org.graalvm.compiler.nodes.spi.VirtualizerTool; |
48 import org.graalvm.compiler.nodes.type.StampTool; |
50 import org.graalvm.compiler.nodes.type.StampTool; |
49 import org.graalvm.compiler.nodes.util.ConstantFoldUtil; |
51 import org.graalvm.compiler.nodes.util.ConstantFoldUtil; |
108 } |
110 } |
109 |
111 |
110 @Override |
112 @Override |
111 public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject) { |
113 public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject) { |
112 NodeView view = NodeView.from(tool); |
114 NodeView view = NodeView.from(tool); |
113 if (tool.allUsagesAvailable() && hasNoUsages() && !isVolatile() && (isStatic() || StampTool.isPointerNonNull(forObject.stamp(view)))) { |
115 if (tool.allUsagesAvailable() && hasNoUsages() && !isVolatile()) { |
114 return null; |
116 if (isStatic() || StampTool.isPointerNonNull(forObject.stamp(view))) { |
|
117 return null; |
|
118 } |
|
119 if (graph().getGuardsStage().allowsGuardInsertion()) { |
|
120 return new FixedGuardNode(new IsNullNode(forObject), DeoptimizationReason.NullCheckException, DeoptimizationAction.InvalidateReprofile, true, getNodeSourcePosition()); |
|
121 } |
115 } |
122 } |
116 return canonical(this, StampPair.create(stamp, uncheckedStamp), forObject, field, tool.getConstantFieldProvider(), |
123 return canonical(this, StampPair.create(stamp, uncheckedStamp), forObject, field, tool.getConstantFieldProvider(), |
117 tool.getConstantReflection(), tool.getOptions(), tool.getMetaAccess(), tool.canonicalizeReads(), tool.allUsagesAvailable()); |
124 tool.getConstantReflection(), tool.getOptions(), tool.getMetaAccess(), tool.canonicalizeReads(), tool.allUsagesAvailable()); |
118 } |
125 } |
119 |
126 |