src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/DefaultJavaLoweringProvider.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/DefaultJavaLoweringProvider.java Tue Sep 24 08:54:08 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/DefaultJavaLoweringProvider.java Tue Sep 24 12:47:15 2019 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -43,11 +43,13 @@
import java.util.BitSet;
import java.util.List;
+import jdk.vm.ci.meta.JavaConstant;
import org.graalvm.compiler.api.directives.GraalDirectives;
import org.graalvm.compiler.api.replacements.Snippet;
import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
import org.graalvm.compiler.core.common.LIRKind;
import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
+import org.graalvm.compiler.core.common.type.AbstractPointerStamp;
import org.graalvm.compiler.core.common.type.IntegerStamp;
import org.graalvm.compiler.core.common.type.ObjectStamp;
import org.graalvm.compiler.core.common.type.Stamp;
@@ -60,14 +62,20 @@
import org.graalvm.compiler.nodeinfo.InputType;
import org.graalvm.compiler.nodes.CompressionNode.CompressionOp;
import org.graalvm.compiler.nodes.ConstantNode;
+import org.graalvm.compiler.nodes.EndNode;
import org.graalvm.compiler.nodes.FieldLocationIdentity;
import org.graalvm.compiler.nodes.FixedNode;
+import org.graalvm.compiler.nodes.FixedWithNextNode;
+import org.graalvm.compiler.nodes.IfNode;
import org.graalvm.compiler.nodes.LogicNode;
+import org.graalvm.compiler.nodes.MergeNode;
import org.graalvm.compiler.nodes.NamedLocationIdentity;
import org.graalvm.compiler.nodes.NodeView;
+import org.graalvm.compiler.nodes.PhiNode;
import org.graalvm.compiler.nodes.PiNode;
import org.graalvm.compiler.nodes.StructuredGraph;
import org.graalvm.compiler.nodes.ValueNode;
+import org.graalvm.compiler.nodes.ValuePhiNode;
import org.graalvm.compiler.nodes.calc.AddNode;
import org.graalvm.compiler.nodes.calc.ConditionalNode;
import org.graalvm.compiler.nodes.calc.IntegerBelowNode;
@@ -91,6 +99,7 @@
import org.graalvm.compiler.nodes.extended.JavaWriteNode;
import org.graalvm.compiler.nodes.extended.LoadArrayComponentHubNode;
import org.graalvm.compiler.nodes.extended.LoadHubNode;
+import org.graalvm.compiler.nodes.extended.LoadHubOrNullNode;
import org.graalvm.compiler.nodes.extended.MembarNode;
import org.graalvm.compiler.nodes.extended.RawLoadNode;
import org.graalvm.compiler.nodes.extended.RawStoreNode;
@@ -210,6 +219,8 @@
lowerArrayLengthNode((ArrayLengthNode) n, tool);
} else if (n instanceof LoadHubNode) {
lowerLoadHubNode((LoadHubNode) n, tool);
+ } else if (n instanceof LoadHubOrNullNode) {
+ lowerLoadHubOrNullNode((LoadHubOrNullNode) n, tool);
} else if (n instanceof LoadArrayComponentHubNode) {
lowerLoadArrayComponentHubNode((LoadArrayComponentHubNode) n);
} else if (n instanceof MonitorEnterNode) {
@@ -558,6 +569,36 @@
loadHub.replaceAtUsagesAndDelete(hub);
}
+ protected void lowerLoadHubOrNullNode(LoadHubOrNullNode loadHubOrNullNode, LoweringTool tool) {
+ StructuredGraph graph = loadHubOrNullNode.graph();
+ if (tool.getLoweringStage() != LoweringTool.StandardLoweringStage.LOW_TIER) {
+ return;
+ }
+ if (graph.getGuardsStage().allowsFloatingGuards()) {
+ return;
+ }
+ final FixedWithNextNode predecessor = tool.lastFixedNode();
+ final ValueNode value = loadHubOrNullNode.getValue();
+ AbstractPointerStamp stamp = (AbstractPointerStamp) value.stamp(NodeView.DEFAULT);
+ final LogicNode isNull = graph.addOrUniqueWithInputs(IsNullNode.create(value));
+ final EndNode trueEnd = graph.add(new EndNode());
+ final EndNode falseEnd = graph.add(new EndNode());
+ final IfNode ifNode = graph.add(new IfNode(isNull, trueEnd, falseEnd, 0.5));
+ final MergeNode merge = graph.add(new MergeNode());
+ merge.addForwardEnd(trueEnd);
+ merge.addForwardEnd(falseEnd);
+ final AbstractPointerStamp hubStamp = (AbstractPointerStamp) loadHubOrNullNode.stamp(NodeView.DEFAULT);
+ ValueNode nullHub = ConstantNode.forConstant(hubStamp.asAlwaysNull(), JavaConstant.NULL_POINTER, tool.getMetaAccess(), graph);
+ final ValueNode nonNullValue = graph.addOrUniqueWithInputs(PiNode.create(value, stamp.asNonNull(), ifNode.falseSuccessor()));
+ ValueNode hub = createReadHub(graph, nonNullValue, tool);
+ ValueNode[] values = new ValueNode[]{nullHub, hub};
+ final PhiNode hubPhi = graph.unique(new ValuePhiNode(hubStamp, merge, values));
+ final FixedNode oldNext = predecessor.next();
+ predecessor.setNext(ifNode);
+ merge.setNext(oldNext);
+ loadHubOrNullNode.replaceAtUsagesAndDelete(hubPhi);
+ }
+
protected void lowerLoadArrayComponentHubNode(LoadArrayComponentHubNode loadHub) {
StructuredGraph graph = loadHub.graph();
ValueNode hub = createReadArrayComponentHub(graph, loadHub.getValue(), loadHub);