Skip to content

Commit

Permalink
Profile class of primitive nodes in indirect sends
Browse files Browse the repository at this point in the history
  • Loading branch information
fniephaus committed Jan 4, 2025
1 parent 03c8f91 commit d6628f4
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.profiles.InlinedExactClassProfile;

import de.hpi.swa.trufflesqueak.exceptions.PrimitiveFailed;
import de.hpi.swa.trufflesqueak.exceptions.SqueakExceptions.SqueakException;
Expand Down Expand Up @@ -114,16 +115,17 @@ protected final Object doIndirect(final VirtualFrame frame, final Object receive
@Bind("this") final Node node,
@Cached final SqueakObjectClassNode classNode,
@Cached final ResolveMethodNode methodNode,
@Cached final InlinedExactClassProfile primitiveNodeProfile,
@Cached final CreateFrameArgumentsForIndirectCall0Node argumentsNode,
@Cached final IndirectCallNode callNode) {
final ClassObject receiverClass = classNode.executeLookup(node, receiver);
final Object lookupResult = getContext(node).lookup(receiverClass, selector);
final CompiledCodeObject method = methodNode.execute(node, getContext(node), receiverClass, lookupResult);
if (method.hasPrimitive()) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNode();
final Primitive0 primitiveNode = (Primitive0) primitiveNodeProfile.profile(node, method.getPrimitiveNode());
if (primitiveNode != null) {
try {
return ((Primitive0) primitiveNode).execute(frame, receiver);
return primitiveNode.execute(frame, receiver);
} catch (final PrimitiveFailed pf) {
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.profiles.InlinedExactClassProfile;

import de.hpi.swa.trufflesqueak.exceptions.PrimitiveFailed;
import de.hpi.swa.trufflesqueak.exceptions.SqueakExceptions.SqueakException;
Expand Down Expand Up @@ -115,16 +116,17 @@ protected final Object doIndirect(final VirtualFrame frame, final Object receive
@Bind("this") final Node node,
@Cached final SqueakObjectClassNode classNode,
@Cached final ResolveMethodNode methodNode,
@Cached final InlinedExactClassProfile primitiveNodeProfile,
@Cached final CreateFrameArgumentsForIndirectCall1Node argumentsNode,
@Cached final IndirectCallNode callNode) {
final ClassObject receiverClass = classNode.executeLookup(node, receiver);
final Object lookupResult = getContext(node).lookup(receiverClass, selector);
final CompiledCodeObject method = methodNode.execute(node, getContext(node), receiverClass, lookupResult);
if (method.hasPrimitive()) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNode();
final Primitive1 primitiveNode = (Primitive1) primitiveNodeProfile.profile(node, method.getPrimitiveNode());
if (primitiveNode != null) {
try {
return ((Primitive1) primitiveNode).execute(frame, receiver, arg1);
return primitiveNode.execute(frame, receiver, arg1);
} catch (final PrimitiveFailed pf) {
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.profiles.InlinedExactClassProfile;

import de.hpi.swa.trufflesqueak.exceptions.PrimitiveFailed;
import de.hpi.swa.trufflesqueak.exceptions.SqueakExceptions.SqueakException;
Expand Down Expand Up @@ -117,16 +118,17 @@ protected final Object doIndirect(final VirtualFrame frame, final Object receive
@Bind("this") final Node node,
@Cached final SqueakObjectClassNode classNode,
@Cached final ResolveMethodNode methodNode,
@Cached final InlinedExactClassProfile primitiveNodeProfile,
@Cached final CreateFrameArgumentsForIndirectCall2Node argumentsNode,
@Cached final IndirectCallNode callNode) {
final ClassObject receiverClass = classNode.executeLookup(node, receiver);
final Object lookupResult = getContext(node).lookup(receiverClass, selector);
final CompiledCodeObject method = methodNode.execute(node, getContext(node), receiverClass, lookupResult);
if (method.hasPrimitive()) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNode();
final Primitive2 primitiveNode = (Primitive2) primitiveNodeProfile.profile(node, method.getPrimitiveNode());
if (primitiveNode != null) {
try {
return ((Primitive2) primitiveNode).execute(frame, receiver, arg1, arg2);
return primitiveNode.execute(frame, receiver, arg1, arg2);
} catch (final PrimitiveFailed pf) {
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.profiles.InlinedExactClassProfile;

import de.hpi.swa.trufflesqueak.exceptions.PrimitiveFailed;
import de.hpi.swa.trufflesqueak.exceptions.SqueakExceptions.SqueakException;
Expand Down Expand Up @@ -119,16 +120,17 @@ protected final Object doIndirect(final VirtualFrame frame, final Object receive
@Bind("this") final Node node,
@Cached final SqueakObjectClassNode classNode,
@Cached final ResolveMethodNode methodNode,
@Cached final InlinedExactClassProfile primitiveNodeProfile,
@Cached final CreateFrameArgumentsForIndirectCall3Node argumentsNode,
@Cached final IndirectCallNode callNode) {
final ClassObject receiverClass = classNode.executeLookup(node, receiver);
final Object lookupResult = getContext(node).lookup(receiverClass, selector);
final CompiledCodeObject method = methodNode.execute(node, getContext(node), receiverClass, lookupResult);
if (method.hasPrimitive()) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNode();
final Primitive3 primitiveNode = (Primitive3) primitiveNodeProfile.profile(node, method.getPrimitiveNode());
if (primitiveNode != null) {
try {
return ((Primitive3) primitiveNode).execute(frame, receiver, arg1, arg2, arg3);
return primitiveNode.execute(frame, receiver, arg1, arg2, arg3);
} catch (final PrimitiveFailed pf) {
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.profiles.InlinedExactClassProfile;

import de.hpi.swa.trufflesqueak.exceptions.PrimitiveFailed;
import de.hpi.swa.trufflesqueak.exceptions.SqueakExceptions.SqueakException;
Expand Down Expand Up @@ -121,16 +122,17 @@ protected final Object doIndirect(final VirtualFrame frame, final Object receive
@Bind("this") final Node node,
@Cached final SqueakObjectClassNode classNode,
@Cached final ResolveMethodNode methodNode,
@Cached final InlinedExactClassProfile primitiveNodeProfile,
@Cached final CreateFrameArgumentsForIndirectCall4Node argumentsNode,
@Cached final IndirectCallNode callNode) {
final ClassObject receiverClass = classNode.executeLookup(node, receiver);
final Object lookupResult = getContext(node).lookup(receiverClass, selector);
final CompiledCodeObject method = methodNode.execute(node, getContext(node), receiverClass, lookupResult);
if (method.hasPrimitive()) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNode();
final Primitive4 primitiveNode = (Primitive4) primitiveNodeProfile.profile(node, method.getPrimitiveNode());
if (primitiveNode != null) {
try {
return ((Primitive4) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4);
return primitiveNode.execute(frame, receiver, arg1, arg2, arg3, arg4);
} catch (final PrimitiveFailed pf) {
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.profiles.InlinedExactClassProfile;

import de.hpi.swa.trufflesqueak.exceptions.PrimitiveFailed;
import de.hpi.swa.trufflesqueak.exceptions.SqueakExceptions.SqueakException;
Expand Down Expand Up @@ -124,16 +125,17 @@ protected final Object doIndirect(final VirtualFrame frame, final Object receive
@Bind("this") final Node node,
@Cached final SqueakObjectClassNode classNode,
@Cached final ResolveMethodNode methodNode,
@Cached final InlinedExactClassProfile primitiveNodeProfile,
@Cached final CreateFrameArgumentsForIndirectCall5Node argumentsNode,
@Cached final IndirectCallNode callNode) {
final ClassObject receiverClass = classNode.executeLookup(node, receiver);
final Object lookupResult = getContext(node).lookup(receiverClass, selector);
final CompiledCodeObject method = methodNode.execute(node, getContext(node), receiverClass, lookupResult);
if (method.hasPrimitive()) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNode();
final Primitive5 primitiveNode = (Primitive5) primitiveNodeProfile.profile(node, method.getPrimitiveNode());
if (primitiveNode != null) {
try {
return ((Primitive5) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4, arg5);
return primitiveNode.execute(frame, receiver, arg1, arg2, arg3, arg4, arg5);
} catch (final PrimitiveFailed pf) {
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.oracle.truffle.api.nodes.ExplodeLoop;
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.profiles.InlinedExactClassProfile;

import de.hpi.swa.trufflesqueak.exceptions.PrimitiveFailed;
import de.hpi.swa.trufflesqueak.exceptions.SqueakExceptions.SqueakException;
Expand Down Expand Up @@ -132,13 +133,14 @@ protected final Object doIndirect(final VirtualFrame frame, final Object receive
@Bind("this") final Node node,
@Cached final SqueakObjectClassNode classNode,
@Cached final ResolveMethodNode methodNode,
@Cached final InlinedExactClassProfile primitiveNodeProfile,
@Cached final CreateFrameArgumentsForIndirectCallNaryNode argumentsNode,
@Cached final IndirectCallNode callNode) {
final ClassObject receiverClass = classNode.executeLookup(node, receiver);
final Object lookupResult = getContext(node).lookup(receiverClass, selector);
final CompiledCodeObject method = methodNode.execute(node, getContext(node), receiverClass, lookupResult);
if (method.hasPrimitive()) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNode();
final AbstractPrimitiveNode primitiveNode = primitiveNodeProfile.profile(node, method.getPrimitiveNode());
if (primitiveNode != null) {
try {
return primitiveNode.executeWithArguments(frame, receiver, arguments);
Expand Down
Loading

0 comments on commit d6628f4

Please sign in to comment.