Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Node-inline AbstractPointersObjectWriteNode
Browse files Browse the repository at this point in the history
fniephaus committed Dec 7, 2023
1 parent 7afffe1 commit 374afd5
Showing 22 changed files with 164 additions and 134 deletions.
Original file line number Diff line number Diff line change
@@ -50,7 +50,7 @@ public void testBasic() {

/* Ensure nil writes do not change uninitialized locations. */
for (int i = 0; i < obj1.getNumSlots(); i++) {
writeNode.executeNil(obj1, i);
writeNode.executeNil(null, obj1, i);
}
for (final SlotLocation location : obj1.getLayout().getLocations()) {
assertTrue("All locations should be uninitialized", location.isUninitialized());
@@ -196,7 +196,7 @@ private static PointersObject instantiate(final ClassObject dummyClass) {
}

private static void writeAndValidate(final AbstractPointersObject obj, final int index, final Object value) {
AbstractPointersObjectWriteNode.getUncached().execute(obj, index, value);
AbstractPointersObjectWriteNode.executeUncached(obj, index, value);
assertEquals("Write failed", AbstractPointersObjectReadNode.getUncached().execute(obj, index), value);
}
}
Original file line number Diff line number Diff line change
@@ -870,7 +870,7 @@ public ArrayObject asArrayOfObjects(final Object... elements) {
return ArrayObject.createWithStorage(this, arrayClass, elements);
}

public PointersObject asFraction(final long numerator, final long denominator, final AbstractPointersObjectWriteNode writeNode) {
public PointersObject asFraction(final long numerator, final long denominator, final AbstractPointersObjectWriteNode writeNode, final Node inlineTarget) {
if (fractionClass == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
final Object fractionLookup = lookup("Fraction");
@@ -898,8 +898,8 @@ public PointersObject asFraction(final long numerator, final long denominator, f
final long gcd = Math.abs(m);
// Instantiate reduced fraction
final PointersObject fraction = new PointersObject(this, fractionClass, fractionClass.getLayout());
writeNode.execute(fraction, FRACTION.NUMERATOR, actualNumerator / gcd);
writeNode.execute(fraction, FRACTION.DENOMINATOR, actualDenominator / gcd);
writeNode.execute(inlineTarget, fraction, FRACTION.NUMERATOR, actualNumerator / gcd);
writeNode.execute(inlineTarget, fraction, FRACTION.DENOMINATOR, actualDenominator / gcd);
return fraction;
}

@@ -924,23 +924,23 @@ public NativeObject asString(final String value, final InlinedConditionProfile w
return wideStringProfile.profile(node, NativeObject.needsWideString(value)) ? asWideString(value) : asByteString(value);
}

public PointersObject asPoint(final AbstractPointersObjectWriteNode writeNode, final Object xPos, final Object yPos) {
public PointersObject asPoint(final AbstractPointersObjectWriteNode writeNode, final Node inlineTarget, final Object xPos, final Object yPos) {
final PointersObject point = new PointersObject(this, pointClass, null);
writeNode.execute(point, POINT.X, xPos);
writeNode.execute(point, POINT.Y, yPos);
writeNode.execute(inlineTarget, point, POINT.X, xPos);
writeNode.execute(inlineTarget, point, POINT.Y, yPos);
return point;
}

public ArrayObject newEmptyArray() {
return ArrayObject.createWithStorage(this, arrayClass, ArrayUtils.EMPTY_ARRAY);
}

public PointersObject newMessage(final AbstractPointersObjectWriteNode writeNode, final NativeObject selector, final ClassObject lookupClass, final Object[] arguments) {
public PointersObject newMessage(final AbstractPointersObjectWriteNode writeNode, final Node inlineTarget, final NativeObject selector, final ClassObject lookupClass, final Object[] arguments) {
final PointersObject message = new PointersObject(this, messageClass, null);
writeNode.execute(message, MESSAGE.SELECTOR, selector);
writeNode.execute(message, MESSAGE.ARGUMENTS, asArrayOfObjects(arguments));
writeNode.execute(inlineTarget, message, MESSAGE.SELECTOR, selector);
writeNode.execute(inlineTarget, message, MESSAGE.ARGUMENTS, asArrayOfObjects(arguments));
assert message.instsize() > MESSAGE.LOOKUP_CLASS : "Early versions do not have lookupClass";
writeNode.execute(message, MESSAGE.LOOKUP_CLASS, lookupClass);
writeNode.execute(inlineTarget, message, MESSAGE.LOOKUP_CLASS, lookupClass);
return message;
}

Original file line number Diff line number Diff line change
@@ -88,13 +88,13 @@ private void run(final ContextObject thisContext) {
final PointersObject activeProcess = image.getActiveProcessSlow();
try {
/* Mark thisContext as suspended during tracing and writing. */
AbstractPointersObjectWriteNode.getUncached().execute(activeProcess, PROCESS.SUSPENDED_CONTEXT, thisContext);
AbstractPointersObjectWriteNode.executeUncached(activeProcess, PROCESS.SUSPENDED_CONTEXT, thisContext);
traceObjects();
writeImageHeader();
writeBody();
} finally {
/* Unmark thisContext as suspended. */
AbstractPointersObjectWriteNode.getUncached().executeNil(activeProcess, PROCESS.SUSPENDED_CONTEXT);
AbstractPointersObjectWriteNode.executeNilUncached(activeProcess, PROCESS.SUSPENDED_CONTEXT);
closeStream();
finalizeImageHeader();
}
Original file line number Diff line number Diff line change
@@ -122,7 +122,7 @@ public final void fillin(final SqueakImageChunk chunk) {
final Object[] pointers = chunk.getPointers();
final int instSize = instsize();
for (int i = 0; i < instSize; i++) {
writeNode.execute(this, i, pointers[i]);
writeNode.execute(null, this, i, pointers[i]);
}
fillInVariablePart(pointers, instSize);
assert size() == pointers.length;
@@ -294,7 +294,7 @@ public final Object instVarAt0Slow(final long index) {

public final void instVarAtPut0Slow(final long index, final Object value) {
CompilerAsserts.neverPartOfCompilation();
AbstractPointersObjectWriteNode.getUncached().execute(this, index, value);
AbstractPointersObjectWriteNode.executeUncached(this, index, value);
}

protected final boolean layoutValuesPointTo(final SqueakObjectIdentityNode identityNode, final Node inlineTarget, final Object thang) {
Original file line number Diff line number Diff line change
@@ -513,10 +513,10 @@ public void transferTo(final SqueakImageContext image, final PointersObject newP
assert newProcess != getActiveProcessNode.execute(inlineTarget) : "trying to switch to already active process";
// overwritten in next line.
final PointersObject oldProcess = getActiveProcessNode.execute(inlineTarget);
writeNode.execute(scheduler, PROCESS_SCHEDULER.ACTIVE_PROCESS, newProcess);
writeNode.execute(oldProcess, PROCESS.SUSPENDED_CONTEXT, this);
writeNode.executeNil(newProcess, PROCESS.LIST);
writeNode.executeNil(newProcess, PROCESS.SUSPENDED_CONTEXT);
writeNode.execute(inlineTarget, scheduler, PROCESS_SCHEDULER.ACTIVE_PROCESS, newProcess);
writeNode.execute(inlineTarget, oldProcess, PROCESS.SUSPENDED_CONTEXT, this);
writeNode.executeNil(inlineTarget, newProcess, PROCESS.LIST);
writeNode.executeNil(inlineTarget, newProcess, PROCESS.SUSPENDED_CONTEXT);
if (CompilerDirectives.isPartialEvaluationConstant(newActiveContext)) {
throw ProcessSwitch.create(newActiveContext);
} else {
Original file line number Diff line number Diff line change
@@ -104,17 +104,17 @@ public int getFormWidth(final AbstractPointersObjectReadNode readNode) {
return readNode.executeInt(this, FORM.WIDTH);
}

public PointersObject removeFirstLinkOfList(final AbstractPointersObjectReadNode readNode, final AbstractPointersObjectWriteNode writeNode) {
public PointersObject removeFirstLinkOfList(final AbstractPointersObjectReadNode readNode, final AbstractPointersObjectWriteNode writeNode, final Node inlineTarget) {
// Remove the first process from the given linked list.
final PointersObject first = readNode.executePointers(this, LINKED_LIST.FIRST_LINK);
final Object last = readNode.execute(this, LINKED_LIST.LAST_LINK);
if (first == last) {
writeNode.executeNil(this, LINKED_LIST.FIRST_LINK);
writeNode.executeNil(this, LINKED_LIST.LAST_LINK);
writeNode.executeNil(inlineTarget, this, LINKED_LIST.FIRST_LINK);
writeNode.executeNil(inlineTarget, this, LINKED_LIST.LAST_LINK);
} else {
writeNode.execute(this, LINKED_LIST.FIRST_LINK, readNode.execute(first, PROCESS.NEXT_LINK));
writeNode.execute(inlineTarget, this, LINKED_LIST.FIRST_LINK, readNode.execute(first, PROCESS.NEXT_LINK));
}
writeNode.executeNil(first, PROCESS.NEXT_LINK);
writeNode.executeNil(inlineTarget, first, PROCESS.NEXT_LINK);
return first;
}

Original file line number Diff line number Diff line change
@@ -87,23 +87,28 @@ protected static final Object doReadGeneric(final AbstractPointersObject object,
}
}

@GenerateInline
@GenerateUncached
@GenerateCached(false)
@ImportStatic(AbstractPointersObjectNodes.class)
public abstract static class AbstractPointersObjectWriteNode extends AbstractNode {

@NeverDefault
public static AbstractPointersObjectWriteNode create() {
return AbstractPointersObjectWriteNodeGen.create();
}

public static AbstractPointersObjectWriteNode getUncached() {
return AbstractPointersObjectWriteNodeGen.getUncached();
}

public abstract void execute(AbstractPointersObject obj, long index, Object value);
public abstract void execute(Node node, AbstractPointersObject obj, long index, Object value);

public static final void executeUncached(final AbstractPointersObject obj, final long index, final Object value) {
AbstractPointersObjectWriteNodeGen.getUncached().execute(null, obj, index, value);
}

public final void executeNil(final Node node, final AbstractPointersObject obj, final long index) {
execute(node, obj, index, NilObject.SINGLETON);
}

public final void executeNil(final AbstractPointersObject obj, final long index) {
execute(obj, index, NilObject.SINGLETON);
public static final void executeNilUncached(final AbstractPointersObject obj, final long index) {
AbstractPointersObjectWriteNodeGen.getUncached().executeNil(null, obj, index);
}

@SuppressWarnings("unused")
@@ -228,18 +233,18 @@ public abstract static class VariablePointersObjectWriteNode extends Node {

@Specialization(guards = {"cachedIndex == index", "object.getLayout() == cachedLayout", "cachedIndex < cachedLayout.getInstSize()"}, //
assumptions = "cachedLayout.getValidAssumption()", limit = "CACHE_LIMIT")
protected static final void doWriteCached(final VariablePointersObject object, @SuppressWarnings("unused") final long index, final Object value,
protected static final void doWriteCached(final Node node, final VariablePointersObject object, @SuppressWarnings("unused") final long index, final Object value,
@Cached("index") final long cachedIndex,
@SuppressWarnings("unused") @Cached("object.getLayout()") final ObjectLayout cachedLayout,
@Exclusive @Cached final AbstractPointersObjectWriteNode writeNode) {
writeNode.execute(object, cachedIndex, value);
writeNode.execute(node, object, cachedIndex, value);
}

@ReportPolymorphism.Megamorphic
@Specialization(guards = "index < object.instsize()", replaces = "doWriteCached")
protected static final void doWriteGeneric(final VariablePointersObject object, final long index, final Object value,
protected static final void doWriteGeneric(final Node node, final VariablePointersObject object, final long index, final Object value,
@Exclusive @Cached final AbstractPointersObjectWriteNode writeNode) {
writeNode.execute(object, index, value);
writeNode.execute(node, object, index, value);
}

@Specialization(guards = {"cachedIndex == index", "object.getLayout() == cachedLayout", "cachedIndex >= cachedLayout.getInstSize()"}, //
@@ -325,18 +330,18 @@ public abstract static class WeakVariablePointersObjectWriteNode extends Node {

@Specialization(guards = {"cachedIndex == index", "object.getLayout() == cachedLayout", "cachedIndex < cachedLayout.getInstSize()"}, //
assumptions = "cachedLayout.getValidAssumption()", limit = "CACHE_LIMIT")
protected static final void doWriteCached(final WeakVariablePointersObject object, @SuppressWarnings("unused") final long index, final Object value,
protected static final void doWriteCached(final Node node, final WeakVariablePointersObject object, @SuppressWarnings("unused") final long index, final Object value,
@Cached("index") final long cachedIndex,
@SuppressWarnings("unused") @Cached("object.getLayout()") final ObjectLayout cachedLayout,
@Exclusive @Cached final AbstractPointersObjectWriteNode writeNode) {
writeNode.execute(object, cachedIndex, value);
writeNode.execute(node, object, cachedIndex, value);
}

@ReportPolymorphism.Megamorphic
@Specialization(guards = "index < object.instsize()", replaces = "doWriteCached")
protected static final void doWriteGeneric(final WeakVariablePointersObject object, final long index, final Object value,
protected static final void doWriteGeneric(final Node node, final WeakVariablePointersObject object, final long index, final Object value,
@Exclusive @Cached final AbstractPointersObjectWriteNode writeNode) {
writeNode.execute(object, index, value);
writeNode.execute(node, object, index, value);
}

@Specialization(guards = {"cachedIndex == index", "object.getLayout() == cachedLayout", "cachedIndex >= cachedLayout.getInstSize()"}, //
Original file line number Diff line number Diff line change
@@ -61,8 +61,9 @@ protected static final void doArray(final ArrayObject obj, final long index, fin

@Specialization
protected static final void doPointers(final PointersObject obj, final long index, final Object value,
@Bind("this") final Node node,
@Cached final AbstractPointersObjectWriteNode writeNode) {
writeNode.execute(obj, (int) index, value);
writeNode.execute(node, obj, (int) index, value);
}

@Specialization
Original file line number Diff line number Diff line change
@@ -32,6 +32,7 @@
import de.hpi.swa.trufflesqueak.nodes.context.frame.FrameStackReadNode;
import de.hpi.swa.trufflesqueak.nodes.context.frame.GetContextOrMarkerNode;
import de.hpi.swa.trufflesqueak.nodes.context.frame.GetOrCreateContextNode;
import de.hpi.swa.trufflesqueak.nodes.dispatch.CreateFrameArgumentNodesFactory.CreateFrameArgumentsForDNUNodeGen;
import de.hpi.swa.trufflesqueak.nodes.dispatch.CreateFrameArgumentNodesFactory.CreateFrameArgumentsForIndirectCallNodeGen;
import de.hpi.swa.trufflesqueak.nodes.dispatch.CreateFrameArgumentNodesFactory.GetOrCreateContextOrMarkerNodeGen;
import de.hpi.swa.trufflesqueak.util.FrameAccess;
@@ -70,23 +71,26 @@ protected final Object getReceiver(final VirtualFrame frame) {
}
}

public static final class CreateFrameArgumentsForDNUNode extends AbstractCreateFrameArgumentsForExceptionalNode {
@Child private AbstractPointersObjectWriteNode writeNode = AbstractPointersObjectWriteNode.create();
@Child private SqueakObjectClassNode classNode = SqueakObjectClassNode.create();

private CreateFrameArgumentsForDNUNode(final VirtualFrame frame, final NativeObject selector, final int argumentCount) {
public abstract static class CreateFrameArgumentsForDNUNode extends AbstractCreateFrameArgumentsForExceptionalNode {
public CreateFrameArgumentsForDNUNode(final VirtualFrame frame, final NativeObject selector, final int argumentCount) {
super(frame, selector, argumentCount);
}

public static CreateFrameArgumentsForDNUNode create(final VirtualFrame frame, final NativeObject selector, final int argumentCount) {
return new CreateFrameArgumentsForDNUNode(frame, selector, argumentCount);
return CreateFrameArgumentsForDNUNodeGen.create(frame, selector, argumentCount);
}

public Object[] execute(final VirtualFrame frame, final Object sender) {
public abstract Object[] execute(VirtualFrame frame, Object sender);

@Specialization
protected final Object[] doCreate(final VirtualFrame frame, final Object sender,
@Bind("this") final Node node,
@Cached final SqueakObjectClassNode classNode,
@Cached final AbstractPointersObjectWriteNode writeNode) {
final Object receiver = getReceiver(frame);
final Object[] arguments = getArguments(frame, argumentNodes);
final ClassObject receiverClass = classNode.executeLookup(receiver);
final PointersObject message = getContext().newMessage(writeNode, selector, receiverClass, arguments);
final PointersObject message = getContext().newMessage(writeNode, node, selector, receiverClass, arguments);
return FrameAccess.newDNUWith(sender, receiver, message);
}
}
@@ -141,9 +145,10 @@ protected final Object[] doMethod(final VirtualFrame frame, final Object receive
@Specialization(guards = "lookupResult == null")
protected final Object[] doDoesNotUnderstand(final VirtualFrame frame, final Object receiver, final ClassObject receiverClass, @SuppressWarnings("unused") final Object lookupResult,
final CompiledCodeObject method,
@Bind("this") final Node node,
@Cached final AbstractPointersObjectWriteNode writeNode) {
final Object[] arguments = getArguments(frame, argumentNodes);
final PointersObject message = getContext().newMessage(writeNode, selector, receiverClass, arguments);
final PointersObject message = getContext().newMessage(writeNode, node, selector, receiverClass, arguments);
return FrameAccess.newDNUWith(senderNode.execute(frame, method), receiver, message);
}

Loading

0 comments on commit 374afd5

Please sign in to comment.