Skip to content

Commit 2b6f417

Browse files
committed
WriteBarrierNode is DSL inlineable
1 parent 23fb8d3 commit 2b6f417

File tree

11 files changed

+74
-64
lines changed

11 files changed

+74
-64
lines changed

src/main/java/org/truffleruby/core/array/library/NativeArrayStorage.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.truffleruby.language.RubyBaseNode;
3333
import org.truffleruby.language.objects.ObjectGraph;
3434
import org.truffleruby.language.objects.ObjectGraphNode;
35-
import org.truffleruby.language.objects.shared.WriteBarrierNode;
3635

3736
import com.oracle.truffle.api.dsl.Cached;
3837
import com.oracle.truffle.api.dsl.Cached.Exclusive;
@@ -45,6 +44,7 @@
4544
import com.oracle.truffle.api.library.CachedLibrary;
4645
import com.oracle.truffle.api.library.ExportLibrary;
4746
import com.oracle.truffle.api.library.ExportMessage;
47+
import org.truffleruby.language.objects.shared.WriteBarrierNode;
4848

4949
@ExportLibrary(ArrayStoreLibrary.class)
5050
@GenerateUncached
@@ -162,16 +162,17 @@ static class ShareElements {
162162

163163
@Specialization
164164
protected static void shareElements(NativeArrayStorage store, int start, int end,
165-
@CachedLibrary("store") ArrayStoreLibrary node,
165+
@CachedLibrary("store") ArrayStoreLibrary arrayStoreLibrary,
166166
@Cached @Exclusive LoopConditionProfile loopProfile,
167-
@Cached WriteBarrierNode writeBarrierNode) {
167+
@Cached WriteBarrierNode writeBarrierNode,
168+
@Bind("$node") Node node) {
168169
int i = start;
169170
try {
170171
for (; loopProfile.inject(i < end); i++) {
171-
writeBarrierNode.executeWriteBarrier(node.read(store, i));
172+
writeBarrierNode.execute(node, arrayStoreLibrary.read(store, i));
172173
}
173174
} finally {
174-
RubyBaseNode.profileAndReportLoopCount(node, loopProfile, i);
175+
RubyBaseNode.profileAndReportLoopCount(arrayStoreLibrary, loopProfile, i);
175176
}
176177
}
177178
}

src/main/java/org/truffleruby/core/array/library/ObjectArrayStore.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
import java.util.NoSuchElementException;
1515

1616
import com.oracle.truffle.api.TruffleSafepoint;
17+
import com.oracle.truffle.api.dsl.Bind;
1718
import com.oracle.truffle.api.dsl.Cached;
1819
import com.oracle.truffle.api.dsl.Cached.Exclusive;
20+
import com.oracle.truffle.api.nodes.Node;
1921
import com.oracle.truffle.api.profiles.LoopConditionProfile;
2022
import org.truffleruby.core.array.ArrayGuards;
2123
import org.truffleruby.core.array.ArrayUtils;
@@ -93,16 +95,17 @@ static class ShareElements {
9395

9496
@Specialization
9597
protected static void shareElements(Object[] store, int start, int end,
96-
@CachedLibrary("store") ArrayStoreLibrary node,
98+
@CachedLibrary("store") ArrayStoreLibrary arrayStoreLibrary,
9799
@Cached @Exclusive LoopConditionProfile loopProfile,
98-
@Cached WriteBarrierNode writeBarrierNode) {
100+
@Cached WriteBarrierNode writeBarrierNode,
101+
@Bind("$node") Node node) {
99102
int i = start;
100103
try {
101104
for (; loopProfile.inject(i < end); i++) {
102-
writeBarrierNode.executeWriteBarrier(store[i]);
105+
writeBarrierNode.execute(node, store[i]);
103106
}
104107
} finally {
105-
RubyBaseNode.profileAndReportLoopCount(node, loopProfile, i);
108+
RubyBaseNode.profileAndReportLoopCount(arrayStoreLibrary, loopProfile, i);
106109
}
107110
}
108111
}

src/main/java/org/truffleruby/core/array/library/SharedArrayStorage.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,18 @@
1111

1212
import java.util.Set;
1313

14+
import com.oracle.truffle.api.dsl.Bind;
1415
import com.oracle.truffle.api.dsl.Cached;
1516
import com.oracle.truffle.api.dsl.Cached.Exclusive;
1617
import com.oracle.truffle.api.dsl.Cached.Shared;
18+
import com.oracle.truffle.api.nodes.Node;
1719
import org.truffleruby.core.array.ArrayGuards;
1820
import org.truffleruby.core.array.library.ArrayStoreLibrary.ArrayAllocator;
1921
import org.truffleruby.language.RubyBaseNode;
2022
import org.truffleruby.language.RubyDynamicObject;
2123
import org.truffleruby.language.objects.ObjectGraph;
2224
import org.truffleruby.language.objects.ObjectGraphNode;
2325
import org.truffleruby.language.objects.shared.SharedObjects;
24-
import org.truffleruby.language.objects.shared.WriteBarrierNode;
2526

2627
import com.oracle.truffle.api.TruffleSafepoint;
2728
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -32,6 +33,7 @@
3233
import com.oracle.truffle.api.library.ExportLibrary;
3334
import com.oracle.truffle.api.library.ExportMessage;
3435
import com.oracle.truffle.api.profiles.LoopConditionProfile;
36+
import org.truffleruby.language.objects.shared.WriteBarrierNode;
3537

3638
@ExportLibrary(ArrayStoreLibrary.class)
3739
@GenerateUncached
@@ -75,16 +77,18 @@ protected Object read(int index,
7577
@ExportMessage
7678
protected void write(int index, Object value,
7779
@Shared @Cached WriteBarrierNode writeBarrierNode,
78-
@CachedLibrary("this.storage") ArrayStoreLibrary stores) {
79-
writeBarrierNode.executeWriteBarrier(value);
80+
@CachedLibrary("this.storage") ArrayStoreLibrary stores,
81+
@Bind("$node") Node node) {
82+
writeBarrierNode.execute(node, value);
8083
stores.write(storage, index, value);
8184
}
8285

8386
@ExportMessage
8487
protected void fill(int start, int length, Object value,
8588
@Shared @Cached WriteBarrierNode writeBarrierNode,
86-
@CachedLibrary("this.storage") ArrayStoreLibrary stores) {
87-
writeBarrierNode.executeWriteBarrier(value);
89+
@CachedLibrary("this.storage") ArrayStoreLibrary stores,
90+
@Bind("$node") Node node) {
91+
writeBarrierNode.execute(node, value);
8892
stores.fill(storage, start, length, value);
8993
}
9094

src/main/java/org/truffleruby/core/objectspace/ObjectSpaceNodes.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import org.truffleruby.language.objects.IsANode;
3838
import org.truffleruby.language.objects.ObjectGraph;
3939
import org.truffleruby.language.objects.ObjectIDOperations;
40-
import org.truffleruby.language.objects.shared.WriteBarrierNode;
4140

4241
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4342
import com.oracle.truffle.api.dsl.Cached;
@@ -47,6 +46,7 @@
4746
import com.oracle.truffle.api.frame.VirtualFrame;
4847
import com.oracle.truffle.api.library.CachedLibrary;
4948
import com.oracle.truffle.api.profiles.BranchProfile;
49+
import org.truffleruby.language.objects.shared.WriteBarrierNode;
5050
import org.truffleruby.language.yield.CallBlockNode;
5151

5252
@CoreModule("ObjectSpace")
@@ -215,7 +215,7 @@ protected RubyArray defineFinalizer(VirtualFrame frame, RubyDynamicObject object
215215
if (!getContext().getSharedObjects().isSharing()) {
216216
startSharing();
217217
}
218-
writeBarrierNode.executeWriteBarrier(finalizer);
218+
writeBarrierNode.execute(this, finalizer);
219219
}
220220

221221
defineFinalizer(object, finalizer);
@@ -271,7 +271,7 @@ protected Object defineFinalizer(RubyDynamicObject object, DataHolder dataHolder
271271
if (!getContext().getSharedObjects().isSharing()) {
272272
startSharing();
273273
}
274-
writeBarrierNode.executeWriteBarrier(dataHolder);
274+
writeBarrierNode.execute(this, dataHolder);
275275
}
276276

277277
DataObjectFinalizerReference newRef = getContext()

src/main/java/org/truffleruby/language/globals/WriteSimpleGlobalVariableNode.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,15 @@
1212
import com.oracle.truffle.api.dsl.NeverDefault;
1313
import org.truffleruby.core.basicobject.ReferenceEqualNode;
1414
import org.truffleruby.language.RubyBaseNode;
15-
import org.truffleruby.language.objects.shared.WriteBarrierNode;
1615

1716
import com.oracle.truffle.api.dsl.Cached;
1817
import com.oracle.truffle.api.dsl.Cached.Shared;
1918
import com.oracle.truffle.api.dsl.Specialization;
19+
import org.truffleruby.language.objects.shared.WriteBarrierNode;
2020

2121
public abstract class WriteSimpleGlobalVariableNode extends RubyBaseNode {
2222

2323
protected final String name;
24-
@Child protected WriteBarrierNode writeBarrierNode = WriteBarrierNode.create();
2524

2625
@NeverDefault
2726
public static WriteSimpleGlobalVariableNode create(String name) {
@@ -59,10 +58,11 @@ protected Object writeTryToKeepConstant(Object value,
5958
"storage.getUnchangedAssumption()",
6059
"getLanguage().getGlobalVariableNeverAliasedAssumption(index)" })
6160
protected Object writeAssumeConstant(Object value,
61+
@Cached @Shared WriteBarrierNode writeBarrierNode,
6262
@Cached(value = "getLanguage().getGlobalVariableIndex(name)", neverDefault = false) @Shared int index,
6363
@Cached("getContext().getGlobalVariableStorage(index)") GlobalVariableStorage storage) {
6464
if (getContext().getSharedObjects().isSharing()) {
65-
writeBarrierNode.executeWriteBarrier(value);
65+
writeBarrierNode.execute(this, value);
6666
}
6767
storage.setValueInternal(value);
6868
storage.updateAssumeConstant(getContext());
@@ -71,9 +71,10 @@ protected Object writeAssumeConstant(Object value,
7171

7272
@Specialization(replaces = "writeAssumeConstant")
7373
protected Object writeAliasedOrMultiContext(Object value,
74+
@Cached @Shared WriteBarrierNode writeBarrierNode,
7475
@Cached("create(name)") LookupGlobalVariableStorageNode lookupGlobalVariableStorageNode) {
7576
if (getContext().getSharedObjects().isSharing()) {
76-
writeBarrierNode.executeWriteBarrier(value);
77+
writeBarrierNode.execute(this, value);
7778
}
7879

7980
final GlobalVariableStorage storage = lookupGlobalVariableStorageNode.execute(null);

src/main/java/org/truffleruby/language/objects/WriteObjectFieldNode.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@
1313
import com.oracle.truffle.api.nodes.Node;
1414
import org.truffleruby.language.RubyBaseNode;
1515
import org.truffleruby.language.RubyDynamicObject;
16-
import org.truffleruby.language.objects.shared.WriteBarrierNode;
1716

1817
import com.oracle.truffle.api.dsl.Cached;
1918
import com.oracle.truffle.api.dsl.GenerateUncached;
2019
import com.oracle.truffle.api.dsl.ReportPolymorphism;
2120
import com.oracle.truffle.api.dsl.Specialization;
2221
import com.oracle.truffle.api.library.CachedLibrary;
2322
import com.oracle.truffle.api.object.DynamicObjectLibrary;
23+
import org.truffleruby.language.objects.shared.WriteBarrierNode;
2424

2525
import java.lang.invoke.VarHandle;
2626

@@ -38,12 +38,12 @@ protected static void writeLocal(RubyDynamicObject object, Object name, Object v
3838
}
3939

4040
@Specialization(guards = "objectLibrary.isShared(object)")
41-
protected static void writeShared(RubyDynamicObject object, Object name, Object value,
41+
protected static void writeShared(Node node, RubyDynamicObject object, Object name, Object value,
4242
@CachedLibrary(limit = "getDynamicObjectCacheLimit()") DynamicObjectLibrary objectLibrary,
4343
@Cached WriteBarrierNode writeBarrierNode) {
4444

4545
// Share `value` before it becomes reachable through `object`
46-
writeBarrierNode.executeWriteBarrier(value);
46+
writeBarrierNode.execute(node, value);
4747

4848
/* We need a STORE_STORE memory barrier here, to ensure the value is seen as shared by all threads when
4949
* published below by writing the value to a field of the object. Otherwise, the compiler could theoretically

src/main/java/org/truffleruby/language/objects/classvariables/SetClassVariableNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ protected Object setClassVariableShared(RubyModule module, String name, Object v
5050
@Cached WriteBarrierNode writeBarrierNode,
5151
@Cached @Shared InlinedBranchProfile slowPath) {
5252
// See WriteObjectFieldNode
53-
writeBarrierNode.executeWriteBarrier(value);
53+
writeBarrierNode.execute(this, value);
5454

5555
final boolean set = classVariableStorage.putIfPresent(name, value, objectLibrary);
5656
if (!set) {

src/main/java/org/truffleruby/language/objects/shared/PropagateSharingNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ protected void propagateNotShared(RubyDynamicObject source, Object value,
3838
protected void propagateShared(RubyDynamicObject source, Object value,
3939
@Cached @Shared IsSharedNode isSharedNode,
4040
@Cached WriteBarrierNode writeBarrierNode) {
41-
writeBarrierNode.executeWriteBarrier(value);
41+
writeBarrierNode.execute(this, value);
4242
}
4343
}

src/main/java/org/truffleruby/language/objects/shared/ShareInternalFieldsNode.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
*/
1010
package org.truffleruby.language.objects.shared;
1111

12-
import com.oracle.truffle.api.dsl.Cached.Exclusive;
13-
import com.oracle.truffle.api.dsl.NeverDefault;
12+
import com.oracle.truffle.api.nodes.Node;
1413
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
1514
import org.truffleruby.collections.BoundaryIterable;
1615
import org.truffleruby.core.array.ArrayGuards;
@@ -54,11 +53,12 @@ protected void shareArray(RubyArray array,
5453
@Specialization
5554
protected void shareCachedQueue(RubyQueue object,
5655
@Cached InlinedConditionProfile profileEmpty,
57-
@Cached("createWriteBarrierNode()") @Exclusive WriteBarrierNode writeBarrierNode) {
56+
@Cached WriteBarrierNode writeBarrierNode,
57+
@Bind("this") Node node) {
5858
final UnsizedQueue queue = object.queue;
5959
if (!profileEmpty.profile(this, queue.isEmpty())) {
6060
for (Object e : BoundaryIterable.wrap(queue.getContents())) {
61-
writeBarrierNode.executeWriteBarrier(e);
61+
writeBarrierNode.execute(node, e, depth);
6262
}
6363
}
6464
}
@@ -77,9 +77,4 @@ protected void shareUncached(RubyDynamicObject object) {
7777
SharedObjects.shareInternalFields(object);
7878
}
7979

80-
@NeverDefault
81-
protected WriteBarrierNode createWriteBarrierNode() {
82-
return WriteBarrierNodeGen.create(depth);
83-
}
84-
8580
}

src/main/java/org/truffleruby/language/objects/shared/ShareObjectNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ protected void shareCached(RubyDynamicObject object,
7676
for (int i = 0; i < propertyGetters.length; i++) {
7777
final PropertyGetter propertyGetter = propertyGetters[i];
7878
final Object value = propertyGetter.get(object);
79-
writeBarrierNodes[i].executeWriteBarrier(value);
79+
writeBarrierNodes[i].executeCached(value, depth);
8080
}
8181

8282
assert allFieldsAreShared(object);
@@ -119,7 +119,7 @@ protected WriteBarrierNode[] createWriteBarrierNodes(PropertyGetter[] propertyGe
119119
? WriteBarrierNode.EMPTY_ARRAY
120120
: new WriteBarrierNode[propertyGetters.length];
121121
for (int i = 0; i < nodes.length; i++) {
122-
nodes[i] = WriteBarrierNodeGen.create(depth);
122+
nodes[i] = WriteBarrierNodeGen.create();
123123
}
124124
return nodes;
125125
}

0 commit comments

Comments
 (0)