Search in sources :

Example 6 with ComputeObjectAddressNode

use of org.graalvm.compiler.nodes.ComputeObjectAddressNode in project graal by oracle.

the class HotSpotGraphBuilderPlugins method registerCRC32Plugins.

private static void registerCRC32Plugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, Replacements replacements) {
    Registration r = new Registration(plugins, CRC32.class, replacements);
    r.registerConditional(config.useCRC32Intrinsics() && config.crcTableAddress != 0, new InvocationPlugin("update", int.class, int.class) {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode crc, ValueNode arg) {
            final ValueNode crcTableRawAddress = ConstantNode.forLong(config.crcTableAddress);
            ValueNode c = new XorNode(crc, ConstantNode.forInt(-1));
            ValueNode index = new AndNode(new XorNode(arg, c), ConstantNode.forInt(0xff));
            ValueNode offset = new LeftShiftNode(index, ConstantNode.forInt(2));
            AddressNode address = new OffsetAddressNode(crcTableRawAddress, new SignExtendNode(offset, 32, 64));
            ValueNode result = b.add(new JavaReadNode(JavaKind.Int, address, CRC_TABLE_LOCATION, BarrierType.NONE, false));
            result = new XorNode(result, new UnsignedRightShiftNode(c, ConstantNode.forInt(8)));
            b.addPush(JavaKind.Int, new XorNode(result, ConstantNode.forInt(-1)));
            return true;
        }
    });
    r.registerConditional(config.useCRC32Intrinsics(), new InvocationPlugin("updateBytes0", int.class, byte[].class, int.class, int.class) {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode crc, ValueNode buf, ValueNode off, ValueNode len) {
            int byteArrayBaseOffset = b.getMetaAccess().getArrayBaseOffset(JavaKind.Byte);
            ValueNode bufAddr = b.add(new ComputeObjectAddressNode(buf, new AddNode(ConstantNode.forInt(byteArrayBaseOffset), off)));
            b.addPush(JavaKind.Int, new ForeignCallNode(UPDATE_BYTES_CRC32, crc, bufAddr, len));
            return true;
        }
    });
    r.registerConditional(config.useCRC32Intrinsics(), new InvocationPlugin("updateByteBuffer0", int.class, long.class, int.class, int.class) {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode crc, ValueNode addr, ValueNode off, ValueNode len) {
            ValueNode bufAddr = b.add(new AddNode(addr, new SignExtendNode(off, 32, 64)));
            b.addPush(JavaKind.Int, new ForeignCallNode(UPDATE_BYTES_CRC32, crc, bufAddr, len));
            return true;
        }
    });
}
Also used : XorNode(org.graalvm.compiler.nodes.calc.XorNode) SignExtendNode(org.graalvm.compiler.nodes.calc.SignExtendNode) Receiver(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver) AndNode(org.graalvm.compiler.nodes.calc.AndNode) LeftShiftNode(org.graalvm.compiler.nodes.calc.LeftShiftNode) JavaReadNode(org.graalvm.compiler.nodes.extended.JavaReadNode) ForeignCallNode(org.graalvm.compiler.nodes.extended.ForeignCallNode) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) GraphBuilderContext(org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext) ComputeObjectAddressNode(org.graalvm.compiler.nodes.ComputeObjectAddressNode) Registration(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration) ValueNode(org.graalvm.compiler.nodes.ValueNode) InvocationPlugin(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin) SnippetSubstitutionInvocationPlugin(org.graalvm.compiler.replacements.SnippetSubstitutionInvocationPlugin) InlineOnlyInvocationPlugin(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.InlineOnlyInvocationPlugin) ComputeObjectAddressNode(org.graalvm.compiler.nodes.ComputeObjectAddressNode) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) AddressNode(org.graalvm.compiler.nodes.memory.address.AddressNode) UnsignedRightShiftNode(org.graalvm.compiler.nodes.calc.UnsignedRightShiftNode) AddNode(org.graalvm.compiler.nodes.calc.AddNode) ResolvedJavaMethod(jdk.vm.ci.meta.ResolvedJavaMethod)

Example 7 with ComputeObjectAddressNode

use of org.graalvm.compiler.nodes.ComputeObjectAddressNode in project graal by oracle.

the class DefaultJavaLoweringProvider method lowerComputeObjectAddressNode.

private static void lowerComputeObjectAddressNode(ComputeObjectAddressNode n) {
    /*
         * Lower the node into a GetObjectAddressNode node and an Add but ensure that it's below any
         * potential safepoints and above it's uses.
         */
    for (Node use : n.usages().snapshot()) {
        FixedNode fixed;
        if (use instanceof FixedNode) {
            fixed = (FixedNode) use;
        } else if (use instanceof ValuePhiNode) {
            ValuePhiNode phi = (ValuePhiNode) use;
            int inputPosition = 0;
            while (inputPosition < phi.valueCount()) {
                if (phi.valueAt(inputPosition) == n) {
                    break;
                }
                inputPosition++;
            }
            GraalError.guarantee(inputPosition < phi.valueCount(), "Failed to find expected input");
            fixed = phi.merge().phiPredecessorAt(inputPosition);
        } else {
            throw GraalError.shouldNotReachHere("Unexpected floating use of ComputeObjectAddressNode " + n);
        }
        StructuredGraph graph = n.graph();
        GetObjectAddressNode address = graph.add(new GetObjectAddressNode(n.getObject()));
        graph.addBeforeFixed(fixed, address);
        AddNode add = graph.addOrUnique(new AddNode(address, n.getOffset()));
        use.replaceFirstInput(n, add);
    }
    GraphUtil.unlinkFixedNode(n);
    n.safeDelete();
}
Also used : StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) RawLoadNode(org.graalvm.compiler.nodes.extended.RawLoadNode) LoweredAtomicReadAndAddNode(org.graalvm.compiler.nodes.java.LoweredAtomicReadAndAddNode) ValuePhiNode(org.graalvm.compiler.nodes.ValuePhiNode) GetObjectAddressNode(org.graalvm.compiler.nodes.GetObjectAddressNode) MonitorIdNode(org.graalvm.compiler.nodes.java.MonitorIdNode) ZeroExtendNode(org.graalvm.compiler.nodes.calc.ZeroExtendNode) RegisterFinalizerNode(org.graalvm.compiler.nodes.java.RegisterFinalizerNode) IndexAddressNode(org.graalvm.compiler.nodes.memory.address.IndexAddressNode) OrderedReadNode(org.graalvm.compiler.nodes.memory.OrderedReadNode) OrderedWriteNode(org.graalvm.compiler.nodes.memory.OrderedWriteNode) LoadHubOrNullNode(org.graalvm.compiler.nodes.extended.LoadHubOrNullNode) GuardingNode(org.graalvm.compiler.nodes.extended.GuardingNode) LeftShiftNode(org.graalvm.compiler.nodes.calc.LeftShiftNode) WriteNode(org.graalvm.compiler.nodes.memory.WriteNode) UnsafeMemoryStoreNode(org.graalvm.compiler.nodes.extended.UnsafeMemoryStoreNode) ConstantNode(org.graalvm.compiler.nodes.ConstantNode) IntegerConvertNode(org.graalvm.compiler.nodes.calc.IntegerConvertNode) IntegerEqualsNode(org.graalvm.compiler.nodes.calc.IntegerEqualsNode) AtomicReadAndWriteNode(org.graalvm.compiler.nodes.java.AtomicReadAndWriteNode) MergeNode(org.graalvm.compiler.nodes.MergeNode) JavaWriteNode(org.graalvm.compiler.nodes.extended.JavaWriteNode) AbstractNewObjectNode(org.graalvm.compiler.nodes.java.AbstractNewObjectNode) FixedNode(org.graalvm.compiler.nodes.FixedNode) IntegerBelowNode(org.graalvm.compiler.nodes.calc.IntegerBelowNode) ComputeObjectAddressNode(org.graalvm.compiler.nodes.ComputeObjectAddressNode) VirtualInstanceNode(org.graalvm.compiler.nodes.virtual.VirtualInstanceNode) VerifyHeapNode(org.graalvm.compiler.nodes.debug.VerifyHeapNode) ForeignCallNode(org.graalvm.compiler.nodes.extended.ForeignCallNode) NewInstanceNode(org.graalvm.compiler.nodes.java.NewInstanceNode) PhiNode(org.graalvm.compiler.nodes.PhiNode) LoadArrayComponentHubNode(org.graalvm.compiler.nodes.extended.LoadArrayComponentHubNode) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) NarrowNode(org.graalvm.compiler.nodes.calc.NarrowNode) AtomicReadAndAddNode(org.graalvm.compiler.nodes.java.AtomicReadAndAddNode) SignExtendNode(org.graalvm.compiler.nodes.calc.SignExtendNode) ClassIsArrayNode(org.graalvm.compiler.nodes.extended.ClassIsArrayNode) JavaReadNode(org.graalvm.compiler.nodes.extended.JavaReadNode) LoadIndexedNode(org.graalvm.compiler.nodes.java.LoadIndexedNode) BoxNode(org.graalvm.compiler.nodes.extended.BoxNode) BinaryMathIntrinsicNode(org.graalvm.compiler.replacements.nodes.BinaryMathIntrinsicNode) IfNode(org.graalvm.compiler.nodes.IfNode) VirtualObjectNode(org.graalvm.compiler.nodes.virtual.VirtualObjectNode) RawStoreNode(org.graalvm.compiler.nodes.extended.RawStoreNode) PiNode(org.graalvm.compiler.nodes.PiNode) LogicNode(org.graalvm.compiler.nodes.LogicNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) IsNullNode(org.graalvm.compiler.nodes.calc.IsNullNode) ObjectIsArrayNode(org.graalvm.compiler.nodes.extended.ObjectIsArrayNode) NewArrayNode(org.graalvm.compiler.nodes.java.NewArrayNode) VirtualArrayNode(org.graalvm.compiler.nodes.virtual.VirtualArrayNode) LogicCompareAndSwapNode(org.graalvm.compiler.nodes.java.LogicCompareAndSwapNode) UnsafeCompareAndSwapNode(org.graalvm.compiler.nodes.java.UnsafeCompareAndSwapNode) LoadFieldNode(org.graalvm.compiler.nodes.java.LoadFieldNode) BranchProbabilityNode(org.graalvm.compiler.nodes.extended.BranchProbabilityNode) LoweredAtomicReadAndWriteNode(org.graalvm.compiler.nodes.java.LoweredAtomicReadAndWriteNode) ReinterpretNode(org.graalvm.compiler.nodes.calc.ReinterpretNode) AllocatedObjectNode(org.graalvm.compiler.nodes.virtual.AllocatedObjectNode) ReadNode(org.graalvm.compiler.nodes.memory.ReadNode) InstanceOfDynamicNode(org.graalvm.compiler.nodes.java.InstanceOfDynamicNode) UnsafeCompareAndExchangeNode(org.graalvm.compiler.nodes.java.UnsafeCompareAndExchangeNode) AddNode(org.graalvm.compiler.nodes.calc.AddNode) LoadHubNode(org.graalvm.compiler.nodes.extended.LoadHubNode) InstanceOfNode(org.graalvm.compiler.nodes.java.InstanceOfNode) IdentityHashCodeNode(org.graalvm.compiler.replacements.nodes.IdentityHashCodeNode) RightShiftNode(org.graalvm.compiler.nodes.calc.RightShiftNode) AccessIndexedNode(org.graalvm.compiler.nodes.java.AccessIndexedNode) ValueCompareAndSwapNode(org.graalvm.compiler.nodes.java.ValueCompareAndSwapNode) ConditionalNode(org.graalvm.compiler.nodes.calc.ConditionalNode) GuardedUnsafeLoadNode(org.graalvm.compiler.nodes.extended.GuardedUnsafeLoadNode) UnsafeMemoryLoadNode(org.graalvm.compiler.nodes.extended.UnsafeMemoryLoadNode) UnpackEndianHalfNode(org.graalvm.compiler.nodes.calc.UnpackEndianHalfNode) UnaryMathIntrinsicNode(org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode) StoreIndexedNode(org.graalvm.compiler.nodes.java.StoreIndexedNode) SubNode(org.graalvm.compiler.nodes.calc.SubNode) CommitAllocationNode(org.graalvm.compiler.nodes.virtual.CommitAllocationNode) AddressNode(org.graalvm.compiler.nodes.memory.address.AddressNode) FixedValueAnchorNode(org.graalvm.compiler.nodes.extended.FixedValueAnchorNode) ArrayLengthNode(org.graalvm.compiler.nodes.java.ArrayLengthNode) MembarNode(org.graalvm.compiler.nodes.extended.MembarNode) MonitorEnterNode(org.graalvm.compiler.nodes.java.MonitorEnterNode) StoreFieldNode(org.graalvm.compiler.nodes.java.StoreFieldNode) Node(org.graalvm.compiler.graph.Node) EndNode(org.graalvm.compiler.nodes.EndNode) UnboxNode(org.graalvm.compiler.nodes.extended.UnboxNode) FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) ValuePhiNode(org.graalvm.compiler.nodes.ValuePhiNode) FixedNode(org.graalvm.compiler.nodes.FixedNode) LoweredAtomicReadAndAddNode(org.graalvm.compiler.nodes.java.LoweredAtomicReadAndAddNode) AtomicReadAndAddNode(org.graalvm.compiler.nodes.java.AtomicReadAndAddNode) AddNode(org.graalvm.compiler.nodes.calc.AddNode) GetObjectAddressNode(org.graalvm.compiler.nodes.GetObjectAddressNode)

Aggregations

ComputeObjectAddressNode (org.graalvm.compiler.nodes.ComputeObjectAddressNode)7 ValueNode (org.graalvm.compiler.nodes.ValueNode)7 ForeignCallNode (org.graalvm.compiler.nodes.extended.ForeignCallNode)6 ResolvedJavaMethod (jdk.vm.ci.meta.ResolvedJavaMethod)5 GraphBuilderContext (org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext)5 InvocationPlugin (org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin)5 InlineOnlyInvocationPlugin (org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.InlineOnlyInvocationPlugin)5 Receiver (org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver)5 Registration (org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration)5 SnippetSubstitutionInvocationPlugin (org.graalvm.compiler.replacements.SnippetSubstitutionInvocationPlugin)5 AddNode (org.graalvm.compiler.nodes.calc.AddNode)3 SignExtendNode (org.graalvm.compiler.nodes.calc.SignExtendNode)3 LeftShiftNode (org.graalvm.compiler.nodes.calc.LeftShiftNode)2 SubNode (org.graalvm.compiler.nodes.calc.SubNode)2 JavaReadNode (org.graalvm.compiler.nodes.extended.JavaReadNode)2 AddressNode (org.graalvm.compiler.nodes.memory.address.AddressNode)2 OffsetAddressNode (org.graalvm.compiler.nodes.memory.address.OffsetAddressNode)2 ResolvedJavaType (jdk.vm.ci.meta.ResolvedJavaType)1 Node (org.graalvm.compiler.graph.Node)1 ConstantNode (org.graalvm.compiler.nodes.ConstantNode)1