Skip to content

Commit

Permalink
Create singleton primitives without reflection
Browse files Browse the repository at this point in the history
  • Loading branch information
fniephaus committed Dec 28, 2024
1 parent 9a54387 commit 93e5d87
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ public List<? extends NodeFactory<? extends AbstractPrimitiveNode>> getFactories
}

@Override
public List<Class<? extends AbstractSingletonPrimitiveNode>> getSingletonPrimitives() {
return List.of(PrimHasSecureHashPrimitiveNode.class);
public List<? extends AbstractSingletonPrimitiveNode> getSingletonPrimitives() {
return List.of(new PrimHasSecureHashPrimitiveNode());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public List<? extends NodeFactory<? extends AbstractPrimitiveNode>> getFactories
}

@Override
public List<Class<? extends AbstractSingletonPrimitiveNode>> getSingletonPrimitives() {
return List.of(PrimScreenScaleFactorNode.class, PrimHighResClockNode.class, PrimMultipleBytecodeSetsActive0Node.class, PrimUtcWithOffset1Node.class);
public List<? extends AbstractSingletonPrimitiveNode> getSingletonPrimitives() {
return List.of(new PrimScreenScaleFactorNode(), new PrimHighResClockNode(), new PrimMultipleBytecodeSetsActive0Node(), new PrimUtcWithOffset1Node());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public List<? extends NodeFactory<? extends AbstractPrimitiveNode>> getFactories
}

@Override
public List<Class<? extends AbstractSingletonPrimitiveNode>> getSingletonPrimitives() {
return List.of(PrimCanWriteImageNode.class, PrimGetUntrustedUserDirectoryNode.class);
public List<? extends AbstractSingletonPrimitiveNode> getSingletonPrimitives() {
return List.of(new PrimCanWriteImageNode(), new PrimGetUntrustedUserDirectoryNode());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
public abstract class AbstractPrimitiveFactoryHolder {
public abstract List<? extends NodeFactory<? extends AbstractPrimitiveNode>> getFactories();

public List<Class<? extends AbstractSingletonPrimitiveNode>> getSingletonPrimitives() {
public List<? extends AbstractSingletonPrimitiveNode> getSingletonPrimitives() {
return Collections.emptyList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,11 @@
*/
package de.hpi.swa.trufflesqueak.nodes.primitives;

import java.lang.reflect.InvocationTargetException;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.nodes.UnadoptableNode;

public abstract class AbstractSingletonPrimitiveNode extends AbstractPrimitiveNode implements UnadoptableNode {
private AbstractSingletonPrimitiveNode instance;

public static AbstractSingletonPrimitiveNode getInstance(final Class<? extends AbstractSingletonPrimitiveNode> primitiveClass) {
try {
final AbstractSingletonPrimitiveNode node = primitiveClass.getDeclaredConstructor().newInstance();
node.setInstance(node);
return node;
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
throw CompilerDirectives.shouldNotReachHere(e);
}
}

@Override
public final Object executeWithArguments(final VirtualFrame frame, final Object... receiverAndArguments) {
Expand All @@ -35,16 +21,11 @@ public final Object executeWithArguments(final VirtualFrame frame, final Object.

@Override
public final Node copy() {
return instance;
return this;
}

@Override
public final Node deepCopy() {
return instance;
}

private void setInstance(final AbstractSingletonPrimitiveNode node) {
assert instance == null;
instance = node;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -239,12 +239,11 @@ private static void fillPrimitiveTable(final AbstractPrimitiveFactoryHolder[] pr
addEntryToPrimitiveTable(index, nodeFactory);
}
}
for (final Class<? extends AbstractSingletonPrimitiveNode> primitiveClass : primitiveFactory.getSingletonPrimitives()) {
final SqueakPrimitive primitive = primitiveClass.getAnnotation(SqueakPrimitive.class);
for (final AbstractSingletonPrimitiveNode singletonPrimitiveNode : primitiveFactory.getSingletonPrimitives()) {
final SqueakPrimitive primitive = singletonPrimitiveNode.getClass().getAnnotation(SqueakPrimitive.class);
for (final int index : primitive.indices()) {
assert !SINGLETON_PRIMITIVE_TABLE.containsKey(index) && !PRIMITIVE_TABLE.containsKey(index);
final AbstractSingletonPrimitiveNode singleton = AbstractSingletonPrimitiveNode.newInstance(primitiveClass);
SINGLETON_PRIMITIVE_TABLE.put(index, singleton);
SINGLETON_PRIMITIVE_TABLE.put(index, singletonPrimitiveNode);
}
}
}
Expand Down Expand Up @@ -272,12 +271,11 @@ private static void fillPluginMap(final AbstractPrimitiveFactoryHolder[] plugins
PLUGIN_MAP.put(pluginName, functionNameToNodeFactory);

final EconomicMap<String, AbstractPrimitiveNode> functionNameToSingletonNode = EconomicMap.create(plugin.getSingletonPrimitives().size());
for (final Class<? extends AbstractSingletonPrimitiveNode> primitiveClass : plugin.getSingletonPrimitives()) {
final SqueakPrimitive primitive = primitiveClass.getAnnotation(SqueakPrimitive.class);
for (final AbstractSingletonPrimitiveNode singletonPrimitiveNode : plugin.getSingletonPrimitives()) {
final SqueakPrimitive primitive = singletonPrimitiveNode.getClass().getAnnotation(SqueakPrimitive.class);
for (final String name : primitive.names()) {
final AbstractSingletonPrimitiveNode singleton = AbstractSingletonPrimitiveNode.newInstance(primitiveClass);
assert !functionNameToSingletonNode.containsKey(name);
functionNameToSingletonNode.put(name, singleton);
functionNameToSingletonNode.put(name, singletonPrimitiveNode);
}
}
SINGLETON_PLUGIN_MAP.put(pluginName, functionNameToSingletonNode);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1369,17 +1369,17 @@ public List<NodeFactory<? extends AbstractPrimitiveNode>> getFactories() {
}

@Override
public List<Class<? extends AbstractSingletonPrimitiveNode>> getSingletonPrimitives() {
public List<? extends AbstractSingletonPrimitiveNode> getSingletonPrimitives() {
return List.of(
PrimQuickReturnTrueNode.class,
PrimQuickReturnFalseNode.class,
PrimQuickReturnNilNode.class,
PrimQuickReturnMinusOneNode.class,
PrimQuickReturnZeroNode.class,
PrimQuickReturnOneNode.class,
PrimQuickReturnTwoNode.class,
PrimBytesLeftNode.class,
PrimFullGCNode.class,
PrimIncrementalGCNode.class);
new PrimQuickReturnTrueNode(),
new PrimQuickReturnFalseNode(),
new PrimQuickReturnNilNode(),
new PrimQuickReturnMinusOneNode(),
new PrimQuickReturnZeroNode(),
new PrimQuickReturnOneNode(),
new PrimQuickReturnTwoNode(),
new PrimBytesLeftNode(),
new PrimFullGCNode(),
new PrimIncrementalGCNode());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1108,12 +1108,12 @@ public List<NodeFactory<? extends AbstractPrimitiveNode>> getFactories() {
}

@Override
public List<Class<? extends AbstractSingletonPrimitiveNode>> getSingletonPrimitives() {
public List<? extends AbstractSingletonPrimitiveNode> getSingletonPrimitives() {
return List.of(
PrimSecondClockNode.class,
PrimVMPathNode.class,
PrimMaxIdentityHashNode.class,
PrimUTCClockNode.class,
PrimLocalMicrosecondsClockNode.class);
new PrimSecondClockNode(),
new PrimVMPathNode(),
new PrimMaxIdentityHashNode(),
new PrimUTCClockNode(),
new PrimLocalMicrosecondsClockNode());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -698,7 +698,7 @@ public List<NodeFactory<? extends AbstractPrimitiveNode>> getFactories() {
}

@Override
public List<Class<? extends AbstractSingletonPrimitiveNode>> getSingletonPrimitives() {
return List.of(PrimSpecialObjectsArrayNode.class, PrimSomeObjectNode.class);
public List<? extends AbstractSingletonPrimitiveNode> getSingletonPrimitives() {
return List.of(new PrimSpecialObjectsArrayNode(), new PrimSomeObjectNode());
}
}

1 comment on commit 93e5d87

@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 (93e5d87)

Benchmarks ran on 23.0.1-graal.

Steady (after 100 iterations)

Benchmark Name Min Geomean Median Mean Max Total (ms) Total (min)
Bounce 532 607 542.57 533 542.23 108513 1.81
CD 468 495 473.97 470 473.92 94794 1.58
DeltaBlue 284 448 399.67 401.5 398.79 79933 1.33
Havlak 1110 1169 1139.84 1139.5 1139.78 227967 3.8
Json 341 357 344.62 342 344.58 68924 1.15
List 310 334 312.13 311 312.08 62425 1.04
Mandelbrot 129 146 129.99 130 129.96 25997 0.43
NBody 243 265 247.94 245 247.88 49588 0.83
Permute 155 169 156.26 156 156.24 31253 0.52
Queens 216 241 219.52 218 219.47 43904 0.73
Richards 1273 1290 1278.65 1275.5 1278.64 255729 4.26
Sieve 219 234 220.57 220 220.55 44113 0.74
Storage 142 157 144.41 142 144.34 28881 0.48
Towers 183 211 187.79 187 187.71 37557 0.63
5605 6123 5797.89 5770.5 5796.17 1159578 19.33

93e5d87-2-steady.svg

Warmup (first 100 iterations)

93e5d87-3-warmup.svg

Please sign in to comment.