< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/DefaultJavaLoweringProvider.java
Print this page
rev 56282 : [mq]: graal
@@ -1,7 +1,7 @@
/*
- * 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
@@ -41,15 +41,17 @@
import java.nio.ByteOrder;
import java.util.ArrayList;
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;
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.core.common.type.TypeReference;
@@ -58,18 +60,24 @@
import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.graph.Node;
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;
import org.graalvm.compiler.nodes.calc.IntegerConvertNode;
import org.graalvm.compiler.nodes.calc.IntegerEqualsNode;
@@ -89,10 +97,11 @@
import org.graalvm.compiler.nodes.extended.GuardingNode;
import org.graalvm.compiler.nodes.extended.JavaReadNode;
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;
import org.graalvm.compiler.nodes.extended.UnboxNode;
import org.graalvm.compiler.nodes.extended.UnsafeMemoryLoadNode;
@@ -208,10 +217,12 @@
lowerIndexAddressNode((IndexAddressNode) n);
} else if (n instanceof ArrayLengthNode) {
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) {
lowerMonitorEnterNode((MonitorEnterNode) n, tool, graph);
} else if (n instanceof UnsafeCompareAndSwapNode) {
@@ -556,10 +567,40 @@
}
ValueNode hub = createReadHub(graph, loadHub.getValue(), tool);
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);
graph.replaceFixed(loadHub, hub);
}
< prev index next >