Skip to content

Commit

Permalink
Ensure primitiveNodes are inserted
Browse files Browse the repository at this point in the history
  • Loading branch information
fniephaus committed Jan 27, 2025
1 parent b00b7f6 commit 26dbd1b
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -383,17 +383,22 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin

@Specialization(replaces = {"doNoPrimitive", "doCached"})
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver,
@Bind("this") final Node node) {
@Bind("this") final Node node,
@Cached(value = "method.getPrimitiveNodeOrNull()", allowUncached = true, neverDefault = false) final AbstractPrimitiveNode primitiveNodePlaceholder) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
if (primitiveNode != null) {
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver);
return tryPrimitive(primitiveNodePlaceholder, primitiveNode, frame.materialize(), node, method, receiver);
} else {
return null;
}
}

@TruffleBoundary
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver) {
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNodePlaceholder, final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node,
final CompiledCodeObject method, final Object receiver) {
if (primitiveNodePlaceholder != primitiveNode) {
primitiveNodePlaceholder.replace(primitiveNode);
}
try {
return ((Primitive0) primitiveNode).execute(frame, receiver);
} catch (final PrimitiveFailed pf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -383,18 +383,23 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin

@Specialization(replaces = {"doNoPrimitive", "doCached"})
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1,
@Bind("this") final Node node) {
@Bind("this") final Node node,
@Cached(value = "method.getPrimitiveNodeOrNull()", allowUncached = true, neverDefault = false) final AbstractPrimitiveNode primitiveNodePlaceholder) {

final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
if (primitiveNode != null) {
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1);
return tryPrimitive(primitiveNodePlaceholder, primitiveNode, frame.materialize(), node, method, receiver, arg1);
} else {
return null;
}
}

@TruffleBoundary
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
final Object arg1) {
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNodePlaceholder, final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node,
final CompiledCodeObject method, final Object receiver, final Object arg1) {
if (primitiveNodePlaceholder != primitiveNode) {
primitiveNodePlaceholder.replace(primitiveNode);
}
try {
return ((Primitive1) primitiveNode).execute(frame, receiver, arg1);
} catch (final PrimitiveFailed pf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -385,18 +385,22 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin

@Specialization(replaces = {"doNoPrimitive", "doCached"})
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2,
@Bind("this") final Node node) {
@Bind("this") final Node node,
@Cached(value = "method.getPrimitiveNodeOrNull()", allowUncached = true, neverDefault = false) final AbstractPrimitiveNode primitiveNodePlaceholder) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
if (primitiveNode != null) {
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2);
return tryPrimitive(primitiveNodePlaceholder, primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2);
} else {
return null;
}
}

@TruffleBoundary
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
final Object arg1, final Object arg2) {
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNodePlaceholder, final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node,
final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2) {
if (primitiveNodePlaceholder != primitiveNode) {
primitiveNodePlaceholder.replace(primitiveNode);
}
try {
return ((Primitive2) primitiveNode).execute(frame, receiver, arg1, arg2);
} catch (final PrimitiveFailed pf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -389,18 +389,22 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin

@Specialization(replaces = {"doNoPrimitive", "doCached"})
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3,
@Bind("this") final Node node) {
@Bind("this") final Node node,
@Cached(value = "method.getPrimitiveNodeOrNull()", allowUncached = true, neverDefault = false) final AbstractPrimitiveNode primitiveNodePlaceholder) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
if (primitiveNode != null) {
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3);
return tryPrimitive(primitiveNodePlaceholder, primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3);
} else {
return null;
}
}

@TruffleBoundary
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
final Object arg1, final Object arg2, final Object arg3) {
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNodePlaceholder, final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node,
final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3) {
if (primitiveNodePlaceholder != primitiveNode) {
primitiveNodePlaceholder.replace(primitiveNode);
}
try {
return ((Primitive3) primitiveNode).execute(frame, receiver, arg1, arg2, arg3);
} catch (final PrimitiveFailed pf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -394,18 +394,22 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
@Specialization(replaces = {"doNoPrimitive", "doCached"})
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3,
final Object arg4,
@Bind("this") final Node node) {
@Bind("this") final Node node,
@Cached(value = "method.getPrimitiveNodeOrNull()", allowUncached = true, neverDefault = false) final AbstractPrimitiveNode primitiveNodePlaceholder) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
if (primitiveNode != null) {
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3, arg4);
return tryPrimitive(primitiveNodePlaceholder, primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3, arg4);
} else {
return null;
}
}

@TruffleBoundary
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
final Object arg1, final Object arg2, final Object arg3, final Object arg4) {
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNodePlaceholder, final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node,
final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3, final Object arg4) {
if (primitiveNodePlaceholder != primitiveNode) {
primitiveNodePlaceholder.replace(primitiveNode);
}
try {
return ((Primitive4) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4);
} catch (final PrimitiveFailed pf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -398,18 +398,22 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
@Specialization(replaces = {"doNoPrimitive", "doCached"})
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3,
final Object arg4, final Object arg5,
@Bind("this") final Node node) {
@Bind("this") final Node node,
@Cached(value = "method.getPrimitiveNodeOrNull()", allowUncached = true, neverDefault = false) final AbstractPrimitiveNode primitiveNodePlaceholder) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
if (primitiveNode != null) {
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3, arg4, arg5);
return tryPrimitive(primitiveNodePlaceholder, primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3, arg4, arg5);
} else {
return null;
}
}

@TruffleBoundary
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
final Object arg1, final Object arg2, final Object arg3, final Object arg4, final Object arg5) {
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNodePlaceholder, final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node,
final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3, final Object arg4, final Object arg5) {
if (primitiveNodePlaceholder != primitiveNode) {
primitiveNodePlaceholder.replace(primitiveNode);
}
try {
return ((Primitive5) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4, arg5);
} catch (final PrimitiveFailed pf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -588,18 +588,22 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin

@Specialization(replaces = {"doNoPrimitive", "doCached"})
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object[] arguments,
@Bind("this") final Node node) {
@Bind("this") final Node node,
@Cached(value = "method.getPrimitiveNodeOrNull()", allowUncached = true, neverDefault = false) final AbstractPrimitiveNode primitiveNodePlaceholder) {
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
if (primitiveNode != null) {
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arguments);
return tryPrimitive(primitiveNodePlaceholder, primitiveNode, frame.materialize(), node, method, receiver, arguments);
} else {
return null;
}
}

@TruffleBoundary
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
final Object[] arguments) {
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNodePlaceholder, final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node,
final CompiledCodeObject method, final Object receiver, final Object[] arguments) {
if (primitiveNodePlaceholder != primitiveNode) {
primitiveNodePlaceholder.replace(primitiveNode);
}
try {
return primitiveNode.executeWithArguments(frame, receiver, arguments);
} catch (final PrimitiveFailed pf) {
Expand Down

1 comment on commit 26dbd1b

@TruffleSqueak-Bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Performance Report (26dbd1b)

Benchmarks ran on 23.0.2-graal.

Steady (after 100 iterations)

Benchmark Name Min Geomean Median Mean Max Total (ms) Total (min)
Bounce 531 546 535.16 532 535.13 107031 1.78
CD 580 597 585.55 581 585.52 117111 1.95
DeltaBlue 269 390 350.4 351 349.99 70080 1.17
Havlak 1250 1325 1293.43 1298 1293.32 258685 4.31
Json 360 376 364.42 361 364.38 72884 1.21
List 379 439 385.46 380 385.33 77091 1.28
Mandelbrot 129 153 131.04 130 131 26209 0.44
NBody 244 262 248.87 246 248.82 49774 0.83
Permute 231 247 233.88 232 233.83 46776 0.78
Queens 219 250 221.41 220 221.36 44281 0.74
Richards 1052 1071 1059.87 1061 1059.85 211973 3.53
Sieve 179 213 180.41 180 180.37 36081 0.6
Storage 191 208 195.35 192 195.28 39070 0.65
Towers 228 290 229.89 228 229.8 45977 0.77
5842 6367 6015.12 5992 6013.97 1203023 20.05

26dbd1b-2-steady.svg

Warmup (first 100 iterations)

26dbd1b-3-warmup.svg

Please sign in to comment.