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 }
|