Skip to content

Commit c1a0a42

Browse files
committed
Refactor state field reads and persist operations.
1 parent bca835c commit c1a0a42

File tree

4 files changed

+109
-85
lines changed

4 files changed

+109
-85
lines changed

truffle/src/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/BitSet.java

Lines changed: 20 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,18 @@
4949
import com.oracle.truffle.dsl.processor.generator.FlatNodeGenFactory.LocalVariable;
5050
import com.oracle.truffle.dsl.processor.java.model.CodeTree;
5151
import com.oracle.truffle.dsl.processor.java.model.CodeTreeBuilder;
52+
import com.oracle.truffle.dsl.processor.java.model.CodeVariableElement;
5253

5354
final class BitSet {
5455

56+
private final FlatNodeGenFactory factory;
5557
private final BitStateList states;
5658
private final String name;
5759
private final long allMask;
5860
private final TypeMirror type;
5961

60-
BitSet(String name, BitStateList states) {
62+
BitSet(FlatNodeGenFactory factory, String name, BitStateList states) {
63+
this.factory = factory;
6164
this.name = name;
6265
this.states = states;
6366
int bitCount = states.getBitCount();
@@ -114,7 +117,7 @@ public CodeTree createReference(FrameState frameState) {
114117
if (ref == null) {
115118
CodeTreeBuilder builder = CodeTreeBuilder.createBuilder();
116119
builder.string(getName(), "_");
117-
ref = FlatNodeGenFactory.createInlinedAccess(frameState, null, builder.build(), null);
120+
ref = factory.createInlinedAccess(frameState, null, builder.build(), null);
118121
}
119122
return ref;
120123
}
@@ -136,25 +139,7 @@ public CodeTree createLoad(FrameState frameState, boolean forceLoad) {
136139
// already loaded
137140
return CodeTreeBuilder.singleString("");
138141
}
139-
140-
String fieldName = name + "_";
141-
CodeTreeBuilder builder = CodeTreeBuilder.createBuilder();
142-
CodeTreeBuilder init = builder.create();
143-
init.string("this.").tree(CodeTreeBuilder.singleString(fieldName));
144-
145-
CodeTree inlinedAccess = FlatNodeGenFactory.createInlinedAccess(frameState, null, init.build(), null);
146-
147-
if (var == null) {
148-
var = new LocalVariable(type, name, null);
149-
frameState.set(name, var);
150-
builder.tree(var.createDeclaration(inlinedAccess));
151-
} else {
152-
builder.startStatement();
153-
builder.string(name).string(" = ").tree(inlinedAccess);
154-
builder.end();
155-
}
156-
157-
return builder.build();
142+
return factory.createStateLoad(frameState, this);
158143
}
159144

160145
public void clearLoaded(FrameState frameState) {
@@ -325,34 +310,21 @@ public CodeTree createSet(FrameState frameState, StateQuery elements, Boolean va
325310

326311
private CodeTree createPersist(FrameState frameState, boolean persist, CodeTree valueTree, boolean update) {
327312
CodeTreeBuilder builder = CodeTreeBuilder.createBuilder();
328-
builder.startStatement();
329313
if (persist) {
330-
builder.string("this.", name, "_");
331-
if (frameState != null && frameState.isInlinedNode()) {
332-
builder.startCall(".set");
333-
builder.tree(frameState.getValue(0).createReference());
314+
CodeTree updateReference;
315+
if (update) {
316+
updateReference = createLocalReference(frameState);
334317
} else {
335-
builder.string(" = ");
336-
}
337-
338-
builder.startGroup();
339-
// if there is a local variable we need to update it as well
340-
CodeTree localReference = createLocalReference(frameState);
341-
if (localReference != null && update) {
342-
builder.tree(localReference).string(" = ");
318+
updateReference = null;
343319
}
320+
builder.tree(factory.createStatePersist(frameState, this, updateReference, valueTree));
344321
} else {
345-
builder.startGroup();
346-
builder.tree(createReference(frameState)).string(" = ");
347-
}
348-
builder.tree(valueTree);
349-
builder.end();
350-
351-
if (persist && frameState != null && frameState.isInlinedNode()) {
352-
builder.end();
322+
builder.startStatement();
323+
builder.tree(createReference(frameState));
324+
builder.string(" = ");
325+
builder.tree(valueTree);
326+
builder.end(); // statement
353327
}
354-
355-
builder.end(); // statement
356328
return builder.build();
357329
}
358330

@@ -413,4 +385,8 @@ static final class BitRange {
413385

414386
}
415387

388+
public CodeVariableElement createField() {
389+
return factory.createStateField(this);
390+
}
391+
416392
}

truffle/src/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/BitStateList.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,13 @@
6868

6969
final class BitStateList {
7070

71+
private final FlatNodeGenFactory factory;
7172
private final List<BitRangedState> entries;
7273
private final LinkedHashMap<Object, List<BitRangedState>> byKey = new LinkedHashMap<>();
7374
private final int bitCount;
7475

75-
BitStateList(List<State<?>> stateObjects) {
76+
BitStateList(FlatNodeGenFactory factory, List<State<?>> stateObjects) {
77+
this.factory = factory;
7678
int bitOffset = 0;
7779
List<BitRangedState> newStates = new ArrayList<>();
7880
for (State<?> state : stateObjects) {
@@ -235,7 +237,7 @@ MultiStateBitSet splitBitSets(String namePrefix, NodeData activeNode, int maxBit
235237
List<BitSet> activeBitSets = new ArrayList<>();
236238
int index = 0;
237239
for (BitStateList list : stateLists) {
238-
BitSet bitSet = new BitSet(namePrefix + "state_" + index, list);
240+
BitSet bitSet = new BitSet(factory, namePrefix + "state_" + index, list);
239241
if (list.isRelevantFor(activeNode)) {
240242
if (list.getBitCount() == 0) {
241243
continue;
@@ -256,7 +258,7 @@ private static int countGroupBits(List<StateGroup> groupedStates) {
256258
return bits;
257259
}
258260

259-
private static List<BitStateList> splitByWidth(List<StateGroup> groups, int maxBitWidth) {
261+
private List<BitStateList> splitByWidth(List<StateGroup> groups, int maxBitWidth) {
260262
List<List<StateGroup>> split = new ArrayList<>();
261263
List<StateGroup> currentStates = new ArrayList<>();
262264
int currentWidth = 0;
@@ -343,7 +345,7 @@ private static List<BitStateList> splitByWidth(List<StateGroup> groups, int maxB
343345
for (StateGroup group : pack) {
344346
flattendGroup.addAll(group.states);
345347
}
346-
BitStateList list = new BitStateList(flattendGroup);
348+
BitStateList list = new BitStateList(factory, flattendGroup);
347349
if (maxBitWidth == 32 && list.getBitCount() > maxBitWidth) {
348350
/*
349351
* Note we only check this here for 32 bits, because its possible the processor runs

truffle/src/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/FlatNodeGenFactory.java

Lines changed: 67 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -280,10 +280,10 @@ private List<InlineFieldData> createInlineFields(boolean pruneInternalClasses) {
280280
List<InlineFieldData> fields = new ArrayList<>();
281281

282282
for (BitSet bitSet : state.activeState.getSets()) {
283-
String name = bitSet.getName() + "_";
284-
TypeMirror referenceType = types().InlineSupport_StateField;
285-
CodeVariableElement var = MultiStateBitSet.createCachedField(bitSet);
286-
fields.add(new InlineFieldData(var, name, referenceType, bitSet.getBitCount(), null, 0));
283+
CodeVariableElement var = createStateField(bitSet);
284+
if (var != null) {
285+
fields.add(new InlineFieldData(var, var.getName(), types.InlineSupport_StateField, bitSet.getBitCount(), null, 0));
286+
}
287287
}
288288

289289
/*
@@ -465,10 +465,10 @@ BitStateList computeNodeState() {
465465
}
466466
}
467467

468-
return new BitStateList(stateObjects);
468+
return new BitStateList(this, stateObjects);
469469
}
470470

471-
private static BitStateList computeSpecializationState(SpecializationData specialization) {
471+
private BitStateList computeSpecializationState(SpecializationData specialization) {
472472
List<State<?>> stateObjects = new ArrayList<>();
473473
if (useSpecializationClass(specialization)) {
474474

@@ -498,7 +498,7 @@ private static BitStateList computeSpecializationState(SpecializationData specia
498498
}
499499
}
500500
}
501-
return new BitStateList(stateObjects);
501+
return new BitStateList(this, stateObjects);
502502
}
503503

504504
@SuppressWarnings("hiding")
@@ -6742,15 +6742,15 @@ private CodeTree createInsertNode(FrameState frameState, SpecializationData spec
67426742
return value;
67436743
}
67446744

6745-
private static CodeTree createNodeAccess(FrameState frameState, SpecializationData specialization) {
6745+
private CodeTree createNodeAccess(FrameState frameState, SpecializationData specialization) {
67466746
if (specialization != null && substituteNodeWithSpecializationClass(specialization) && !frameState.getMode().isUncached()) {
67476747
return singleString(createSpecializationLocalName(specialization));
67486748
} else {
67496749
return createNodeAccess(frameState);
67506750
}
67516751
}
67526752

6753-
private static CodeTree createNodeAccess(FrameState frameState) {
6753+
CodeTree createNodeAccess(FrameState frameState) {
67546754
if (frameState.isInlinedNode()) {
67556755
return frameState.getValue(INLINED_NODE_INDEX).createReference();
67566756
} else {
@@ -7336,8 +7336,7 @@ private CodeTree createCacheAccess(FrameState frameState, SpecializationData spe
73367336
if (useCacheClass(specialization, cache)) {
73377337
builder.string(".delegate");
73387338
}
7339-
CodeTree nodeAccess = createNodeAccess(frameState);
7340-
return createInlinedAccess(frameState, specialization, builder.build(), value, nodeAccess);
7339+
return createInlinedAccess(frameState, specialization, builder.build(), value);
73417340
}
73427341
} else {
73437342
String cacheFieldName = createLocalCachedInlinedName(specialization, cache);
@@ -7489,14 +7488,15 @@ private CodeVariableElement lookupEnumConstants(TypeMirror mirror) {
74897488
}
74907489

74917490
@SuppressWarnings("unused")
7492-
static CodeTree createInlinedAccess(FrameState frameState, SpecializationData specialization, CodeTree reference, CodeTree value, CodeTree nodeReference) {
7491+
CodeTree createInlinedAccess(FrameState frameState, SpecializationData specialization, CodeTree reference, CodeTree value) {
74937492
CodeTreeBuilder builder = CodeTreeBuilder.createBuilder();
74947493
builder.tree(reference);
7495-
if (frameState != null && frameState.isInlinedNode()) {
7494+
if (frameState.isInlinedNode()) {
7495+
CodeTree nodeAccess = createNodeAccess(frameState, specialization);
74967496
if (value == null) {
7497-
builder.startCall(".get").tree(nodeReference).end();
7497+
builder.startCall(".get").tree(nodeAccess).end();
74987498
} else {
7499-
builder.startCall(".set").tree(nodeReference).tree(value).end();
7499+
builder.startCall(".set").tree(nodeAccess).tree(value).end();
75007500
}
75017501
} else {
75027502
if (value != null) {
@@ -7506,10 +7506,6 @@ static CodeTree createInlinedAccess(FrameState frameState, SpecializationData sp
75067506
return builder.build();
75077507
}
75087508

7509-
static CodeTree createInlinedAccess(FrameState frameState, SpecializationData specialization, CodeTree reference, CodeTree value) {
7510-
return createInlinedAccess(frameState, specialization, reference, value, createNodeAccess(frameState, specialization));
7511-
}
7512-
75137509
private CodeTree createAssumptionReference(FrameState frameState, SpecializationData s, AssumptionExpression a) {
75147510
String assumptionFieldName = createAssumptionFieldName(s, a);
75157511
return createSpecializationFieldAccess(frameState, s, true, true, assumptionFieldName, null);
@@ -7846,26 +7842,12 @@ int getAllCapacity() {
78467842
List<CodeVariableElement> createCachedFields() {
78477843
List<CodeVariableElement> variables = new ArrayList<>();
78487844
for (BitSet bitSet : all) {
7849-
variables.add(createCachedField(bitSet));
7850-
}
7851-
return variables;
7852-
}
7853-
7854-
static CodeVariableElement createCachedField(BitSet bitSet) {
7855-
CodeVariableElement var = FlatNodeGenFactory.createNodeField(PRIVATE, bitSet.getType(), bitSet.getName() + "_",
7856-
ProcessorContext.getInstance().getTypes().CompilerDirectives_CompilationFinal);
7857-
CodeTreeBuilder docBuilder = var.createDocBuilder();
7858-
7859-
for (BitRangedState state : bitSet.getStates().getEntries()) {
7860-
if (state.state.isInlined()) {
7861-
GeneratorUtils.markUnsafeAccessed(var);
7845+
CodeVariableElement v = bitSet.createField();
7846+
if (v != null) {
7847+
variables.add(v);
78627848
}
78637849
}
7864-
7865-
docBuilder.startJavadoc();
7866-
FlatNodeGenFactory.addStateDoc(docBuilder, bitSet);
7867-
docBuilder.end();
7868-
return var;
7850+
return variables;
78697851
}
78707852

78717853
void addParametersTo(FrameState frameState, CodeExecutableElement targetMethod) {
@@ -8472,4 +8454,52 @@ public void loadQuickeningStateBitSets(CodeTreeBuilder b, FrameState frameState,
84728454
}
84738455
}
84748456

8457+
CodeVariableElement createStateField(BitSet bitSet) {
8458+
CodeVariableElement var = plugs.createStateField(this, bitSet);
8459+
if (var == null) {
8460+
return null;
8461+
}
8462+
CodeTreeBuilder docBuilder = var.createDocBuilder();
8463+
for (BitRangedState s : bitSet.getStates().getEntries()) {
8464+
if (s.state.isInlined()) {
8465+
GeneratorUtils.markUnsafeAccessed(var);
8466+
}
8467+
}
8468+
docBuilder.startJavadoc();
8469+
FlatNodeGenFactory.addStateDoc(docBuilder, bitSet);
8470+
docBuilder.end();
8471+
return var;
8472+
}
8473+
8474+
CodeTree createStatePersist(FrameState frameState, BitSet bitSet, CodeTree updateReference, CodeTree value) {
8475+
CodeTreeBuilder b = CodeTreeBuilder.createBuilder();
8476+
b.startStatement();
8477+
CodeTreeBuilder valueBuilder = CodeTreeBuilder.createBuilder();
8478+
if (updateReference != null) {
8479+
valueBuilder.tree(updateReference).string(" = ");
8480+
}
8481+
valueBuilder.tree(value);
8482+
CodeTree valueTree = valueBuilder.build();
8483+
b.tree(plugs.createStatePersist(this, frameState, bitSet, valueTree));
8484+
b.end(); // statement
8485+
return b.build();
8486+
}
8487+
8488+
CodeTree createStateLoad(FrameState frameState, BitSet bitSet) {
8489+
String localName = bitSet.getName();
8490+
CodeTree inlinedAccess = plugs.createStateLoad(this, frameState, bitSet);
8491+
LocalVariable var = frameState.get(localName);
8492+
if (var == null) {
8493+
var = new LocalVariable(bitSet.getType(), localName, null);
8494+
frameState.set(localName, var);
8495+
return var.createDeclaration(inlinedAccess);
8496+
} else {
8497+
CodeTreeBuilder b = CodeTreeBuilder.createBuilder();
8498+
b.startStatement();
8499+
b.string(bitSet.getName()).string(" = ").tree(inlinedAccess);
8500+
b.end();
8501+
return b.build();
8502+
}
8503+
}
8504+
84758505
}

truffle/src/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGeneratorPlugs.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
package com.oracle.truffle.dsl.processor.generator;
4242

4343
import static com.oracle.truffle.dsl.processor.java.ElementUtils.isPrimitive;
44+
import static javax.lang.model.element.Modifier.PRIVATE;
4445

4546
import java.util.List;
4647

@@ -55,6 +56,7 @@
5556
import com.oracle.truffle.dsl.processor.java.ElementUtils;
5657
import com.oracle.truffle.dsl.processor.java.model.CodeTree;
5758
import com.oracle.truffle.dsl.processor.java.model.CodeTreeBuilder;
59+
import com.oracle.truffle.dsl.processor.java.model.CodeVariableElement;
5860
import com.oracle.truffle.dsl.processor.model.NodeChildData;
5961
import com.oracle.truffle.dsl.processor.model.NodeExecutionData;
6062
import com.oracle.truffle.dsl.processor.model.SpecializationData;
@@ -112,4 +114,18 @@ default CodeTree bindExpressionValue(FrameState frameState, Variable variable) {
112114
};
113115
}
114116

117+
default CodeTree createStateLoad(FlatNodeGenFactory factory, FrameState frameState, BitSet bitSet) {
118+
return factory.createInlinedAccess(frameState, null, CodeTreeBuilder.singleString(bitSet.getName() + "_"), null);
119+
}
120+
121+
default CodeTree createStatePersist(FlatNodeGenFactory factory, FrameState frameState, BitSet bitSet, CodeTree valueTree) {
122+
return factory.createInlinedAccess(frameState, null, CodeTreeBuilder.singleString(bitSet.getName() + "_"), valueTree);
123+
}
124+
125+
@SuppressWarnings("unused")
126+
default CodeVariableElement createStateField(FlatNodeGenFactory factory, BitSet bitSet) {
127+
return FlatNodeGenFactory.createNodeField(PRIVATE, bitSet.getType(), bitSet.getName() + "_",
128+
ProcessorContext.types().CompilerDirectives_CompilationFinal);
129+
}
130+
115131
}

0 commit comments

Comments
 (0)