3232import jdk .graal .compiler .core .common .LibGraalSupport ;
3333import jdk .graal .compiler .core .common .spi .ConstantFieldProvider ;
3434import jdk .graal .compiler .debug .Assertions ;
35- import jdk .graal .compiler .debug .DebugContext ;
36- import jdk .graal .compiler .graph .Node ;
3735import jdk .graal .compiler .hotspot .meta .HotSpotGraalConstantFieldProvider ;
3836import jdk .graal .compiler .hotspot .meta .HotSpotHostForeignCallsProvider ;
3937import jdk .graal .compiler .hotspot .meta .HotSpotIdentityHashCodeProvider ;
4846import jdk .graal .compiler .hotspot .nodes .HotSpotCompressionNode ;
4947import jdk .graal .compiler .hotspot .replacements .HotSpotReplacementsUtil ;
5048import jdk .graal .compiler .hotspot .word .HotSpotWordTypes ;
51- import jdk .graal .compiler .nodes .FixedWithNextNode ;
5249import jdk .graal .compiler .nodes .NodeView ;
5350import jdk .graal .compiler .nodes .ValueNode ;
54- import jdk .graal .compiler .nodes .extended .ArrayRangeWrite ;
5551import jdk .graal .compiler .nodes .gc .BarrierSet ;
5652import jdk .graal .compiler .nodes .gc .CardTableBarrierSet ;
5753import jdk .graal .compiler .nodes .gc .G1BarrierSet ;
5854import jdk .graal .compiler .nodes .gc .NoBarrierSet ;
5955import jdk .graal .compiler .nodes .graphbuilderconf .GraphBuilderConfiguration ;
6056import jdk .graal .compiler .nodes .graphbuilderconf .GraphBuilderConfiguration .Plugins ;
61- import jdk .graal .compiler .nodes .java .AbstractNewObjectNode ;
6257import jdk .graal .compiler .nodes .loop .LoopsDataProviderImpl ;
63- import jdk .graal .compiler .nodes .memory .FixedAccessNode ;
6458import jdk .graal .compiler .nodes .spi .IdentityHashCodeProvider ;
6559import jdk .graal .compiler .nodes .spi .LoopsDataProvider ;
6660import jdk .graal .compiler .nodes .spi .Replacements ;
@@ -286,7 +280,7 @@ protected abstract HotSpotLoweringProvider createLowerer(HotSpotGraalRuntimeProv
286280 protected abstract HotSpotHostForeignCallsProvider createForeignCalls (HotSpotJVMCIRuntime jvmciRuntime , HotSpotGraalRuntimeProvider graalRuntime , MetaAccessProvider metaAccess ,
287281 HotSpotCodeCacheProvider codeCache , HotSpotWordTypes wordTypes , Value [] nativeABICallerSaveRegisters );
288282
289- private BarrierSet createBarrierSet (GraalHotSpotVMConfig config , MetaAccessProvider metaAccess ) {
283+ private static BarrierSet createBarrierSet (GraalHotSpotVMConfig config , MetaAccessProvider metaAccess ) {
290284 boolean useDeferredInitBarriers = config .useDeferredInitBarriers ;
291285 ResolvedJavaType objectArrayType = metaAccess .lookupJavaType (Object [].class );
292286 ResolvedJavaField referentField = HotSpotReplacementsUtil .referentField (metaAccess );
@@ -297,80 +291,26 @@ private BarrierSet createBarrierSet(GraalHotSpotVMConfig config, MetaAccessProvi
297291 } else if (config .gc == HotSpotGraalRuntime .HotSpotGC .Epsilon ) {
298292 return new NoBarrierSet ();
299293 } else if (config .useG1GC ()) {
300- return new G1BarrierSet (objectArrayType , referentField ) {
301- @ Override
302- protected boolean writeRequiresPostBarrier (FixedAccessNode node , ValueNode writtenValue ) {
303- if (!super .writeRequiresPostBarrier (node , writtenValue )) {
304- return false ;
305- }
306- return !useDeferredInitBarriers || !isWriteToNewObject (node );
307- }
308-
309- @ Override
310- protected boolean arrayRangeWriteRequiresPostBarrier (ArrayRangeWrite write ) {
311- if (!super .arrayRangeWriteRequiresPostBarrier (write )) {
312- return false ;
313- }
314- return !useDeferredInitBarriers || !isWriteToNewObject (write .asFixedWithNextNode (), write .getAddress ().getBase ());
315- }
316-
317- @ Override
318- protected ValueNode maybeUncompressExpectedValue (ValueNode value ) {
319- if (value != null && (value .stamp (NodeView .DEFAULT ) instanceof NarrowOopStamp )) {
320- return HotSpotCompressionNode .uncompress (value .graph (), value , config .getOopEncoding ());
321- }
322- return value ;
323- }
324- };
294+ return new HotSpotG1BarrierSet (objectArrayType , referentField , useDeferredInitBarriers , config );
325295 } else {
326- return new CardTableBarrierSet (objectArrayType ) {
327- @ Override
328- protected boolean writeRequiresBarrier (FixedAccessNode node , ValueNode writtenValue ) {
329- if (!super .writeRequiresBarrier (node , writtenValue )) {
330- return false ;
331- }
332- return !useDeferredInitBarriers || !isWriteToNewObject (node );
333- }
334-
335- @ Override
336- protected boolean arrayRangeWriteRequiresBarrier (ArrayRangeWrite write ) {
337- if (!super .arrayRangeWriteRequiresBarrier (write )) {
338- return false ;
339- }
340- return !useDeferredInitBarriers || !isWriteToNewObject (write .asFixedWithNextNode (), write .getAddress ().getBase ());
341- }
342- };
296+ return new CardTableBarrierSet (objectArrayType , useDeferredInitBarriers );
343297 }
344298 }
345299
346- /**
347- * For initializing writes, the last allocation executed by the JVM is guaranteed to be
348- * automatically card marked so it's safe to skip the card mark in the emitted code.
349- */
350- protected boolean isWriteToNewObject (FixedAccessNode node ) {
351- if (!node .getLocationIdentity ().isInit ()) {
352- return false ;
300+ private static class HotSpotG1BarrierSet extends G1BarrierSet {
301+ private final GraalHotSpotVMConfig config ;
302+
303+ HotSpotG1BarrierSet (ResolvedJavaType objectArrayType , ResolvedJavaField referentField , boolean useDeferredInitBarriers , GraalHotSpotVMConfig config ) {
304+ super (objectArrayType , referentField , useDeferredInitBarriers );
305+ this .config = config ;
353306 }
354- // This is only allowed for the last allocation in sequence
355- return isWriteToNewObject (node , node .getAddress ().getBase ());
356- }
357307
358- protected boolean isWriteToNewObject (FixedWithNextNode node , ValueNode base ) {
359- if (base instanceof AbstractNewObjectNode ) {
360- Node pred = node .predecessor ();
361- while (pred != null ) {
362- if (pred == base ) {
363- node .getDebug ().log (DebugContext .INFO_LEVEL , "Deferred barrier for %s with base %s" , node , base );
364- return true ;
365- }
366- if (pred instanceof AbstractNewObjectNode ) {
367- node .getDebug ().log (DebugContext .INFO_LEVEL , "Disallowed deferred barrier for %s because %s was last allocation instead of %s" , node , pred , base );
368- return false ;
369- }
370- pred = pred .predecessor ();
308+ @ Override
309+ protected ValueNode maybeUncompressExpectedValue (ValueNode value ) {
310+ if (value != null && (value .stamp (NodeView .DEFAULT ) instanceof NarrowOopStamp )) {
311+ return HotSpotCompressionNode .uncompress (value .graph (), value , config .getOopEncoding ());
371312 }
313+ return value ;
372314 }
373- node .getDebug ().log (DebugContext .INFO_LEVEL , "Unable to find allocation for deferred barrier for %s with base %s" , node , base );
374- return false ;
375315 }
376316}
0 commit comments