Search in sources :

Example 1 with OffsetAddressNode

use of org.graalvm.compiler.nodes.memory.address.OffsetAddressNode in project graal by oracle.

the class AMD64HotSpotAddressLowering method preProcess.

@Override
public void preProcess(StructuredGraph graph) {
    if (graph.hasLoops()) {
        LoopsData loopsData = new LoopsData(graph);
        loopsData.detectedCountedLoops();
        for (LoopEx loop : loopsData.countedLoops()) {
            for (OffsetAddressNode offsetAdressNode : loop.whole().nodes().filter(OffsetAddressNode.class)) {
                tryOptimize(offsetAdressNode, loop);
            }
        }
    }
}
Also used : LoopsData(org.graalvm.compiler.loop.LoopsData) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) LoopEx(org.graalvm.compiler.loop.LoopEx)

Example 2 with OffsetAddressNode

use of org.graalvm.compiler.nodes.memory.address.OffsetAddressNode in project graal by oracle.

the class LoadJavaMirrorWithKlassPhase method getClassConstantReplacement.

private ValueNode getClassConstantReplacement(StructuredGraph graph, PhaseContext context, JavaConstant constant) {
    if (constant instanceof HotSpotObjectConstant) {
        ConstantReflectionProvider constantReflection = context.getConstantReflection();
        ResolvedJavaType type = constantReflection.asJavaType(constant);
        if (type != null) {
            MetaAccessProvider metaAccess = context.getMetaAccess();
            Stamp stamp = StampFactory.objectNonNull(TypeReference.createExactTrusted(metaAccess.lookupJavaType(Class.class)));
            if (type instanceof HotSpotResolvedObjectType) {
                ConstantNode klass = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), ((HotSpotResolvedObjectType) type).klass(), metaAccess, graph);
                ValueNode getClass = graph.unique(new HubGetClassNode(metaAccess, klass));
                if (((HotSpotObjectConstant) constant).isCompressed()) {
                    return HotSpotCompressionNode.compress(getClass, oopEncoding);
                } else {
                    return getClass;
                }
            } else {
                /*
                     * Primitive classes are more difficult since they don't have a corresponding
                     * Klass* so get them from Class.TYPE for the java box type.
                     */
                HotSpotResolvedPrimitiveType primitive = (HotSpotResolvedPrimitiveType) type;
                ResolvedJavaType boxingClass = metaAccess.lookupJavaType(primitive.getJavaKind().toBoxedJavaClass());
                ConstantNode clazz = ConstantNode.forConstant(context.getConstantReflection().asJavaClass(boxingClass), metaAccess, graph);
                HotSpotResolvedJavaField[] a = (HotSpotResolvedJavaField[]) boxingClass.getStaticFields();
                HotSpotResolvedJavaField typeField = null;
                for (HotSpotResolvedJavaField f : a) {
                    if (f.getName().equals("TYPE")) {
                        typeField = f;
                        break;
                    }
                }
                if (typeField == null) {
                    throw new GraalError("Can't find TYPE field in class");
                }
                if (oopEncoding != null) {
                    stamp = HotSpotNarrowOopStamp.compressed((AbstractObjectStamp) stamp, oopEncoding);
                }
                AddressNode address = graph.unique(new OffsetAddressNode(clazz, ConstantNode.forLong(typeField.offset(), graph)));
                ValueNode read = graph.unique(new FloatingReadNode(address, FINAL_LOCATION, null, stamp));
                if (oopEncoding == null || ((HotSpotObjectConstant) constant).isCompressed()) {
                    return read;
                } else {
                    return HotSpotCompressionNode.uncompress(read, oopEncoding);
                }
            }
        }
    }
    return null;
}
Also used : KlassPointerStamp(org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp) AbstractObjectStamp(org.graalvm.compiler.core.common.type.AbstractObjectStamp) HotSpotNarrowOopStamp(org.graalvm.compiler.hotspot.nodes.type.HotSpotNarrowOopStamp) Stamp(org.graalvm.compiler.core.common.type.Stamp) HubGetClassNode(org.graalvm.compiler.hotspot.replacements.HubGetClassNode) HotSpotResolvedPrimitiveType(jdk.vm.ci.hotspot.HotSpotResolvedPrimitiveType) AbstractObjectStamp(org.graalvm.compiler.core.common.type.AbstractObjectStamp) HotSpotResolvedJavaField(jdk.vm.ci.hotspot.HotSpotResolvedJavaField) HotSpotObjectConstant(jdk.vm.ci.hotspot.HotSpotObjectConstant) ResolvedJavaType(jdk.vm.ci.meta.ResolvedJavaType) ConstantNode(org.graalvm.compiler.nodes.ConstantNode) GraalError(org.graalvm.compiler.debug.GraalError) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) ConstantReflectionProvider(jdk.vm.ci.meta.ConstantReflectionProvider) HotSpotResolvedObjectType(jdk.vm.ci.hotspot.HotSpotResolvedObjectType) FloatingReadNode(org.graalvm.compiler.nodes.memory.FloatingReadNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) AddressNode(org.graalvm.compiler.nodes.memory.address.AddressNode) MetaAccessProvider(jdk.vm.ci.meta.MetaAccessProvider)

Example 3 with OffsetAddressNode

use of org.graalvm.compiler.nodes.memory.address.OffsetAddressNode in project graal by oracle.

the class ArrayCopyCallNode method computeBase.

private ValueNode computeBase(ValueNode base, ValueNode pos) {
    FixedWithNextNode basePtr = graph().add(new GetObjectAddressNode(base));
    graph().addBeforeFixed(this, basePtr);
    Stamp wordStamp = StampFactory.forKind(runtime.getTarget().wordJavaKind);
    ValueNode wordPos = IntegerConvertNode.convert(pos, wordStamp, graph(), NodeView.DEFAULT);
    int shift = CodeUtil.log2(getArrayIndexScale(elementKind));
    ValueNode scaledIndex = graph().unique(new LeftShiftNode(wordPos, ConstantNode.forInt(shift, graph())));
    ValueNode offset = graph().unique(new AddNode(scaledIndex, ConstantNode.forIntegerStamp(wordStamp, getArrayBaseOffset(elementKind), graph())));
    return graph().unique(new OffsetAddressNode(basePtr, offset));
}
Also used : FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) Stamp(org.graalvm.compiler.core.common.type.Stamp) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) LeftShiftNode(org.graalvm.compiler.nodes.calc.LeftShiftNode) AddNode(org.graalvm.compiler.nodes.calc.AddNode) GetObjectAddressNode(org.graalvm.compiler.hotspot.nodes.GetObjectAddressNode) AbstractMemoryCheckpoint(org.graalvm.compiler.nodes.memory.AbstractMemoryCheckpoint) MemoryCheckpoint(org.graalvm.compiler.nodes.memory.MemoryCheckpoint)

Example 4 with OffsetAddressNode

use of org.graalvm.compiler.nodes.memory.address.OffsetAddressNode in project graal by oracle.

the class AddressLoweringByUsePhase method run.

@Override
protected void run(StructuredGraph graph) {
    // first replace address nodes hanging off known usages
    for (Node node : graph.getNodes()) {
        AddressNode address;
        AddressNode lowered;
        if (node instanceof ReadNode) {
            ReadNode readNode = (ReadNode) node;
            Stamp stamp = readNode.stamp(NodeView.DEFAULT);
            address = readNode.getAddress();
            lowered = lowering.lower(readNode, stamp, address);
        } else if (node instanceof JavaReadNode) {
            JavaReadNode javaReadNode = (JavaReadNode) node;
            Stamp stamp = javaReadNode.stamp(NodeView.DEFAULT);
            address = javaReadNode.getAddress();
            lowered = lowering.lower(javaReadNode, stamp, address);
        } else if (node instanceof FloatingReadNode) {
            FloatingReadNode floatingReadNode = (FloatingReadNode) node;
            Stamp stamp = floatingReadNode.stamp(NodeView.DEFAULT);
            address = floatingReadNode.getAddress();
            lowered = lowering.lower(floatingReadNode, stamp, address);
        } else if (node instanceof AbstractWriteNode) {
            AbstractWriteNode abstractWriteNode = (AbstractWriteNode) node;
            Stamp stamp = abstractWriteNode.value().stamp(NodeView.DEFAULT);
            address = abstractWriteNode.getAddress();
            lowered = lowering.lower(abstractWriteNode, stamp, address);
        } else if (node instanceof PrefetchAllocateNode) {
            PrefetchAllocateNode prefetchAllocateNode = (PrefetchAllocateNode) node;
            Stamp stamp = StampFactory.forKind(JavaKind.Object);
            address = (AddressNode) prefetchAllocateNode.inputs().first();
            lowered = lowering.lower(prefetchAllocateNode, stamp, address);
        } else {
            continue;
        }
        // in which case we want to use it not delete it!
        if (lowered != address) {
            // replace original with lowered at this usage only
            // n.b. lowered is added unique so repeat lowerings will elide
            node.replaceFirstInput(address, lowered);
            // if that was the last reference we can kill the old (dead) node
            if (address.hasNoUsages()) {
                GraphUtil.killWithUnusedFloatingInputs(address);
            }
        }
    }
    // now replace any remaining unlowered address nodes
    for (Node node : graph.getNodes()) {
        AddressNode lowered;
        if (node instanceof OffsetAddressNode) {
            AddressNode address = (AddressNode) node;
            lowered = lowering.lower(address);
        } else {
            continue;
        }
        // will always be a new AddresNode
        node.replaceAtUsages(lowered);
        GraphUtil.killWithUnusedFloatingInputs(node);
    }
}
Also used : JavaReadNode(org.graalvm.compiler.nodes.extended.JavaReadNode) Stamp(org.graalvm.compiler.core.common.type.Stamp) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) AbstractWriteNode(org.graalvm.compiler.nodes.memory.AbstractWriteNode) FloatingReadNode(org.graalvm.compiler.nodes.memory.FloatingReadNode) ReadNode(org.graalvm.compiler.nodes.memory.ReadNode) AddressNode(org.graalvm.compiler.nodes.memory.address.AddressNode) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) PrefetchAllocateNode(org.graalvm.compiler.nodes.PrefetchAllocateNode) Node(org.graalvm.compiler.graph.Node) JavaReadNode(org.graalvm.compiler.nodes.extended.JavaReadNode) FloatingReadNode(org.graalvm.compiler.nodes.memory.FloatingReadNode) AddressNode(org.graalvm.compiler.nodes.memory.address.AddressNode) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) FloatingReadNode(org.graalvm.compiler.nodes.memory.FloatingReadNode) ReadNode(org.graalvm.compiler.nodes.memory.ReadNode) JavaReadNode(org.graalvm.compiler.nodes.extended.JavaReadNode) AbstractWriteNode(org.graalvm.compiler.nodes.memory.AbstractWriteNode) PrefetchAllocateNode(org.graalvm.compiler.nodes.PrefetchAllocateNode)

Example 5 with OffsetAddressNode

use of org.graalvm.compiler.nodes.memory.address.OffsetAddressNode in project graal by oracle.

the class AddressLoweringPhase method run.

@Override
protected void run(StructuredGraph graph) {
    lowering.preProcess(graph);
    for (Node node : graph.getNodes()) {
        AddressNode lowered;
        if (node instanceof OffsetAddressNode) {
            OffsetAddressNode address = (OffsetAddressNode) node;
            lowered = lowering.lower(address.getBase(), address.getOffset());
            lowering.postProcess(lowered);
        } else {
            continue;
        }
        node.replaceAtUsages(lowered);
        GraphUtil.killWithUnusedFloatingInputs(node);
    }
}
Also used : OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) Node(org.graalvm.compiler.graph.Node) AddressNode(org.graalvm.compiler.nodes.memory.address.AddressNode) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) AddressNode(org.graalvm.compiler.nodes.memory.address.AddressNode) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode)

Aggregations

OffsetAddressNode (org.graalvm.compiler.nodes.memory.address.OffsetAddressNode)28 ValueNode (org.graalvm.compiler.nodes.ValueNode)18 AddressNode (org.graalvm.compiler.nodes.memory.address.AddressNode)15 ConstantNode (org.graalvm.compiler.nodes.ConstantNode)7 SignExtendNode (org.graalvm.compiler.nodes.calc.SignExtendNode)7 ResolvedJavaMethod (jdk.vm.ci.meta.ResolvedJavaMethod)5 StructuredGraph (org.graalvm.compiler.nodes.StructuredGraph)5 ReadNode (org.graalvm.compiler.nodes.memory.ReadNode)5 JavaKind (jdk.vm.ci.meta.JavaKind)4 Stamp (org.graalvm.compiler.core.common.type.Stamp)4 AddNode (org.graalvm.compiler.nodes.calc.AddNode)4 MetaAccessProvider (jdk.vm.ci.meta.MetaAccessProvider)3 ResolvedJavaType (jdk.vm.ci.meta.ResolvedJavaType)3 Node (org.graalvm.compiler.graph.Node)3 ReturnNode (org.graalvm.compiler.nodes.ReturnNode)3 LeftShiftNode (org.graalvm.compiler.nodes.calc.LeftShiftNode)3 JavaReadNode (org.graalvm.compiler.nodes.extended.JavaReadNode)3 GraphBuilderContext (org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext)3 InvocationPlugin (org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin)3 Registration (org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration)3