Skip to content

Commit 00b5e30

Browse files
author
Roman Kennke
committed
Implement Shenandoah SATB barriers
1 parent f055ab2 commit 00b5e30

File tree

11 files changed

+855
-14
lines changed

11 files changed

+855
-14
lines changed

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,26 @@ private static String markWordField(String simpleName) {
633633
}
634634
}
635635

636+
public final int shenandoahSATBQueueMarkingOffset;
637+
public final int shenandoahSATBQueueIndexOffset;
638+
public final int shenandoahSATBQueueBufferOffset;
639+
{
640+
if (JDK <= 8) {
641+
int satbMarkQueueBufferOffset = getFieldOffset("PtrQueue::_buf", Integer.class, "void**");
642+
int satbMarkQueueIndexOffset = getFieldOffset("PtrQueue::_index", Integer.class, "size_t");
643+
int satbMarkQueueActiveOffset = getFieldOffset("PtrQueue::_active", Integer.class, "bool");
644+
int javaThreadSatbMarkQueueOffset = getFieldOffset("JavaThread::_satb_mark_queue", Integer.class);
645+
646+
shenandoahSATBQueueMarkingOffset = javaThreadSatbMarkQueueOffset + satbMarkQueueActiveOffset;
647+
shenandoahSATBQueueIndexOffset = javaThreadSatbMarkQueueOffset + satbMarkQueueIndexOffset;
648+
shenandoahSATBQueueBufferOffset = javaThreadSatbMarkQueueOffset + satbMarkQueueBufferOffset;
649+
} else {
650+
shenandoahSATBQueueMarkingOffset = getConstant("ShenandoahThreadLocalData::satb_mark_queue_active_offset", Integer.class);
651+
shenandoahSATBQueueIndexOffset = getConstant("ShenandoahThreadLocalData::satb_mark_queue_index_offset", Integer.class);
652+
shenandoahSATBQueueBufferOffset = getConstant("ShenandoahThreadLocalData::satb_mark_queue_buffer_offset", Integer.class);
653+
}
654+
}
655+
636656
public final int klassOffset = getFieldValue("java_lang_Class::_klass_offset", Integer.class, "int");
637657
public final int arrayKlassOffset = getFieldValue("java_lang_Class::_array_klass_offset", Integer.class, "int");
638658

@@ -835,6 +855,8 @@ private boolean checkNullAllocationStubs() {
835855
public final long writeBarrierPostAddress = getAddress("JVMCIRuntime::write_barrier_post");
836856
public final long validateObject = getAddress("JVMCIRuntime::validate_object");
837857

858+
public final long shenandoahConcmarkBarrierAddress = getAddress("JVMCIRuntime::shenandoah_concmark_barrier");
859+
838860
public final long testDeoptimizeCallInt = getAddress("JVMCIRuntime::test_deoptimize_call_int");
839861

840862
public final long registerFinalizerAddress = getAddress("SharedRuntime::register_finalizer");

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets;
7979
import org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets;
8080
import org.graalvm.compiler.hotspot.replacements.HotSpotSerialWriteBarrierSnippets;
81+
import org.graalvm.compiler.hotspot.replacements.HotSpotShenandoahBarrierSnippets;
8182
import org.graalvm.compiler.hotspot.replacements.HubGetClassNode;
8283
import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
8384
import org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets;
@@ -137,6 +138,9 @@
137138
import org.graalvm.compiler.nodes.gc.G1ReferentFieldReadBarrier;
138139
import org.graalvm.compiler.nodes.gc.SerialArrayRangeWriteBarrier;
139140
import org.graalvm.compiler.nodes.gc.SerialWriteBarrier;
141+
import org.graalvm.compiler.nodes.gc.ShenandoahArrayRangePreWriteBarrier;
142+
import org.graalvm.compiler.nodes.gc.ShenandoahPreWriteBarrier;
143+
import org.graalvm.compiler.nodes.gc.ShenandoahReferentFieldReadBarrier;
140144
import org.graalvm.compiler.nodes.java.ClassIsAssignableFromNode;
141145
import org.graalvm.compiler.nodes.java.DynamicNewArrayNode;
142146
import org.graalvm.compiler.nodes.java.DynamicNewInstanceNode;
@@ -196,6 +200,7 @@ public abstract class DefaultHotSpotLoweringProvider extends DefaultJavaLowering
196200
protected MonitorSnippets.Templates monitorSnippets;
197201
protected HotSpotSerialWriteBarrierSnippets.Templates serialWriteBarrierSnippets;
198202
protected HotSpotG1WriteBarrierSnippets.Templates g1WriteBarrierSnippets;
203+
protected HotSpotShenandoahBarrierSnippets.Templates shenandoahBarrierSnippets;
199204
protected LoadExceptionObjectSnippets.Templates exceptionObjectSnippets;
200205
protected AssertionSnippets.Templates assertionSnippets;
201206
protected ArrayCopySnippets.Templates arraycopySnippets;
@@ -226,6 +231,7 @@ public void initialize(OptionValues options, Iterable<DebugHandlersFactory> fact
226231
allocationSnippets = new HotSpotAllocationSnippets.Templates(options, factories, runtime, providers, target, config);
227232
monitorSnippets = new MonitorSnippets.Templates(options, factories, runtime, providers, target, config.useFastLocking);
228233
g1WriteBarrierSnippets = new HotSpotG1WriteBarrierSnippets.Templates(options, factories, runtime, providers, target, config);
234+
shenandoahBarrierSnippets = new HotSpotShenandoahBarrierSnippets.Templates(options, factories, runtime, providers, target, config);
229235
serialWriteBarrierSnippets = new HotSpotSerialWriteBarrierSnippets.Templates(options, factories, runtime, providers, target, config);
230236
exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(options, factories, providers, target);
231237
assertionSnippets = new AssertionSnippets.Templates(options, factories, providers, target);
@@ -361,6 +367,16 @@ public void lower(Node n, LoweringTool tool) {
361367
serialWriteBarrierSnippets.lower((SerialWriteBarrier) n, tool);
362368
} else if (n instanceof SerialArrayRangeWriteBarrier) {
363369
serialWriteBarrierSnippets.lower((SerialArrayRangeWriteBarrier) n, tool);
370+
} else if (n instanceof ShenandoahArrayRangePreWriteBarrier) {
371+
shenandoahBarrierSnippets.lower((ShenandoahArrayRangePreWriteBarrier) n, tool);
372+
} else if (n instanceof ShenandoahPreWriteBarrier) {
373+
shenandoahBarrierSnippets.lower((ShenandoahPreWriteBarrier) n, tool);
374+
} else if (n instanceof ShenandoahReferentFieldReadBarrier) {
375+
shenandoahBarrierSnippets.lower((ShenandoahReferentFieldReadBarrier) n, tool);
376+
} else if (n instanceof SerialWriteBarrier) {
377+
serialWriteBarrierSnippets.lower((SerialWriteBarrier) n, tool);
378+
} else if (n instanceof SerialArrayRangeWriteBarrier) {
379+
serialWriteBarrierSnippets.lower((SerialArrayRangeWriteBarrier) n, tool);
364380
} else if (n instanceof G1ArrayRangePreWriteBarrier) {
365381
g1WriteBarrierSnippets.lower((G1ArrayRangePreWriteBarrier) n, tool);
366382
} else if (n instanceof G1ArrayRangePostWriteBarrier) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
import static org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets.G1WBPOSTCALL;
8484
import static org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets.G1WBPRECALL;
8585
import static org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets.VALIDATE_OBJECT;
86+
import static org.graalvm.compiler.hotspot.replacements.HotSpotShenandoahBarrierSnippets.SHENANDOAHWBPRECALL;
8687
import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.MARK_WORD_LOCATION;
8788
import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.TLAB_END_LOCATION;
8889
import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.TLAB_TOP_LOCATION;
@@ -353,6 +354,7 @@ public void initialize(HotSpotProviders providers, OptionValues options) {
353354
linkForeignCall(options, providers, G1WBPRECALL, c.writeBarrierPreAddress, PREPEND_THREAD, LEAF_NO_VZERO, REEXECUTABLE, NO_LOCATIONS);
354355
linkForeignCall(options, providers, G1WBPOSTCALL, c.writeBarrierPostAddress, PREPEND_THREAD, LEAF_NO_VZERO, REEXECUTABLE, NO_LOCATIONS);
355356
linkForeignCall(options, providers, VALIDATE_OBJECT, c.validateObject, PREPEND_THREAD, LEAF_NO_VZERO, REEXECUTABLE, NO_LOCATIONS);
357+
linkForeignCall(options, providers, SHENANDOAHWBPRECALL, c.shenandoahConcmarkBarrierAddress, PREPEND_THREAD, LEAF_NO_VZERO, REEXECUTABLE, NO_LOCATIONS);
356358

357359
if (GeneratePIC.getValue(options)) {
358360
registerForeignCall(WRONG_METHOD_HANDLER, c.handleWrongMethodStub, NativeCall, LEAF_NO_VZERO, REEXECUTABLE, NO_LOCATIONS);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ public BarrierSet getBarrierSet() {
6464
private BarrierSet createBarrierSet(GraalHotSpotVMConfig config, MetaAccessProvider metaAccess) {
6565
boolean useDeferredInitBarriers = config.useDeferredInitBarriers;
6666
ResolvedJavaType objectArrayType = metaAccess.lookupJavaType(Object[].class);
67+
ResolvedJavaField referentField = HotSpotReplacementsUtil.referentField(metaAccess);
6768
if (config.useG1GC) {
68-
ResolvedJavaField referentField = HotSpotReplacementsUtil.referentField(metaAccess);
6969
return new G1BarrierSet(objectArrayType, referentField) {
7070
@Override
7171
protected boolean writeRequiresPostBarrier(FixedAccessNode node, ValueNode writtenValue) {
@@ -76,7 +76,7 @@ protected boolean writeRequiresPostBarrier(FixedAccessNode node, ValueNode writt
7676
}
7777
};
7878
} else if (config.useShenandoahGC) {
79-
return new ShenandoahBarrierSet(config);
79+
return new ShenandoahBarrierSet(config, objectArrayType, referentField);
8080
} else {
8181
return new CardTableBarrierSet(objectArrayType) {
8282
@Override

compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/HotSpotReplacementsUtil.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,21 @@ public static int g1SATBQueueBufferOffset(@InjectedParameter GraalHotSpotVMConfi
653653
return config.g1SATBQueueBufferOffset;
654654
}
655655

656+
@Fold
657+
public static int shenandoahSATBQueueMarkingOffset(@InjectedParameter GraalHotSpotVMConfig config) {
658+
return config.shenandoahSATBQueueMarkingOffset;
659+
}
660+
661+
@Fold
662+
public static int shenandoahSATBQueueIndexOffset(@InjectedParameter GraalHotSpotVMConfig config) {
663+
return config.shenandoahSATBQueueIndexOffset;
664+
}
665+
666+
@Fold
667+
public static int shenandoahSATBQueueBufferOffset(@InjectedParameter GraalHotSpotVMConfig config) {
668+
return config.shenandoahSATBQueueBufferOffset;
669+
}
670+
656671
public static final LocationIdentity KLASS_SUPER_CHECK_OFFSET_LOCATION = NamedLocationIdentity.immutable("Klass::_super_check_offset");
657672

658673
@Fold
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
package org.graalvm.compiler.hotspot.replacements;
2+
3+
import jdk.vm.ci.code.Register;
4+
import jdk.vm.ci.code.TargetDescription;
5+
import jdk.vm.ci.meta.JavaKind;
6+
import jdk.vm.ci.meta.ResolvedJavaType;
7+
import org.graalvm.compiler.core.common.CompressEncoding;
8+
import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
9+
import org.graalvm.compiler.debug.DebugHandlersFactory;
10+
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
11+
import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl;
12+
import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
13+
import org.graalvm.compiler.hotspot.meta.HotSpotRegistersProvider;
14+
import org.graalvm.compiler.hotspot.nodes.GraalHotSpotVMConfigNode;
15+
import org.graalvm.compiler.hotspot.nodes.HotSpotCompressionNode;
16+
import org.graalvm.compiler.nodes.ValueNode;
17+
import org.graalvm.compiler.nodes.gc.G1ArrayRangePostWriteBarrier;
18+
import org.graalvm.compiler.nodes.gc.G1ArrayRangePreWriteBarrier;
19+
import org.graalvm.compiler.nodes.gc.G1PostWriteBarrier;
20+
import org.graalvm.compiler.nodes.gc.G1PreWriteBarrier;
21+
import org.graalvm.compiler.nodes.gc.G1ReferentFieldReadBarrier;
22+
import org.graalvm.compiler.nodes.gc.ShenandoahArrayRangePreWriteBarrier;
23+
import org.graalvm.compiler.nodes.gc.ShenandoahPreWriteBarrier;
24+
import org.graalvm.compiler.nodes.gc.ShenandoahReferentFieldReadBarrier;
25+
import org.graalvm.compiler.nodes.spi.LoweringTool;
26+
import org.graalvm.compiler.options.OptionValues;
27+
import org.graalvm.compiler.replacements.ReplacementsUtil;
28+
import org.graalvm.compiler.replacements.SnippetCounter;
29+
import org.graalvm.compiler.replacements.SnippetTemplate;
30+
import org.graalvm.compiler.replacements.gc.G1WriteBarrierSnippets;
31+
import org.graalvm.compiler.replacements.gc.ShenandoahBarrierSnippets;
32+
import org.graalvm.compiler.word.Word;
33+
import org.graalvm.word.WordFactory;
34+
35+
import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfig.INJECTED_METAACCESS;
36+
import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfig.INJECTED_VMCONFIG;
37+
38+
public final class HotSpotShenandoahBarrierSnippets extends ShenandoahBarrierSnippets {
39+
public static final ForeignCallDescriptor SHENANDOAHWBPRECALL = new ForeignCallDescriptor("shenandoah_concmark_barrier", void.class, Object.class);
40+
public static final ForeignCallDescriptor VALIDATE_OBJECT = new ForeignCallDescriptor("validate_object", boolean.class, Word.class, Word.class);
41+
42+
private final GraalHotSpotVMConfig config;
43+
private final Register threadRegister;
44+
45+
public HotSpotShenandoahBarrierSnippets(GraalHotSpotVMConfig config, HotSpotRegistersProvider registers) {
46+
this.config = config;
47+
this.threadRegister = registers.getThreadRegister();
48+
}
49+
50+
@Override
51+
protected Word getThread() {
52+
return HotSpotReplacementsUtil.registerAsWord(threadRegister);
53+
}
54+
55+
@Override
56+
protected int wordSize() {
57+
return HotSpotReplacementsUtil.wordSize();
58+
}
59+
60+
@Override
61+
protected int objectArrayIndexScale() {
62+
return ReplacementsUtil.arrayIndexScale(INJECTED_METAACCESS, JavaKind.Object);
63+
}
64+
65+
@Override
66+
protected int satbQueueMarkingOffset() {
67+
return HotSpotReplacementsUtil.shenandoahSATBQueueMarkingOffset(INJECTED_VMCONFIG);
68+
}
69+
70+
@Override
71+
protected int satbQueueBufferOffset() {
72+
return HotSpotReplacementsUtil.shenandoahSATBQueueBufferOffset(INJECTED_VMCONFIG);
73+
}
74+
75+
@Override
76+
protected int satbQueueIndexOffset() {
77+
return HotSpotReplacementsUtil.shenandoahSATBQueueIndexOffset(INJECTED_VMCONFIG);
78+
}
79+
80+
@Override
81+
protected ForeignCallDescriptor preWriteBarrierCallDescriptor() {
82+
return SHENANDOAHWBPRECALL;
83+
}
84+
85+
@Override
86+
protected boolean verifyOops() {
87+
return HotSpotReplacementsUtil.verifyOops(INJECTED_VMCONFIG);
88+
}
89+
90+
@Override
91+
protected boolean verifyBarrier() {
92+
return ReplacementsUtil.REPLACEMENTS_ASSERTIONS_ENABLED || config.verifyBeforeGC || config.verifyAfterGC;
93+
}
94+
95+
@Override
96+
protected long gcTotalCollectionsAddress() {
97+
return HotSpotReplacementsUtil.gcTotalCollectionsAddress(INJECTED_VMCONFIG);
98+
}
99+
100+
@Override
101+
protected ForeignCallDescriptor verifyOopCallDescriptor() {
102+
return HotSpotForeignCallsProviderImpl.VERIFY_OOP;
103+
}
104+
105+
@Override
106+
protected ForeignCallDescriptor validateObjectCallDescriptor() {
107+
return VALIDATE_OBJECT;
108+
}
109+
110+
@Override
111+
protected ForeignCallDescriptor printfCallDescriptor() {
112+
return Log.LOG_PRINTF;
113+
}
114+
115+
@Override
116+
protected ResolvedJavaType referenceType() {
117+
return HotSpotReplacementsUtil.referenceType(INJECTED_METAACCESS);
118+
}
119+
120+
@Override
121+
protected long referentOffset() {
122+
return HotSpotReplacementsUtil.referentOffset(INJECTED_METAACCESS);
123+
}
124+
125+
public static class Templates extends SnippetTemplate.AbstractTemplates {
126+
private final SnippetTemplate.SnippetInfo shenandoahPreWriteBarrier;
127+
private final SnippetTemplate.SnippetInfo shenandoahReferentReadBarrier;
128+
private final SnippetTemplate.SnippetInfo shenandoahArrayRangePreWriteBarrier;
129+
130+
private final ShenandoahBarrierLowerer lowerer;
131+
132+
public Templates(OptionValues options, Iterable<DebugHandlersFactory> factories, SnippetCounter.Group.Factory factory, HotSpotProviders providers, TargetDescription target, GraalHotSpotVMConfig config) {
133+
super(options, factories, providers, providers.getSnippetReflection(), target);
134+
this.lowerer = new HotSpotShenandoahBarrierSnippets.HotspotShenandoahBarrierLowerer(config, factory);
135+
136+
HotSpotShenandoahBarrierSnippets receiver = new HotSpotShenandoahBarrierSnippets(config, providers.getRegisters());
137+
shenandoahPreWriteBarrier = snippet(ShenandoahBarrierSnippets.class, "shenandoahPreWriteBarrier", null, receiver, GC_INDEX_LOCATION, GC_LOG_LOCATION, SATB_QUEUE_MARKING_LOCATION, SATB_QUEUE_INDEX_LOCATION,
138+
SATB_QUEUE_BUFFER_LOCATION);
139+
shenandoahReferentReadBarrier = snippet(ShenandoahBarrierSnippets.class, "shenandoahReferentReadBarrier", null, receiver, GC_INDEX_LOCATION, GC_LOG_LOCATION, SATB_QUEUE_MARKING_LOCATION,
140+
SATB_QUEUE_INDEX_LOCATION, SATB_QUEUE_BUFFER_LOCATION);
141+
shenandoahArrayRangePreWriteBarrier = snippet(ShenandoahBarrierSnippets.class, "shenandoahArrayRangePreWriteBarrier", null, receiver, GC_INDEX_LOCATION, GC_LOG_LOCATION, SATB_QUEUE_MARKING_LOCATION,
142+
SATB_QUEUE_INDEX_LOCATION, SATB_QUEUE_BUFFER_LOCATION);
143+
}
144+
145+
public void lower(ShenandoahPreWriteBarrier barrier, LoweringTool tool) {
146+
lowerer.lower(this, shenandoahPreWriteBarrier, barrier, tool);
147+
}
148+
149+
public void lower(ShenandoahReferentFieldReadBarrier barrier, LoweringTool tool) {
150+
lowerer.lower(this, shenandoahReferentReadBarrier, barrier, tool);
151+
}
152+
153+
public void lower(ShenandoahArrayRangePreWriteBarrier barrier, LoweringTool tool) {
154+
lowerer.lower(this, shenandoahArrayRangePreWriteBarrier, barrier, tool);
155+
}
156+
}
157+
158+
static final class HotspotShenandoahBarrierLowerer extends ShenandoahBarrierLowerer {
159+
private final CompressEncoding oopEncoding;
160+
161+
HotspotShenandoahBarrierLowerer(GraalHotSpotVMConfig config, SnippetCounter.Group.Factory factory) {
162+
super(factory);
163+
oopEncoding = config.useCompressedOops ? config.getOopEncoding() : null;
164+
}
165+
166+
@Override
167+
public ValueNode uncompress(ValueNode expected) {
168+
assert oopEncoding != null;
169+
return HotSpotCompressionNode.uncompress(expected, oopEncoding);
170+
}
171+
}
172+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
* Copyright (c) 2020, Red Hat Inc. All rights reserved.
4+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5+
*
6+
* This code is free software; you can redistribute it and/or modify it
7+
* under the terms of the GNU General Public License version 2 only, as
8+
* published by the Free Software Foundation. Oracle designates this
9+
* particular file as subject to the "Classpath" exception as provided
10+
* by Oracle in the LICENSE file that accompanied this code.
11+
*
12+
* This code is distributed in the hope that it will be useful, but WITHOUT
13+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15+
* version 2 for more details (a copy is included in the LICENSE file that
16+
* accompanied this code).
17+
*
18+
* You should have received a copy of the GNU General Public License version
19+
* 2 along with this work; if not, write to the Free Software Foundation,
20+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21+
*
22+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23+
* or visit www.oracle.com if you need additional information or have any
24+
* questions.
25+
*/
26+
package org.graalvm.compiler.nodes.gc;
27+
28+
import org.graalvm.compiler.graph.NodeClass;
29+
import org.graalvm.compiler.nodeinfo.NodeInfo;
30+
import org.graalvm.compiler.nodes.ValueNode;
31+
import org.graalvm.compiler.nodes.memory.address.AddressNode;
32+
33+
import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_64;
34+
import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_64;
35+
36+
@NodeInfo(cycles = CYCLES_64, size = SIZE_64)
37+
public class ShenandoahArrayRangePreWriteBarrier extends ArrayRangeWriteBarrier {
38+
public static final NodeClass<G1ArrayRangePreWriteBarrier> TYPE = NodeClass.create(G1ArrayRangePreWriteBarrier.class);
39+
40+
public ShenandoahArrayRangePreWriteBarrier(AddressNode address, ValueNode length, int elementStride) {
41+
super(TYPE, address, length, elementStride);
42+
}
43+
44+
}

0 commit comments

Comments
 (0)