< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java

Print this page
rev 56282 : [mq]: graal


  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;


< prev index next >