Skip to content

Commit

Permalink
Merge caa0567 into 7c0b8a1
Browse files Browse the repository at this point in the history
  • Loading branch information
smarr committed Jun 20, 2020
2 parents 7c0b8a1 + caa0567 commit 157111f
Show file tree
Hide file tree
Showing 28 changed files with 210 additions and 83 deletions.
18 changes: 18 additions & 0 deletions core-lib/Benchmarks/Savina.ns
Expand Up @@ -62,6 +62,24 @@ class Savina usingPlatform: platform andHarness: harness = Value (
)
)

(** Used as baseline to determine the size of the benchmarks **)
public class Empty = Benchmark <: Value (
)(
public benchmark = (
| completionPP |
completionPP:: actors createPromisePair.
completionPP resolver resolve: 0.
^ completionPP promise
)

public verifyResult: result = (
^ true
)
) : (
public newInstance: problemSize = ( ^ self new )
public setupVerifiedRun: run = ( run problemSize: 1 )
)

(* === Savina Microbenchmarks === *)

public class PingPong new: numPings = Benchmark <: Value (
Expand Down
9 changes: 6 additions & 3 deletions src/som/interpreter/nodes/MessageSendNode.java
Expand Up @@ -2,7 +2,7 @@

import static som.interpreter.nodes.SOMNode.unwrapIfNecessary;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;

import com.oracle.truffle.api.CompilerAsserts;
Expand Down Expand Up @@ -37,6 +37,7 @@
import som.vm.Primitives;
import som.vmobjects.SSymbol;
import tools.dym.Tags.VirtualInvoke;
import tools.dym.profiles.DispatchProfile;


public final class MessageSendNode {
Expand Down Expand Up @@ -321,7 +322,8 @@ protected GenericMessageSendNode makeSend() {
}
}

public static final class GenericMessageSendNode extends AbstractMessageSendNode {
public static final class GenericMessageSendNode extends AbstractMessageSendNode
implements DispatchProfile {

private final SSymbol selector;

Expand Down Expand Up @@ -393,7 +395,8 @@ public NodeCost getCost() {
return Cost.getCost(dispatchNode);
}

public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
@Override
public void collectDispatchStatistics(final Map<Invokable, Integer> result) {
dispatchNode.collectDispatchStatistics(result);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/som/interpreter/nodes/dispatch/AbstractDispatchNode.java
@@ -1,6 +1,6 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;
import java.util.Map;

import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.instrumentation.GenerateWrapper;
Expand Down Expand Up @@ -48,5 +48,5 @@ public WrapperNode createWrapper(final ProbeNode probe) {
return new AbstractDispatchNodeWrapper(this, probe);
}

public abstract void collectDispatchStatistics(HashMap<Invokable, Integer> result);
public abstract void collectDispatchStatistics(Map<Invokable, Integer> result);
}
@@ -1,5 +1,7 @@
package som.interpreter.nodes.dispatch;

import java.util.Map;

import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.VirtualFrame;
Expand All @@ -8,10 +10,12 @@

import som.Output;
import som.VM;
import som.interpreter.Invokable;
import som.interpreter.SArguments;
import som.interpreter.SomLanguage;
import som.interpreter.Types;
import som.primitives.SystemPrims.PrintStackTracePrim;
import som.vm.NotYetImplementedException;
import som.vm.VmSettings;
import som.vmobjects.SArray;
import som.vmobjects.SClass;
Expand Down Expand Up @@ -67,4 +71,9 @@ public static Object performDnu(final Object[] arguments, final Object rcvr,
public final int lengthOfDispatchChain() {
return 1000;
}

@Override
public final void collectDispatchStatistics(final Map<Invokable, Integer> result) {
throw new NotYetImplementedException();
}
}
4 changes: 2 additions & 2 deletions src/som/interpreter/nodes/dispatch/CachedDispatchNode.java
@@ -1,6 +1,6 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;
import java.util.Map;

import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.api.CompilerDirectives;
Expand Down Expand Up @@ -52,7 +52,7 @@ public int lengthOfDispatchChain() {
}

@Override
public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
public void collectDispatchStatistics(final Map<Invokable, Integer> result) {
CountingDirectCallNode node = (CountingDirectCallNode) this.cachedMethod;
result.put(node.getInvokable(), node.getCount());
nextInCache.collectDispatchStatistics(result);
Expand Down
4 changes: 2 additions & 2 deletions src/som/interpreter/nodes/dispatch/CachedDnuNode.java
@@ -1,6 +1,6 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;
import java.util.Map;

import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
Expand Down Expand Up @@ -87,7 +87,7 @@ public static CallTarget getDnu(final SClass rcvrClass,
}

@Override
public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
public void collectDispatchStatistics(final Map<Invokable, Integer> result) {
CountingDirectCallNode node = (CountingDirectCallNode) this.cachedMethod;
result.put(node.getInvokable(), node.getCount());
nextInCache.collectDispatchStatistics(result);
Expand Down
4 changes: 2 additions & 2 deletions src/som/interpreter/nodes/dispatch/CachedSlotRead.java
@@ -1,6 +1,6 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;
import java.util.Map;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
Expand Down Expand Up @@ -79,7 +79,7 @@ public int lengthOfDispatchChain() {
}

@Override
public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
public void collectDispatchStatistics(final Map<Invokable, Integer> result) {
// This is a slot access, so, not a invocation target
// NO OP
}
Expand Down
4 changes: 2 additions & 2 deletions src/som/interpreter/nodes/dispatch/CachedSlotWrite.java
@@ -1,6 +1,6 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;
import java.util.Map;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
Expand Down Expand Up @@ -71,7 +71,7 @@ public boolean hasTag(final Class<? extends Tag> tag) {
}

@Override
public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
public void collectDispatchStatistics(final Map<Invokable, Integer> result) {
// This is a slot access, so, not a invocation target
// NO OP
}
Expand Down
4 changes: 2 additions & 2 deletions src/som/interpreter/nodes/dispatch/ForeignDispatchNode.java
@@ -1,6 +1,6 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;
import java.util.Map;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
Expand Down Expand Up @@ -81,7 +81,7 @@ public int lengthOfDispatchChain() {
}

@Override
public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
public void collectDispatchStatistics(final Map<Invokable, Integer> result) {
throw new NotYetImplementedException();
}
}
9 changes: 0 additions & 9 deletions src/som/interpreter/nodes/dispatch/GenericDispatchNode.java
@@ -1,14 +1,10 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;

import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.source.SourceSection;

import som.compiler.AccessModifier;
import som.compiler.MixinBuilder.MixinDefinitionId;
import som.interpreter.Invokable;
import som.vm.NotYetImplementedException;
import som.vmobjects.SClass;
import som.vmobjects.SSymbol;

Expand All @@ -34,9 +30,4 @@ protected Dispatchable doLookup(final SClass rcvrClass) {
return rcvrClass.lookupMessage(selector, minimalVisibility);
}
}

@Override
public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
throw new NotYetImplementedException();
}
}
@@ -1,14 +1,10 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;

import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.source.SourceSection;

import som.compiler.AccessModifier;
import som.compiler.MixinBuilder.MixinDefinitionId;
import som.interpreter.Invokable;
import som.vm.NotYetImplementedException;
import som.vmobjects.SClass;
import som.vmobjects.SSymbol;

Expand Down Expand Up @@ -48,9 +44,4 @@ public static Dispatchable lookup(final SClass rcvrClass, final SSymbol selector
return getSuperClass(rcvrClass, holderMixin, classSide).lookupMessage(
selector, AccessModifier.PROTECTED);
}

@Override
public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
throw new NotYetImplementedException();
}
}
@@ -1,6 +1,6 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;
import java.util.Map;

import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.api.Truffle;
Expand Down Expand Up @@ -36,7 +36,7 @@ public Object executeDispatch(final VirtualFrame frame, final Object[] arguments
}

@Override
public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
public void collectDispatchStatistics(final Map<Invokable, Integer> result) {
CountingDirectCallNode node = (CountingDirectCallNode) this.cachedMethod;
result.put(node.getInvokable(), node.getCount());
}
Expand Down
@@ -1,6 +1,6 @@
package som.interpreter.nodes.dispatch;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;

import com.oracle.truffle.api.CompilerAsserts;
Expand Down Expand Up @@ -176,7 +176,7 @@ private AbstractDispatchNode specialize(final Object[] arguments) {
}

@Override
public void collectDispatchStatistics(final HashMap<Invokable, Integer> result) {
public void collectDispatchStatistics(final Map<Invokable, Integer> result) {
// This is the end of the chain
// NO OP
}
Expand Down
5 changes: 5 additions & 0 deletions src/som/interpreter/nodes/nary/EagerBinaryPrimitiveNode.java
Expand Up @@ -27,6 +27,11 @@ public EagerBinaryPrimitiveNode(final SSymbol selector, final ExpressionNode rec
this.primitive = insert(primitive);
}

@Override
protected ExpressionNode getPrimitive() {
return primitive;
}

@Override
public boolean hasTag(final Class<? extends Tag> tag) {
assert !(primitive instanceof WrapperNode) : "primitive can't be WrapperNodes to avoid double wrapping. It is: "
Expand Down
11 changes: 11 additions & 0 deletions src/som/interpreter/nodes/nary/EagerPrimitiveNode.java
Expand Up @@ -18,4 +18,15 @@ protected EagerPrimitiveNode(final SSymbol selector) {
public SSymbol getInvocationIdentifier() {
return selector;
}

protected abstract ExpressionNode getPrimitive();

public static ExpressionNode unwrapIfNecessary(final ExpressionNode node) {
if (node instanceof EagerPrimitiveNode) {
EagerPrimitiveNode n = (EagerPrimitiveNode) node;
return n.getPrimitive();
} else {
return node;
}
}
}
5 changes: 5 additions & 0 deletions src/som/interpreter/nodes/nary/EagerTernaryPrimitiveNode.java
Expand Up @@ -31,6 +31,11 @@ public EagerTernaryPrimitiveNode(final SSymbol selector, final ExpressionNode re
this.primitive = insert(primitive);
}

@Override
protected ExpressionNode getPrimitive() {
return primitive;
}

@Override
public boolean hasTag(final Class<? extends Tag> tag) {
assert !(primitive instanceof WrapperNode) : "Eager primitives are expected to point directly to primitive nodes, and do not have wrapper nodes. I think, we wanted the wrapper nodes to be strictly around the eager wrappers.";
Expand Down
5 changes: 5 additions & 0 deletions src/som/interpreter/nodes/nary/EagerUnaryPrimitiveNode.java
Expand Up @@ -25,6 +25,11 @@ public EagerUnaryPrimitiveNode(final SSymbol selector, final ExpressionNode rece
this.primitive = insert(primitive);
}

@Override
protected ExpressionNode getPrimitive() {
return primitive;
}

@Override
public boolean hasTag(final Class<? extends Tag> tag) {
assert !(primitive instanceof WrapperNode);
Expand Down
5 changes: 3 additions & 2 deletions src/som/interpreter/nodes/specialized/AndMessageNode.java
Expand Up @@ -24,8 +24,9 @@


@GenerateNodeFactory
@Primitive(selector = "and:", noWrapper = true, specializer = AndOrSplzr.class)
@Primitive(selector = "&&", noWrapper = true, specializer = AndOrSplzr.class)
@Primitive(selector = "and:", noWrapper = true, specializer = AndOrSplzr.class,
disabled = true)
@Primitive(selector = "&&", noWrapper = true, specializer = AndOrSplzr.class, disabled = true)
public abstract class AndMessageNode extends BinaryComplexOperation {
public static class AndOrSplzr extends Specializer<VM, ExpressionNode, SSymbol> {
protected final NodeFactory<ExpressionNode> boolFact;
Expand Down
Expand Up @@ -61,8 +61,8 @@ protected final boolean evaluateArgument(final VirtualFrame frame) {
}
}

@Inline(selector = "and:", inlineableArgIdx = 1)
@Inline(selector = "&&", inlineableArgIdx = 1)
@Inline(selector = "and:", inlineableArgIdx = 1, disabled = true)
@Inline(selector = "&&", inlineableArgIdx = 1, disabled = true)
public static final class AndInlinedLiteralNode extends BooleanInlinedLiteralNode {

public AndInlinedLiteralNode(final ExpressionNode receiverNode,
Expand All @@ -85,8 +85,8 @@ public boolean executeBoolean(final VirtualFrame frame) {
}
}

@Inline(selector = "or:", inlineableArgIdx = 1)
@Inline(selector = "||", inlineableArgIdx = 1)
@Inline(selector = "or:", inlineableArgIdx = 1, disabled = true)
@Inline(selector = "||", inlineableArgIdx = 1, disabled = true)
public static final class OrInlinedLiteralNode extends BooleanInlinedLiteralNode {

public OrInlinedLiteralNode(final ExpressionNode receiverNode,
Expand Down
4 changes: 2 additions & 2 deletions src/som/interpreter/nodes/specialized/OrMessageNode.java
Expand Up @@ -19,8 +19,8 @@


@GenerateNodeFactory
@Primitive(selector = "or:", noWrapper = true, specializer = OrSplzr.class)
@Primitive(selector = "||", noWrapper = true, specializer = OrSplzr.class)
@Primitive(selector = "or:", noWrapper = true, specializer = OrSplzr.class, disabled = true)
@Primitive(selector = "||", noWrapper = true, specializer = OrSplzr.class, disabled = true)
public abstract class OrMessageNode extends BinaryComplexOperation {
public static final class OrSplzr extends AndOrSplzr {
@SuppressWarnings({"unchecked", "rawtypes"})
Expand Down

0 comments on commit 157111f

Please sign in to comment.