< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/MonitorSnippets.java

Print this page
rev 56282 : [mq]: graal


  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


< prev index next >