96 import org.graalvm.compiler.graph.iterators.NodeIterable;
97 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
98 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
99 import org.graalvm.compiler.hotspot.meta.HotSpotRegistersProvider;
100 import org.graalvm.compiler.hotspot.nodes.CurrentLockNode;
101 import org.graalvm.compiler.hotspot.nodes.FastAcquireBiasedLockNode;
102 import org.graalvm.compiler.hotspot.nodes.MonitorCounterNode;
103 import org.graalvm.compiler.hotspot.word.KlassPointer;
104 import org.graalvm.compiler.nodes.BreakpointNode;
105 import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind;
106 import org.graalvm.compiler.nodes.ConstantNode;
107 import org.graalvm.compiler.nodes.DeoptimizeNode;
108 import org.graalvm.compiler.nodes.FrameState;
109 import org.graalvm.compiler.nodes.InvokeNode;
110 import org.graalvm.compiler.nodes.NamedLocationIdentity;
111 import org.graalvm.compiler.nodes.NodeView;
112 import org.graalvm.compiler.nodes.ReturnNode;
113 import org.graalvm.compiler.nodes.StructuredGraph;
114 import org.graalvm.compiler.nodes.ValueNode;
115 import org.graalvm.compiler.nodes.debug.DynamicCounterNode;
116 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
117 import org.graalvm.compiler.nodes.extended.MembarNode;
118 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
119 import org.graalvm.compiler.nodes.java.MonitorExitNode;
120 import org.graalvm.compiler.nodes.java.RawMonitorEnterNode;
121 import org.graalvm.compiler.nodes.spi.LoweringTool;
122 import org.graalvm.compiler.nodes.type.StampTool;
123 import org.graalvm.compiler.options.OptionValues;
124 import org.graalvm.compiler.phases.common.inlining.InliningUtil;
125 import org.graalvm.compiler.replacements.SnippetCounter;
126 import org.graalvm.compiler.replacements.SnippetTemplate.AbstractTemplates;
127 import org.graalvm.compiler.replacements.SnippetTemplate.Arguments;
128 import org.graalvm.compiler.replacements.SnippetTemplate.SnippetInfo;
129 import org.graalvm.compiler.replacements.Snippets;
130 import org.graalvm.compiler.word.Word;
131 import jdk.internal.vm.compiler.word.LocationIdentity;
132 import jdk.internal.vm.compiler.word.Pointer;
133 import jdk.internal.vm.compiler.word.WordBase;
134 import jdk.internal.vm.compiler.word.WordFactory;
135
457 counters.inflatedCas.inc();
458 return true;
459 } else {
460 traceObject(trace, "+lock{stub:inflated:failed-cas}", object, true);
461 counters.inflatedFailedCas.inc();
462 }
463 } else {
464 traceObject(trace, "+lock{stub:inflated:owned}", object, true);
465 counters.inflatedOwned.inc();
466 }
467 return false;
468 }
469
470 /**
471 * Calls straight out to the monitorenter stub.
472 */
473 @Snippet
474 public static void monitorenterStub(Object object, @ConstantParameter int lockDepth, @ConstantParameter boolean trace) {
475 verifyOop(object);
476 incCounter();
477 if (object == null) {
478 DeoptimizeNode.deopt(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.NullCheckException);
479 }
480 // BeginLockScope nodes do not read from object so a use of object
481 // cannot float about the null check above
482 final Word lock = beginLockScope(lockDepth);
483 traceObject(trace, "+lock{stub}", object, true);
484 monitorenterStubC(MONITORENTER, object, lock);
485 }
486
487 @Snippet
488 public static void monitorexit(Object object, @ConstantParameter int lockDepth, @ConstantParameter Register threadRegister, @ConstantParameter boolean trace,
489 @ConstantParameter Counters counters) {
490 trace(trace, " object: 0x%016lx\n", Word.objectToTrackedPointer(object));
491 final Word mark = loadWordFromObject(object, markOffset(INJECTED_VMCONFIG));
492 if (useBiasedLocking(INJECTED_VMCONFIG)) {
493 // Check for biased locking unlock case, which is a no-op
494 // Note: we do not have to check the thread ID for two reasons.
495 // First, the interpreter checks for IllegalMonitorStateException at
496 // a higher level. Second, if the bias was revoked while we held the
497 // lock, the object could not be rebiased toward another thread, so
|
96 import org.graalvm.compiler.graph.iterators.NodeIterable;
97 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
98 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
99 import org.graalvm.compiler.hotspot.meta.HotSpotRegistersProvider;
100 import org.graalvm.compiler.hotspot.nodes.CurrentLockNode;
101 import org.graalvm.compiler.hotspot.nodes.FastAcquireBiasedLockNode;
102 import org.graalvm.compiler.hotspot.nodes.MonitorCounterNode;
103 import org.graalvm.compiler.hotspot.word.KlassPointer;
104 import org.graalvm.compiler.nodes.BreakpointNode;
105 import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind;
106 import org.graalvm.compiler.nodes.ConstantNode;
107 import org.graalvm.compiler.nodes.DeoptimizeNode;
108 import org.graalvm.compiler.nodes.FrameState;
109 import org.graalvm.compiler.nodes.InvokeNode;
110 import org.graalvm.compiler.nodes.NamedLocationIdentity;
111 import org.graalvm.compiler.nodes.NodeView;
112 import org.graalvm.compiler.nodes.ReturnNode;
113 import org.graalvm.compiler.nodes.StructuredGraph;
114 import org.graalvm.compiler.nodes.ValueNode;
115 import org.graalvm.compiler.nodes.debug.DynamicCounterNode;
116 import org.graalvm.compiler.nodes.extended.BranchProbabilityNode;
117 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
118 import org.graalvm.compiler.nodes.extended.MembarNode;
119 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
120 import org.graalvm.compiler.nodes.java.MonitorExitNode;
121 import org.graalvm.compiler.nodes.java.RawMonitorEnterNode;
122 import org.graalvm.compiler.nodes.spi.LoweringTool;
123 import org.graalvm.compiler.nodes.type.StampTool;
124 import org.graalvm.compiler.options.OptionValues;
125 import org.graalvm.compiler.phases.common.inlining.InliningUtil;
126 import org.graalvm.compiler.replacements.SnippetCounter;
127 import org.graalvm.compiler.replacements.SnippetTemplate.AbstractTemplates;
128 import org.graalvm.compiler.replacements.SnippetTemplate.Arguments;
129 import org.graalvm.compiler.replacements.SnippetTemplate.SnippetInfo;
130 import org.graalvm.compiler.replacements.Snippets;
131 import org.graalvm.compiler.word.Word;
132 import jdk.internal.vm.compiler.word.LocationIdentity;
133 import jdk.internal.vm.compiler.word.Pointer;
134 import jdk.internal.vm.compiler.word.WordBase;
135 import jdk.internal.vm.compiler.word.WordFactory;
136
458 counters.inflatedCas.inc();
459 return true;
460 } else {
461 traceObject(trace, "+lock{stub:inflated:failed-cas}", object, true);
462 counters.inflatedFailedCas.inc();
463 }
464 } else {
465 traceObject(trace, "+lock{stub:inflated:owned}", object, true);
466 counters.inflatedOwned.inc();
467 }
468 return false;
469 }
470
471 /**
472 * Calls straight out to the monitorenter stub.
473 */
474 @Snippet
475 public static void monitorenterStub(Object object, @ConstantParameter int lockDepth, @ConstantParameter boolean trace) {
476 verifyOop(object);
477 incCounter();
478 if (BranchProbabilityNode.probability(BranchProbabilityNode.DEOPT_PROBABILITY, object == null)) {
479 DeoptimizeNode.deopt(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.NullCheckException);
480 }
481 // BeginLockScope nodes do not read from object so a use of object
482 // cannot float about the null check above
483 final Word lock = beginLockScope(lockDepth);
484 traceObject(trace, "+lock{stub}", object, true);
485 monitorenterStubC(MONITORENTER, object, lock);
486 }
487
488 @Snippet
489 public static void monitorexit(Object object, @ConstantParameter int lockDepth, @ConstantParameter Register threadRegister, @ConstantParameter boolean trace,
490 @ConstantParameter Counters counters) {
491 trace(trace, " object: 0x%016lx\n", Word.objectToTrackedPointer(object));
492 final Word mark = loadWordFromObject(object, markOffset(INJECTED_VMCONFIG));
493 if (useBiasedLocking(INJECTED_VMCONFIG)) {
494 // Check for biased locking unlock case, which is a no-op
495 // Note: we do not have to check the thread ID for two reasons.
496 // First, the interpreter checks for IllegalMonitorStateException at
497 // a higher level. Second, if the bias was revoked while we held the
498 // lock, the object could not be rebiased toward another thread, so
|