< 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




  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.compiler.hotspot.meta;
  24 
  25 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset;
  26 import static org.graalvm.compiler.core.common.GraalOptions.AlwaysInlineVTableStubs;
  27 import static org.graalvm.compiler.core.common.GraalOptions.InlineVTableStubs;
  28 import static org.graalvm.compiler.core.common.GraalOptions.OmitHotExceptionStacktrace;
  29 import static org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl.OSR_MIGRATION_END;
  30 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_KLASS_LOCATION;
  31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_LOCATION;
  32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_HANDLE_LOCATION;

  33 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.COMPRESSED_HUB_LOCATION;
  34 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.DISPLACED_MARK_WORD_LOCATION;
  35 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_LOCATION;
  36 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_WRITE_LOCATION;
  37 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_LAYOUT_HELPER_LOCATION;
  38 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION;
  39 import static org.graalvm.word.LocationIdentity.any;
  40 
  41 import java.lang.ref.Reference;
  42 
  43 import org.graalvm.compiler.api.directives.GraalDirectives;

  44 import org.graalvm.compiler.core.common.GraalOptions;
  45 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
  46 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
  47 import org.graalvm.compiler.core.common.type.ObjectStamp;
  48 import org.graalvm.compiler.core.common.type.Stamp;
  49 import org.graalvm.compiler.core.common.type.StampFactory;
  50 import org.graalvm.compiler.core.common.type.StampPair;
  51 import org.graalvm.compiler.debug.DebugHandlersFactory;
  52 import org.graalvm.compiler.debug.GraalError;
  53 import org.graalvm.compiler.graph.Node;
  54 import org.graalvm.compiler.graph.NodeInputList;
  55 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
  56 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
  57 import org.graalvm.compiler.hotspot.nodes.BeginLockScopeNode;
  58 import org.graalvm.compiler.hotspot.nodes.ComputeObjectAddressNode;
  59 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePostWriteBarrier;
  60 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePreWriteBarrier;
  61 import org.graalvm.compiler.hotspot.nodes.G1PostWriteBarrier;
  62 import org.graalvm.compiler.hotspot.nodes.G1PreWriteBarrier;
  63 import org.graalvm.compiler.hotspot.nodes.G1ReferentFieldReadBarrier;


  73 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
  74 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileNode;
  75 import org.graalvm.compiler.hotspot.nodes.type.HotSpotNarrowOopStamp;
  76 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
  77 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
  78 import org.graalvm.compiler.hotspot.replacements.AssertionSnippets;
  79 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
  80 import org.graalvm.compiler.hotspot.replacements.HashCodeSnippets;
  81 import org.graalvm.compiler.hotspot.replacements.HubGetClassNode;
  82 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
  83 import org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets;
  84 import org.graalvm.compiler.hotspot.replacements.KlassLayoutHelperNode;
  85 import org.graalvm.compiler.hotspot.replacements.LoadExceptionObjectSnippets;
  86 import org.graalvm.compiler.hotspot.replacements.MonitorSnippets;
  87 import org.graalvm.compiler.hotspot.replacements.NewObjectSnippets;
  88 import org.graalvm.compiler.hotspot.replacements.StringToBytesSnippets;
  89 import org.graalvm.compiler.hotspot.replacements.UnsafeLoadSnippets;
  90 import org.graalvm.compiler.hotspot.replacements.WriteBarrierSnippets;
  91 import org.graalvm.compiler.hotspot.replacements.aot.ResolveConstantSnippets;
  92 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode;
  93 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopySlowPathNode;
  94 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopySnippets;
  95 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyUnrollNode;
  96 import org.graalvm.compiler.hotspot.replacements.arraycopy.UnsafeArrayCopySnippets;
  97 import org.graalvm.compiler.hotspot.replacements.profiling.ProfileSnippets;
  98 import org.graalvm.compiler.hotspot.word.KlassPointer;
  99 import org.graalvm.compiler.nodes.AbstractBeginNode;
 100 import org.graalvm.compiler.nodes.AbstractDeoptimizeNode;
 101 import org.graalvm.compiler.nodes.CompressionNode.CompressionOp;
 102 import org.graalvm.compiler.nodes.ConstantNode;
 103 import org.graalvm.compiler.nodes.FixedNode;
 104 import org.graalvm.compiler.nodes.Invoke;
 105 import org.graalvm.compiler.nodes.LogicNode;
 106 import org.graalvm.compiler.nodes.LoweredCallTargetNode;
 107 import org.graalvm.compiler.nodes.ParameterNode;
 108 import org.graalvm.compiler.nodes.SafepointNode;
 109 import org.graalvm.compiler.nodes.StartNode;
 110 import org.graalvm.compiler.nodes.StructuredGraph;
 111 import org.graalvm.compiler.nodes.UnwindNode;
 112 import org.graalvm.compiler.nodes.ValueNode;
 113 import org.graalvm.compiler.nodes.calc.AddNode;
 114 import org.graalvm.compiler.nodes.calc.FloatingNode;
 115 import org.graalvm.compiler.nodes.calc.IntegerDivRemNode;
 116 import org.graalvm.compiler.nodes.calc.IsNullNode;


 176 
 177     protected final HotSpotGraalRuntimeProvider runtime;
 178     protected final HotSpotRegistersProvider registers;
 179     protected final HotSpotConstantReflectionProvider constantReflection;
 180 
 181     protected InstanceOfSnippets.Templates instanceofSnippets;
 182     protected NewObjectSnippets.Templates newObjectSnippets;
 183     protected MonitorSnippets.Templates monitorSnippets;
 184     protected WriteBarrierSnippets.Templates writeBarrierSnippets;
 185     protected LoadExceptionObjectSnippets.Templates exceptionObjectSnippets;
 186     protected UnsafeLoadSnippets.Templates unsafeLoadSnippets;
 187     protected AssertionSnippets.Templates assertionSnippets;
 188     protected ArrayCopySnippets.Templates arraycopySnippets;
 189     protected StringToBytesSnippets.Templates stringToBytesSnippets;
 190     protected HashCodeSnippets.Templates hashCodeSnippets;
 191     protected ResolveConstantSnippets.Templates resolveConstantSnippets;
 192     protected ProfileSnippets.Templates profileSnippets;
 193 
 194     public DefaultHotSpotLoweringProvider(HotSpotGraalRuntimeProvider runtime, MetaAccessProvider metaAccess, ForeignCallsProvider foreignCalls, HotSpotRegistersProvider registers,
 195                     HotSpotConstantReflectionProvider constantReflection, TargetDescription target) {
 196         super(metaAccess, foreignCalls, target);
 197         this.runtime = runtime;
 198         this.registers = registers;
 199         this.constantReflection = constantReflection;
 200     }
 201 
 202     @Override
 203     public void initialize(OptionValues options, Iterable<DebugHandlersFactory> factories, HotSpotProviders providers, GraalHotSpotVMConfig config) {
 204         super.initialize(options, factories, runtime, providers, providers.getSnippetReflection());
 205 
 206         assert target == providers.getCodeCache().getTarget();
 207         instanceofSnippets = new InstanceOfSnippets.Templates(options, factories, runtime, providers, target);
 208         newObjectSnippets = new NewObjectSnippets.Templates(options, factories, runtime, providers, target, config);
 209         monitorSnippets = new MonitorSnippets.Templates(options, factories, runtime, providers, target, config.useFastLocking);
 210         writeBarrierSnippets = new WriteBarrierSnippets.Templates(options, factories, runtime, providers, target, config.useCompressedOops ? config.getOopEncoding() : null);
 211         exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(options, factories, providers, target);
 212         unsafeLoadSnippets = new UnsafeLoadSnippets.Templates(options, factories, providers, target);
 213         assertionSnippets = new AssertionSnippets.Templates(options, factories, providers, target);
 214         arraycopySnippets = new ArrayCopySnippets.Templates(options, factories, runtime, providers, target);
 215         stringToBytesSnippets = new StringToBytesSnippets.Templates(options, factories, providers, target);
 216         hashCodeSnippets = new HashCodeSnippets.Templates(options, factories, providers, target);
 217         resolveConstantSnippets = new ResolveConstantSnippets.Templates(options, factories, providers, target);
 218         profileSnippets = new ProfileSnippets.Templates(options, factories, providers, target);
 219         providers.getReplacements().registerSnippetTemplateCache(new UnsafeArrayCopySnippets.Templates(options, factories, providers, target));
 220     }
 221 
 222     public MonitorSnippets.Templates getMonitorSnippets() {
 223         return monitorSnippets;
 224     }
 225 
 226     @Override
 227     public void lower(Node n, LoweringTool tool) {
 228         StructuredGraph graph = (StructuredGraph) n.graph();
 229         if (n instanceof Invoke) {
 230             lowerInvoke((Invoke) n, tool, graph);
 231         } else if (n instanceof LoadMethodNode) {
 232             lowerLoadMethodNode((LoadMethodNode) n);
 233         } else if (n instanceof GetClassNode) {
 234             lowerGetClassNode((GetClassNode) n, tool, graph);
 235         } else if (n instanceof StoreHubNode) {
 236             lowerStoreHubNode((StoreHubNode) n, graph);
 237         } else if (n instanceof OSRStartNode) {
 238             lowerOSRStartNode((OSRStartNode) n);
 239         } else if (n instanceof BytecodeExceptionNode) {


 298                 ConstantNode voidClass = ConstantNode.forConstant(voidClassMirror, tool.getMetaAccess(), graph);
 299                 dynamicNewArrayNode.setVoidClass(voidClass);
 300             }
 301             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 302                 newObjectSnippets.lower(dynamicNewArrayNode, registers, tool);
 303             }
 304         } else if (n instanceof VerifyHeapNode) {
 305             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 306                 newObjectSnippets.lower((VerifyHeapNode) n, registers, tool);
 307             }
 308         } else if (n instanceof RawMonitorEnterNode) {
 309             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 310                 monitorSnippets.lower((RawMonitorEnterNode) n, registers, tool);
 311             }
 312         } else if (n instanceof MonitorExitNode) {
 313             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 314                 monitorSnippets.lower((MonitorExitNode) n, registers, tool);
 315             }
 316         } else if (n instanceof ArrayCopyNode) {
 317             arraycopySnippets.lower((ArrayCopyNode) n, tool);
 318         } else if (n instanceof ArrayCopySlowPathNode) {
 319             arraycopySnippets.lower((ArrayCopySlowPathNode) n, tool);
 320         } else if (n instanceof ArrayCopyUnrollNode) {
 321             arraycopySnippets.lower((ArrayCopyUnrollNode) n, tool);
 322         } else if (n instanceof G1PreWriteBarrier) {
 323             writeBarrierSnippets.lower((G1PreWriteBarrier) n, registers, tool);
 324         } else if (n instanceof G1PostWriteBarrier) {
 325             writeBarrierSnippets.lower((G1PostWriteBarrier) n, registers, tool);
 326         } else if (n instanceof G1ReferentFieldReadBarrier) {
 327             writeBarrierSnippets.lower((G1ReferentFieldReadBarrier) n, registers, tool);
 328         } else if (n instanceof SerialWriteBarrier) {
 329             writeBarrierSnippets.lower((SerialWriteBarrier) n, tool);
 330         } else if (n instanceof SerialArrayRangeWriteBarrier) {
 331             writeBarrierSnippets.lower((SerialArrayRangeWriteBarrier) n, tool);
 332         } else if (n instanceof G1ArrayRangePreWriteBarrier) {
 333             writeBarrierSnippets.lower((G1ArrayRangePreWriteBarrier) n, registers, tool);
 334         } else if (n instanceof G1ArrayRangePostWriteBarrier) {
 335             writeBarrierSnippets.lower((G1ArrayRangePostWriteBarrier) n, registers, tool);
 336         } else if (n instanceof NewMultiArrayNode) {
 337             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 338                 newObjectSnippets.lower((NewMultiArrayNode) n, tool);
 339             }
 340         } else if (n instanceof LoadExceptionObjectNode) {
 341             exceptionObjectSnippets.lower((LoadExceptionObjectNode) n, registers, tool);


 478 
 479                     loweredCallTarget = graph.add(new HotSpotIndirectCallTargetNode(metaspaceMethod, compiledEntry, parameters.toArray(new ValueNode[parameters.size()]), callTarget.returnStamp(),
 480                                     signature, callTarget.targetMethod(),
 481                                     HotSpotCallingConventionType.JavaCall, callTarget.invokeKind()));
 482 
 483                     graph.addBeforeFixed(invoke.asNode(), metaspaceMethod);
 484                     graph.addAfterFixed(metaspaceMethod, compiledEntry);
 485                 }
 486             }
 487 
 488             if (loweredCallTarget == null) {
 489                 loweredCallTarget = graph.add(new HotSpotDirectCallTargetNode(parameters.toArray(new ValueNode[parameters.size()]), callTarget.returnStamp(),
 490                                 signature, callTarget.targetMethod(),
 491                                 HotSpotCallingConventionType.JavaCall,
 492                                 callTarget.invokeKind()));
 493             }
 494             callTarget.replaceAndDelete(loweredCallTarget);
 495         }
 496     }
 497 
 498     @Override
 499     protected Stamp loadStamp(Stamp stamp, JavaKind kind, boolean compressible) {
 500         if (kind == JavaKind.Object && compressible && runtime.getVMConfig().useCompressedOops) {
 501             return HotSpotNarrowOopStamp.compressed((ObjectStamp) stamp, runtime.getVMConfig().getOopEncoding());
 502         }
 503         return super.loadStamp(stamp, kind, compressible);
 504     }
 505 
 506     @Override
 507     protected ValueNode implicitLoadConvert(JavaKind kind, ValueNode value, boolean compressible) {
 508         if (kind == JavaKind.Object && compressible && runtime.getVMConfig().useCompressedOops) {
 509             return new HotSpotCompressionNode(CompressionOp.Uncompress, value, runtime.getVMConfig().getOopEncoding());
 510         }
 511         return super.implicitLoadConvert(kind, value, compressible);



 512     }
 513 
 514     @Override
 515     public ValueNode staticFieldBase(StructuredGraph graph, ResolvedJavaField f) {
 516         HotSpotResolvedJavaField field = (HotSpotResolvedJavaField) f;
 517         JavaConstant base = constantReflection.asJavaClass(field.getDeclaringClass());
 518         return ConstantNode.forConstant(base, metaAccess, graph);
 519     }
 520 
 521     @Override
 522     protected ValueNode implicitStoreConvert(JavaKind kind, ValueNode value, boolean compressible) {
 523         if (kind == JavaKind.Object && compressible && runtime.getVMConfig().useCompressedOops) {
 524             return new HotSpotCompressionNode(CompressionOp.Compress, value, runtime.getVMConfig().getOopEncoding());
 525         }
 526         return super.implicitStoreConvert(kind, value, compressible);
 527     }
 528 
 529     @Override
 530     protected ValueNode createReadArrayComponentHub(StructuredGraph graph, ValueNode arrayHub, FixedNode anchor) {
 531         /*
 532          * Anchor the read of the element klass to the cfg, because it is only valid when arrayClass
 533          * is an object class, which might not be the case in other parts of the compiled method.
 534          */
 535         AddressNode address = createOffsetAddress(graph, arrayHub, runtime.getVMConfig().arrayClassElementOffset);
 536         return graph.unique(new FloatingReadNode(address, OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION, null, KlassPointerStamp.klassNonNull(), AbstractBeginNode.prevBegin(anchor)));
 537     }
 538 
 539     @Override
 540     protected void lowerUnsafeLoadNode(RawLoadNode load, LoweringTool tool) {
 541         StructuredGraph graph = load.graph();
 542         if (!(load instanceof GuardedUnsafeLoadNode) && !graph.getGuardsStage().allowsFloatingGuards() && addReadBarrier(load)) {
 543             unsafeLoadSnippets.lower(load, tool);
 544         } else {
 545             super.lowerUnsafeLoadNode(load, tool);
 546         }
 547     }
 548 
 549     private void lowerLoadMethodNode(LoadMethodNode loadMethodNode) {


 782         return field.offset();
 783     }
 784 
 785     @Override
 786     public int arrayScalingFactor(JavaKind kind) {
 787         if (runtime.getVMConfig().useCompressedOops && kind == JavaKind.Object) {
 788             return super.arrayScalingFactor(JavaKind.Int);
 789         } else {
 790             return super.arrayScalingFactor(kind);
 791         }
 792     }
 793 
 794     @Override
 795     public int arrayBaseOffset(JavaKind kind) {
 796         return getArrayBaseOffset(kind);
 797     }
 798 
 799     @Override
 800     public int arrayLengthOffset() {
 801         return runtime.getVMConfig().arrayOopDescLengthOffset();





 802     }
 803 }


  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.compiler.hotspot.meta;
  24 
  25 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset;
  26 import static org.graalvm.compiler.core.common.GraalOptions.AlwaysInlineVTableStubs;
  27 import static org.graalvm.compiler.core.common.GraalOptions.InlineVTableStubs;
  28 import static org.graalvm.compiler.core.common.GraalOptions.OmitHotExceptionStacktrace;
  29 import static org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl.OSR_MIGRATION_END;
  30 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_KLASS_LOCATION;

  31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_HANDLE_LOCATION;
  32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_LOCATION;
  33 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.COMPRESSED_HUB_LOCATION;
  34 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.DISPLACED_MARK_WORD_LOCATION;
  35 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_LOCATION;
  36 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_WRITE_LOCATION;
  37 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_LAYOUT_HELPER_LOCATION;
  38 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION;
  39 import static org.graalvm.word.LocationIdentity.any;
  40 
  41 import java.lang.ref.Reference;
  42 
  43 import org.graalvm.compiler.api.directives.GraalDirectives;
  44 import org.graalvm.compiler.core.common.CompressEncoding;
  45 import org.graalvm.compiler.core.common.GraalOptions;
  46 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
  47 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
  48 import org.graalvm.compiler.core.common.type.ObjectStamp;
  49 import org.graalvm.compiler.core.common.type.Stamp;
  50 import org.graalvm.compiler.core.common.type.StampFactory;
  51 import org.graalvm.compiler.core.common.type.StampPair;
  52 import org.graalvm.compiler.debug.DebugHandlersFactory;
  53 import org.graalvm.compiler.debug.GraalError;
  54 import org.graalvm.compiler.graph.Node;
  55 import org.graalvm.compiler.graph.NodeInputList;
  56 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
  57 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
  58 import org.graalvm.compiler.hotspot.nodes.BeginLockScopeNode;
  59 import org.graalvm.compiler.hotspot.nodes.ComputeObjectAddressNode;
  60 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePostWriteBarrier;
  61 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePreWriteBarrier;
  62 import org.graalvm.compiler.hotspot.nodes.G1PostWriteBarrier;
  63 import org.graalvm.compiler.hotspot.nodes.G1PreWriteBarrier;
  64 import org.graalvm.compiler.hotspot.nodes.G1ReferentFieldReadBarrier;


  74 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
  75 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileNode;
  76 import org.graalvm.compiler.hotspot.nodes.type.HotSpotNarrowOopStamp;
  77 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
  78 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
  79 import org.graalvm.compiler.hotspot.replacements.AssertionSnippets;
  80 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
  81 import org.graalvm.compiler.hotspot.replacements.HashCodeSnippets;
  82 import org.graalvm.compiler.hotspot.replacements.HubGetClassNode;
  83 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
  84 import org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets;
  85 import org.graalvm.compiler.hotspot.replacements.KlassLayoutHelperNode;
  86 import org.graalvm.compiler.hotspot.replacements.LoadExceptionObjectSnippets;
  87 import org.graalvm.compiler.hotspot.replacements.MonitorSnippets;
  88 import org.graalvm.compiler.hotspot.replacements.NewObjectSnippets;
  89 import org.graalvm.compiler.hotspot.replacements.StringToBytesSnippets;
  90 import org.graalvm.compiler.hotspot.replacements.UnsafeLoadSnippets;
  91 import org.graalvm.compiler.hotspot.replacements.WriteBarrierSnippets;
  92 import org.graalvm.compiler.hotspot.replacements.aot.ResolveConstantSnippets;
  93 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode;
  94 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyWithSlowPathNode;
  95 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopySnippets;


  96 import org.graalvm.compiler.hotspot.replacements.profiling.ProfileSnippets;
  97 import org.graalvm.compiler.hotspot.word.KlassPointer;
  98 import org.graalvm.compiler.nodes.AbstractBeginNode;
  99 import org.graalvm.compiler.nodes.AbstractDeoptimizeNode;
 100 import org.graalvm.compiler.nodes.CompressionNode.CompressionOp;
 101 import org.graalvm.compiler.nodes.ConstantNode;
 102 import org.graalvm.compiler.nodes.FixedNode;
 103 import org.graalvm.compiler.nodes.Invoke;
 104 import org.graalvm.compiler.nodes.LogicNode;
 105 import org.graalvm.compiler.nodes.LoweredCallTargetNode;
 106 import org.graalvm.compiler.nodes.ParameterNode;
 107 import org.graalvm.compiler.nodes.SafepointNode;
 108 import org.graalvm.compiler.nodes.StartNode;
 109 import org.graalvm.compiler.nodes.StructuredGraph;
 110 import org.graalvm.compiler.nodes.UnwindNode;
 111 import org.graalvm.compiler.nodes.ValueNode;
 112 import org.graalvm.compiler.nodes.calc.AddNode;
 113 import org.graalvm.compiler.nodes.calc.FloatingNode;
 114 import org.graalvm.compiler.nodes.calc.IntegerDivRemNode;
 115 import org.graalvm.compiler.nodes.calc.IsNullNode;


 175 
 176     protected final HotSpotGraalRuntimeProvider runtime;
 177     protected final HotSpotRegistersProvider registers;
 178     protected final HotSpotConstantReflectionProvider constantReflection;
 179 
 180     protected InstanceOfSnippets.Templates instanceofSnippets;
 181     protected NewObjectSnippets.Templates newObjectSnippets;
 182     protected MonitorSnippets.Templates monitorSnippets;
 183     protected WriteBarrierSnippets.Templates writeBarrierSnippets;
 184     protected LoadExceptionObjectSnippets.Templates exceptionObjectSnippets;
 185     protected UnsafeLoadSnippets.Templates unsafeLoadSnippets;
 186     protected AssertionSnippets.Templates assertionSnippets;
 187     protected ArrayCopySnippets.Templates arraycopySnippets;
 188     protected StringToBytesSnippets.Templates stringToBytesSnippets;
 189     protected HashCodeSnippets.Templates hashCodeSnippets;
 190     protected ResolveConstantSnippets.Templates resolveConstantSnippets;
 191     protected ProfileSnippets.Templates profileSnippets;
 192 
 193     public DefaultHotSpotLoweringProvider(HotSpotGraalRuntimeProvider runtime, MetaAccessProvider metaAccess, ForeignCallsProvider foreignCalls, HotSpotRegistersProvider registers,
 194                     HotSpotConstantReflectionProvider constantReflection, TargetDescription target) {
 195         super(metaAccess, foreignCalls, target, runtime.getVMConfig().useCompressedOops);
 196         this.runtime = runtime;
 197         this.registers = registers;
 198         this.constantReflection = constantReflection;
 199     }
 200 
 201     @Override
 202     public void initialize(OptionValues options, Iterable<DebugHandlersFactory> factories, HotSpotProviders providers, GraalHotSpotVMConfig config) {
 203         super.initialize(options, factories, runtime, providers, providers.getSnippetReflection());
 204 
 205         assert target == providers.getCodeCache().getTarget();
 206         instanceofSnippets = new InstanceOfSnippets.Templates(options, factories, runtime, providers, target);
 207         newObjectSnippets = new NewObjectSnippets.Templates(options, factories, runtime, providers, target, config);
 208         monitorSnippets = new MonitorSnippets.Templates(options, factories, runtime, providers, target, config.useFastLocking);
 209         writeBarrierSnippets = new WriteBarrierSnippets.Templates(options, factories, runtime, providers, target, config.useCompressedOops ? config.getOopEncoding() : null);
 210         exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(options, factories, providers, target);
 211         unsafeLoadSnippets = new UnsafeLoadSnippets.Templates(options, factories, providers, target);
 212         assertionSnippets = new AssertionSnippets.Templates(options, factories, providers, target);
 213         arraycopySnippets = new ArrayCopySnippets.Templates(options, factories, runtime, providers, target);
 214         stringToBytesSnippets = new StringToBytesSnippets.Templates(options, factories, providers, target);
 215         hashCodeSnippets = new HashCodeSnippets.Templates(options, factories, providers, target);
 216         resolveConstantSnippets = new ResolveConstantSnippets.Templates(options, factories, providers, target);
 217         profileSnippets = new ProfileSnippets.Templates(options, factories, providers, target);

 218     }
 219 
 220     public MonitorSnippets.Templates getMonitorSnippets() {
 221         return monitorSnippets;
 222     }
 223 
 224     @Override
 225     public void lower(Node n, LoweringTool tool) {
 226         StructuredGraph graph = (StructuredGraph) n.graph();
 227         if (n instanceof Invoke) {
 228             lowerInvoke((Invoke) n, tool, graph);
 229         } else if (n instanceof LoadMethodNode) {
 230             lowerLoadMethodNode((LoadMethodNode) n);
 231         } else if (n instanceof GetClassNode) {
 232             lowerGetClassNode((GetClassNode) n, tool, graph);
 233         } else if (n instanceof StoreHubNode) {
 234             lowerStoreHubNode((StoreHubNode) n, graph);
 235         } else if (n instanceof OSRStartNode) {
 236             lowerOSRStartNode((OSRStartNode) n);
 237         } else if (n instanceof BytecodeExceptionNode) {


 296                 ConstantNode voidClass = ConstantNode.forConstant(voidClassMirror, tool.getMetaAccess(), graph);
 297                 dynamicNewArrayNode.setVoidClass(voidClass);
 298             }
 299             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 300                 newObjectSnippets.lower(dynamicNewArrayNode, registers, tool);
 301             }
 302         } else if (n instanceof VerifyHeapNode) {
 303             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 304                 newObjectSnippets.lower((VerifyHeapNode) n, registers, tool);
 305             }
 306         } else if (n instanceof RawMonitorEnterNode) {
 307             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 308                 monitorSnippets.lower((RawMonitorEnterNode) n, registers, tool);
 309             }
 310         } else if (n instanceof MonitorExitNode) {
 311             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 312                 monitorSnippets.lower((MonitorExitNode) n, registers, tool);
 313             }
 314         } else if (n instanceof ArrayCopyNode) {
 315             arraycopySnippets.lower((ArrayCopyNode) n, tool);
 316         } else if (n instanceof ArrayCopyWithSlowPathNode) {
 317             arraycopySnippets.lower((ArrayCopyWithSlowPathNode) n, tool);


 318         } else if (n instanceof G1PreWriteBarrier) {
 319             writeBarrierSnippets.lower((G1PreWriteBarrier) n, registers, tool);
 320         } else if (n instanceof G1PostWriteBarrier) {
 321             writeBarrierSnippets.lower((G1PostWriteBarrier) n, registers, tool);
 322         } else if (n instanceof G1ReferentFieldReadBarrier) {
 323             writeBarrierSnippets.lower((G1ReferentFieldReadBarrier) n, registers, tool);
 324         } else if (n instanceof SerialWriteBarrier) {
 325             writeBarrierSnippets.lower((SerialWriteBarrier) n, tool);
 326         } else if (n instanceof SerialArrayRangeWriteBarrier) {
 327             writeBarrierSnippets.lower((SerialArrayRangeWriteBarrier) n, tool);
 328         } else if (n instanceof G1ArrayRangePreWriteBarrier) {
 329             writeBarrierSnippets.lower((G1ArrayRangePreWriteBarrier) n, registers, tool);
 330         } else if (n instanceof G1ArrayRangePostWriteBarrier) {
 331             writeBarrierSnippets.lower((G1ArrayRangePostWriteBarrier) n, registers, tool);
 332         } else if (n instanceof NewMultiArrayNode) {
 333             if (graph.getGuardsStage().areFrameStatesAtDeopts()) {
 334                 newObjectSnippets.lower((NewMultiArrayNode) n, tool);
 335             }
 336         } else if (n instanceof LoadExceptionObjectNode) {
 337             exceptionObjectSnippets.lower((LoadExceptionObjectNode) n, registers, tool);


 474 
 475                     loweredCallTarget = graph.add(new HotSpotIndirectCallTargetNode(metaspaceMethod, compiledEntry, parameters.toArray(new ValueNode[parameters.size()]), callTarget.returnStamp(),
 476                                     signature, callTarget.targetMethod(),
 477                                     HotSpotCallingConventionType.JavaCall, callTarget.invokeKind()));
 478 
 479                     graph.addBeforeFixed(invoke.asNode(), metaspaceMethod);
 480                     graph.addAfterFixed(metaspaceMethod, compiledEntry);
 481                 }
 482             }
 483 
 484             if (loweredCallTarget == null) {
 485                 loweredCallTarget = graph.add(new HotSpotDirectCallTargetNode(parameters.toArray(new ValueNode[parameters.size()]), callTarget.returnStamp(),
 486                                 signature, callTarget.targetMethod(),
 487                                 HotSpotCallingConventionType.JavaCall,
 488                                 callTarget.invokeKind()));
 489             }
 490             callTarget.replaceAndDelete(loweredCallTarget);
 491         }
 492     }
 493 
 494     private CompressEncoding getOopEncoding() {
 495         return runtime.getVMConfig().getOopEncoding();




 496     }
 497 
 498     @Override
 499     protected Stamp loadCompressedStamp(ObjectStamp stamp) {
 500         return HotSpotNarrowOopStamp.compressed(stamp, getOopEncoding());

 501     }
 502 
 503     @Override
 504     protected ValueNode newCompressionNode(CompressionOp op, ValueNode value) {
 505         return new HotSpotCompressionNode(op, value, getOopEncoding());
 506     }
 507 
 508     @Override
 509     public ValueNode staticFieldBase(StructuredGraph graph, ResolvedJavaField f) {
 510         HotSpotResolvedJavaField field = (HotSpotResolvedJavaField) f;
 511         JavaConstant base = constantReflection.asJavaClass(field.getDeclaringClass());
 512         return ConstantNode.forConstant(base, metaAccess, graph);
 513     }
 514 
 515     @Override








 516     protected ValueNode createReadArrayComponentHub(StructuredGraph graph, ValueNode arrayHub, FixedNode anchor) {
 517         /*
 518          * Anchor the read of the element klass to the cfg, because it is only valid when arrayClass
 519          * is an object class, which might not be the case in other parts of the compiled method.
 520          */
 521         AddressNode address = createOffsetAddress(graph, arrayHub, runtime.getVMConfig().arrayClassElementOffset);
 522         return graph.unique(new FloatingReadNode(address, OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION, null, KlassPointerStamp.klassNonNull(), AbstractBeginNode.prevBegin(anchor)));
 523     }
 524 
 525     @Override
 526     protected void lowerUnsafeLoadNode(RawLoadNode load, LoweringTool tool) {
 527         StructuredGraph graph = load.graph();
 528         if (!(load instanceof GuardedUnsafeLoadNode) && !graph.getGuardsStage().allowsFloatingGuards() && addReadBarrier(load)) {
 529             unsafeLoadSnippets.lower(load, tool);
 530         } else {
 531             super.lowerUnsafeLoadNode(load, tool);
 532         }
 533     }
 534 
 535     private void lowerLoadMethodNode(LoadMethodNode loadMethodNode) {


 768         return field.offset();
 769     }
 770 
 771     @Override
 772     public int arrayScalingFactor(JavaKind kind) {
 773         if (runtime.getVMConfig().useCompressedOops && kind == JavaKind.Object) {
 774             return super.arrayScalingFactor(JavaKind.Int);
 775         } else {
 776             return super.arrayScalingFactor(kind);
 777         }
 778     }
 779 
 780     @Override
 781     public int arrayBaseOffset(JavaKind kind) {
 782         return getArrayBaseOffset(kind);
 783     }
 784 
 785     @Override
 786     public int arrayLengthOffset() {
 787         return runtime.getVMConfig().arrayOopDescLengthOffset();
 788     }
 789 
 790     @Override
 791     protected final JavaKind getStorageKind(ResolvedJavaField field) {
 792         return field.getJavaKind();
 793     }
 794 }
< prev index next >