Skip to content

Commit 3618e96

Browse files
author
Roman Kennke
committed
Pass-thru ShenandoahLoadRefBarrier and ShenandoahSATBBarrier flags from HotSpot
1 parent db5c5a1 commit 3618e96

File tree

5 files changed

+18
-10
lines changed

5 files changed

+18
-10
lines changed

compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/GraalHotSpotVMConfig.java

+2
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ public boolean inlineNotifyAll() {
197197
public final boolean useG1GC = getFlag("UseG1GC", Boolean.class);
198198
public final boolean useCMSGC = getFlag("UseConcMarkSweepGC", Boolean.class, false, JDK < 14); // JDK-8231559
199199
public final boolean useShenandoahGC = getFlag("UseShenandoahGC", Boolean.class);
200+
public final boolean shenandoahLoadRefBarrier = getFlag("ShenandoahLoadRefBarrier", Boolean.class);
201+
public final boolean shenandoahSATBBarrier = getFlag("ShenandoahSATBBarrier", Boolean.class);
200202

201203
public final int allocatePrefetchStyle = getFlag("AllocatePrefetchStyle", Integer.class);
202204
public final int allocatePrefetchInstr = getFlag("AllocatePrefetchInstr", Integer.class);

compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntime.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ public enum HotSpotGC {
254254
Parallel(true, JDK >= 11, "UseParallelGC", true, "UseParallelOldGC", JDK < 15, "UseParNewGC", JDK < 10),
255255
CMS(true, JDK >= 11 && JDK <= 14, "UseConcMarkSweepGC", JDK < 14),
256256
G1(true, JDK >= 11, "UseG1GC", true),
257-
Shenandoah(true, JDK >= 11, "UseShenandoahGC", true),
257+
Shenandoah(true, JDK >= 11, "UseShenandoahGC", JDK >= 11),
258258

259259
// Unsupported GCs
260260
Epsilon(false, JDK >= 11, "UseEpsilonGC", JDK >= 11),

compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotPlatformConfigurationProvider.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ protected boolean writeRequiresPostBarrier(FixedAccessNode node, ValueNode writt
7676
}
7777
};
7878
} else if (config.useShenandoahGC) {
79-
return new ShenandoahBarrierSet(config, objectArrayType, referentField);
79+
return new ShenandoahBarrierSet(config.shenandoahSATBBarrier, config.shenandoahLoadRefBarrier, objectArrayType, referentField);
8080
} else {
8181
return new CardTableBarrierSet(objectArrayType) {
8282
@Override

compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/gc/ShenandoahBarrierSet.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,14 @@
5151
public class ShenandoahBarrierSet implements BarrierSet {
5252
private final ResolvedJavaType objectArrayType;
5353
private final ResolvedJavaField referentField;
54+
private final boolean useLRB;
55+
private final boolean useSATB;
5456

55-
public ShenandoahBarrierSet(GraalHotSpotVMConfig config, ResolvedJavaType objectArrayType, ResolvedJavaField referentField) {
57+
public ShenandoahBarrierSet(boolean useSATB, boolean useLRB, ResolvedJavaType objectArrayType, ResolvedJavaField referentField) {
5658
this.objectArrayType = objectArrayType;
5759
this.referentField = referentField;
60+
this.useSATB = useSATB;
61+
this.useLRB = useLRB;
5862
}
5963

6064
@Override
@@ -68,18 +72,20 @@ public void addBarriers(FixedAccessNode n) {
6872
LoweredAtomicReadAndWriteNode atomic = (LoweredAtomicReadAndWriteNode) n;
6973
addWriteBarriers(atomic, atomic.getNewValue(), null, true, atomic.getNullCheck());
7074
} else if (n instanceof AbstractCompareAndSwapNode) {
75+
GraalError.unimplemented();
7176
AbstractCompareAndSwapNode cmpSwap = (AbstractCompareAndSwapNode) n;
7277
addWriteBarriers(cmpSwap, cmpSwap.getNewValue(), cmpSwap.getExpectedValue(), false, false);
7378
} else if (n instanceof ArrayRangeWrite) {
79+
GraalError.unimplemented();
7480
addArrayRangeBarriers((ArrayRangeWrite) n);
7581
} else {
7682
GraalError.guarantee(n.getBarrierType() == BarrierType.NONE, "missed a node that requires a GC barrier: %s", n.getClass());
7783
}
7884
}
7985

80-
private static void addReadNodeBarriers(ReadNode node) {
86+
private void addReadNodeBarriers(ReadNode node) {
8187
ValueNode value = node;
82-
if (node.getBarrierType() != BarrierType.NONE) {
88+
if (node.getBarrierType() != BarrierType.NONE && useLRB) {
8389
StructuredGraph graph = node.graph();
8490
ShenandoahLoadReferenceBarrier lrb = graph.add(new ShenandoahLoadReferenceBarrier(node));
8591
value = lrb;
@@ -105,7 +111,7 @@ private void addWriteBarriers(FixedAccessNode node, ValueNode writtenValue, Valu
105111
if (isObjectValue(writtenValue)) {
106112
StructuredGraph graph = node.graph();
107113
boolean init = node.getLocationIdentity().isInit();
108-
if (!init) {
114+
if (!init && useSATB) {
109115
// The pre barrier does nothing if the value being read is null, so it can
110116
// be explicitly skipped when this is an initializing store.
111117
addPreWriteBarrier(node, node.getAddress(), expectedValue, doLoad, nullCheck, graph);

compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/gc/ShenandoahBarrierSnippets.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,10 @@ public void shenandoahArrayRangePreWriteBarrier(AddressNode.Address address, int
172172
public Object shenandoahLoadReferenceBarrier(Object value) {
173173
Word thread = getThread();
174174
verifyOop(value);
175-
byte gcStateValue = thread.readByte(gcStateOffset(), GC_STATE_LOCATION);
176-
if (probability(NOT_FREQUENT_PROBABILITY, (gcStateValue & HAS_FORWORDED) != (byte) 0)) {
177-
return shenandoahLoadReferenceBarrierStub(value);
178-
}
175+
// byte gcStateValue = thread.readByte(gcStateOffset(), GC_STATE_LOCATION);
176+
// if (probability(NOT_FREQUENT_PROBABILITY, (gcStateValue & HAS_FORWORDED) != (byte) 0)) {
177+
// return shenandoahLoadReferenceBarrierStub(value);
178+
// }
179179
return value;
180180
}
181181

0 commit comments

Comments
 (0)