46 import org.graalvm.compiler.api.directives.GraalDirectives;
47 import org.graalvm.compiler.core.common.CompressEncoding;
48 import org.graalvm.compiler.core.common.GraalOptions;
49 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
50 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
51 import org.graalvm.compiler.core.common.type.ObjectStamp;
52 import org.graalvm.compiler.core.common.type.Stamp;
53 import org.graalvm.compiler.core.common.type.StampFactory;
54 import org.graalvm.compiler.core.common.type.StampPair;
55 import org.graalvm.compiler.debug.DebugCloseable;
56 import org.graalvm.compiler.debug.DebugHandlersFactory;
57 import org.graalvm.compiler.debug.GraalError;
58 import org.graalvm.compiler.graph.Node;
59 import org.graalvm.compiler.graph.NodeInputList;
60 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
61 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
62 import org.graalvm.compiler.hotspot.nodes.BeginLockScopeNode;
63 import org.graalvm.compiler.hotspot.nodes.HotSpotCompressionNode;
64 import org.graalvm.compiler.hotspot.nodes.HotSpotDirectCallTargetNode;
65 import org.graalvm.compiler.hotspot.nodes.HotSpotIndirectCallTargetNode;
66 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
67 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
68 import org.graalvm.compiler.hotspot.nodes.aot.ResolveDynamicConstantNode;
69 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
70 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileNode;
71 import org.graalvm.compiler.hotspot.nodes.type.HotSpotNarrowOopStamp;
72 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
73 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
74 import org.graalvm.compiler.hotspot.replacements.AssertionSnippets;
75 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
76 import org.graalvm.compiler.hotspot.replacements.HashCodeSnippets;
77 import org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets;
78 import org.graalvm.compiler.hotspot.replacements.HotSpotSerialWriteBarrierSnippets;
79 import org.graalvm.compiler.hotspot.replacements.HubGetClassNode;
80 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
81 import org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets;
82 import org.graalvm.compiler.hotspot.replacements.KlassLayoutHelperNode;
83 import org.graalvm.compiler.hotspot.replacements.LoadExceptionObjectSnippets;
84 import org.graalvm.compiler.hotspot.replacements.MonitorSnippets;
85 import org.graalvm.compiler.hotspot.replacements.NewObjectSnippets;
388 } else if (n instanceof IdentityHashCodeNode) {
389 hashCodeSnippets.lower((IdentityHashCodeNode) n, tool);
390 } else if (n instanceof ResolveDynamicConstantNode) {
391 if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
392 resolveConstantSnippets.lower((ResolveDynamicConstantNode) n, tool);
393 }
394 } else if (n instanceof ResolveConstantNode) {
395 if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
396 resolveConstantSnippets.lower((ResolveConstantNode) n, tool);
397 }
398 } else if (n instanceof ResolveMethodAndLoadCountersNode) {
399 if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
400 resolveConstantSnippets.lower((ResolveMethodAndLoadCountersNode) n, tool);
401 }
402 } else if (n instanceof InitializeKlassNode) {
403 if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
404 resolveConstantSnippets.lower((InitializeKlassNode) n, tool);
405 }
406 } else if (n instanceof ProfileNode) {
407 profileSnippets.lower((ProfileNode) n, tool);
408 } else {
409 super.lower(n, tool);
410 }
411 }
412 }
413
414 private static void lowerComputeObjectAddressNode(ComputeObjectAddressNode n) {
415 /*
416 * Lower the node into a ComputeObjectAddress node and an Add but ensure that it's below any
417 * potential safepoints and above it's uses.
418 */
419 for (Node use : n.usages().snapshot()) {
420 if (use instanceof FixedNode) {
421 FixedNode fixed = (FixedNode) use;
422 StructuredGraph graph = n.graph();
423 GetObjectAddressNode address = graph.add(new GetObjectAddressNode(n.getObject()));
424 graph.addBeforeFixed(fixed, address);
425 AddNode add = graph.addOrUnique(new AddNode(address, n.getOffset()));
426 use.replaceFirstInput(n, add);
427 } else {
696 }
697 Throwable exception = Exceptions.cachedExceptions.get(node.getExceptionKind());
698 assert exception != null;
699
700 StructuredGraph graph = node.graph();
701 FloatingNode exceptionNode = ConstantNode.forConstant(constantReflection.forObject(exception), metaAccess, graph);
702 graph.replaceFixedWithFloating(node, exceptionNode);
703 }
704
705 private void lowerBytecodeExceptionNode(BytecodeExceptionNode node) {
706 if (OmitHotExceptionStacktrace.getValue(node.getOptions())) {
707 throwCachedException(node);
708 return;
709 }
710
711 ForeignCallDescriptor descriptor = RuntimeCalls.runtimeCalls.get(node.getExceptionKind());
712 assert descriptor != null;
713
714 StructuredGraph graph = node.graph();
715 ForeignCallNode foreignCallNode = graph.add(new ForeignCallNode(foreignCalls, descriptor, node.stamp(NodeView.DEFAULT), node.getArguments()));
716 graph.replaceFixedWithFixed(node, foreignCallNode);
717 }
718
719 private boolean addReadBarrier(RawLoadNode load) {
720 if (runtime.getVMConfig().useG1GC && load.graph().getGuardsStage() == StructuredGraph.GuardsStage.FIXED_DEOPTS && load.object().getStackKind() == JavaKind.Object &&
721 load.accessKind() == JavaKind.Object && !StampTool.isPointerAlwaysNull(load.object())) {
722 ResolvedJavaType type = StampTool.typeOrNull(load.object());
723 if (type != null && !type.isArray()) {
724 return true;
725 }
726 }
727 return false;
728 }
729
730 private ReadNode createReadVirtualMethod(StructuredGraph graph, ValueNode hub, HotSpotResolvedJavaMethod method, ResolvedJavaType receiverType) {
731 return createReadVirtualMethod(graph, hub, method.vtableEntryOffset(receiverType));
732 }
733
734 private ReadNode createReadVirtualMethod(StructuredGraph graph, ValueNode hub, int vtableEntryOffset) {
735 assert vtableEntryOffset > 0;
|
46 import org.graalvm.compiler.api.directives.GraalDirectives;
47 import org.graalvm.compiler.core.common.CompressEncoding;
48 import org.graalvm.compiler.core.common.GraalOptions;
49 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
50 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
51 import org.graalvm.compiler.core.common.type.ObjectStamp;
52 import org.graalvm.compiler.core.common.type.Stamp;
53 import org.graalvm.compiler.core.common.type.StampFactory;
54 import org.graalvm.compiler.core.common.type.StampPair;
55 import org.graalvm.compiler.debug.DebugCloseable;
56 import org.graalvm.compiler.debug.DebugHandlersFactory;
57 import org.graalvm.compiler.debug.GraalError;
58 import org.graalvm.compiler.graph.Node;
59 import org.graalvm.compiler.graph.NodeInputList;
60 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
61 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
62 import org.graalvm.compiler.hotspot.nodes.BeginLockScopeNode;
63 import org.graalvm.compiler.hotspot.nodes.HotSpotCompressionNode;
64 import org.graalvm.compiler.hotspot.nodes.HotSpotDirectCallTargetNode;
65 import org.graalvm.compiler.hotspot.nodes.HotSpotIndirectCallTargetNode;
66 import org.graalvm.compiler.hotspot.nodes.KlassBeingInitializedCheckNode;
67 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
68 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
69 import org.graalvm.compiler.hotspot.nodes.aot.ResolveDynamicConstantNode;
70 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
71 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileNode;
72 import org.graalvm.compiler.hotspot.nodes.type.HotSpotNarrowOopStamp;
73 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
74 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
75 import org.graalvm.compiler.hotspot.replacements.AssertionSnippets;
76 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
77 import org.graalvm.compiler.hotspot.replacements.HashCodeSnippets;
78 import org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets;
79 import org.graalvm.compiler.hotspot.replacements.HotSpotSerialWriteBarrierSnippets;
80 import org.graalvm.compiler.hotspot.replacements.HubGetClassNode;
81 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
82 import org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets;
83 import org.graalvm.compiler.hotspot.replacements.KlassLayoutHelperNode;
84 import org.graalvm.compiler.hotspot.replacements.LoadExceptionObjectSnippets;
85 import org.graalvm.compiler.hotspot.replacements.MonitorSnippets;
86 import org.graalvm.compiler.hotspot.replacements.NewObjectSnippets;
389 } else if (n instanceof IdentityHashCodeNode) {
390 hashCodeSnippets.lower((IdentityHashCodeNode) n, tool);
391 } else if (n instanceof ResolveDynamicConstantNode) {
392 if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
393 resolveConstantSnippets.lower((ResolveDynamicConstantNode) n, tool);
394 }
395 } else if (n instanceof ResolveConstantNode) {
396 if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
397 resolveConstantSnippets.lower((ResolveConstantNode) n, tool);
398 }
399 } else if (n instanceof ResolveMethodAndLoadCountersNode) {
400 if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
401 resolveConstantSnippets.lower((ResolveMethodAndLoadCountersNode) n, tool);
402 }
403 } else if (n instanceof InitializeKlassNode) {
404 if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
405 resolveConstantSnippets.lower((InitializeKlassNode) n, tool);
406 }
407 } else if (n instanceof ProfileNode) {
408 profileSnippets.lower((ProfileNode) n, tool);
409 } else if (n instanceof KlassBeingInitializedCheckNode) {
410 newObjectSnippets.lower((KlassBeingInitializedCheckNode) n, registers, tool);
411 } else {
412 super.lower(n, tool);
413 }
414 }
415 }
416
417 private static void lowerComputeObjectAddressNode(ComputeObjectAddressNode n) {
418 /*
419 * Lower the node into a ComputeObjectAddress node and an Add but ensure that it's below any
420 * potential safepoints and above it's uses.
421 */
422 for (Node use : n.usages().snapshot()) {
423 if (use instanceof FixedNode) {
424 FixedNode fixed = (FixedNode) use;
425 StructuredGraph graph = n.graph();
426 GetObjectAddressNode address = graph.add(new GetObjectAddressNode(n.getObject()));
427 graph.addBeforeFixed(fixed, address);
428 AddNode add = graph.addOrUnique(new AddNode(address, n.getOffset()));
429 use.replaceFirstInput(n, add);
430 } else {
699 }
700 Throwable exception = Exceptions.cachedExceptions.get(node.getExceptionKind());
701 assert exception != null;
702
703 StructuredGraph graph = node.graph();
704 FloatingNode exceptionNode = ConstantNode.forConstant(constantReflection.forObject(exception), metaAccess, graph);
705 graph.replaceFixedWithFloating(node, exceptionNode);
706 }
707
708 private void lowerBytecodeExceptionNode(BytecodeExceptionNode node) {
709 if (OmitHotExceptionStacktrace.getValue(node.getOptions())) {
710 throwCachedException(node);
711 return;
712 }
713
714 ForeignCallDescriptor descriptor = RuntimeCalls.runtimeCalls.get(node.getExceptionKind());
715 assert descriptor != null;
716
717 StructuredGraph graph = node.graph();
718 ForeignCallNode foreignCallNode = graph.add(new ForeignCallNode(foreignCalls, descriptor, node.stamp(NodeView.DEFAULT), node.getArguments()));
719 foreignCallNode.setStateAfter(node.stateAfter());
720 graph.replaceFixedWithFixed(node, foreignCallNode);
721 }
722
723 private boolean addReadBarrier(RawLoadNode load) {
724 if (runtime.getVMConfig().useG1GC && load.graph().getGuardsStage() == StructuredGraph.GuardsStage.FIXED_DEOPTS && load.object().getStackKind() == JavaKind.Object &&
725 load.accessKind() == JavaKind.Object && !StampTool.isPointerAlwaysNull(load.object())) {
726 ResolvedJavaType type = StampTool.typeOrNull(load.object());
727 if (type != null && !type.isArray()) {
728 return true;
729 }
730 }
731 return false;
732 }
733
734 private ReadNode createReadVirtualMethod(StructuredGraph graph, ValueNode hub, HotSpotResolvedJavaMethod method, ResolvedJavaType receiverType) {
735 return createReadVirtualMethod(graph, hub, method.vtableEntryOffset(receiverType));
736 }
737
738 private ReadNode createReadVirtualMethod(StructuredGraph graph, ValueNode hub, int vtableEntryOffset) {
739 assert vtableEntryOffset > 0;
|