< 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 **** /* ! * Copyright (c) 2011, 2018, 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. --- 1,7 ---- /* ! * 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,55 **** --- 41,57 ---- 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,75 **** --- 60,83 ---- 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,98 **** --- 97,107 ---- 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,217 **** --- 217,228 ---- 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,565 **** --- 567,606 ---- } 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 >