Skip to content

Commit

Permalink
(Truffle optimizations) Final truffle optimizations (#379)
Browse files Browse the repository at this point in the history
- Separated pure records from records with duplicate keys
- Made more PE friendly nullables and tryables
- Fixed record operations to have a specialization instance per field
per operation (as truffle docs suggest)
- Added toString() overrides for better debugging
- Merged TreeMap implementation to get and put with one walk
- Added missing TruffleBoundaries
- Removed language and context storage from runtime objects. It can be
accessed from inside the nodes (also made it cached)
  • Loading branch information
alexzerntev authored Mar 29, 2024
1 parent 3807c62 commit c885796
Show file tree
Hide file tree
Showing 216 changed files with 8,150 additions and 4,522 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ trait CollectionRangeTest extends CompilerTestContext {
test("""Long.Range(0, 10)""")(_ should evaluateTo("[0L,1L,2L,3L,4L,5L,6L,7L,8L,9L]"))
test("""Long.Range(0, 1)""")(_ should evaluateTo("[0L]"))

test("""Collection.Filter(Long.Range(0, 1000000), x -> x == 999999)""")(
_ should evaluateTo("Collection.Build(999999L)")
)

// end = start
test("""Long.Range(0, 0)""")(_ should evaluateTo("[]"))
test("""Long.Range(12, 12)""")(_ should evaluateTo("[]"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,44 @@ trait Rql2TruffleCompilerServiceTestContext extends Rql2CompilerServiceTestConte
// Create an isolated Truffle Engine
val options = new java.util.HashMap[String, String]()
options.put("rql.settings", settings.renderAsString)
// //diagnostics
// options.put("engine.CompilationStatistics", "true")
// // options.put("engine.CompilationStatisticDetails", "true")
// // options.put("compiler.InstrumentBoundaries", "true")
// options.put("engine.CompilationFailureAction", "Diagnose")
// options.put("engine.TracePerformanceWarnings", "all")
// options.put("engine.TraceCompilation", "true")
// options.put("engine.TraceSplitting", "true")
// options.put("engine.TraceDeoptimizeFrame", "true")
// options.put("engine.TraceTransferToInterpreter", "true")
// options.put("engine.TraceCompilationPolymorphism", "true")
// options.put("engine.TraceSplittingSummary", "true")
// // options.put("engine.TraceCompilationDetails", "true")
//// options.put("engine.CompileImmediately", "true")
// options.put("engine.BackgroundCompilation", "false")
// options.put("engine.SpecializationStatistics", "false")
// options.put("engine.OSR", "false")

// // optimizations
// options.put("compiler.InlineAcrossTruffleBoundary", "true")
// options.put("engine.CompilerThreads", "24")
// options.put("engine.FirstTierCompilationThreshold", "100")
// options.put("engine.FirstTierMinInvokeThreshold", "5")
// options.put("engine.MinInvokeThreshold", "10")
// options.put("engine.Mode", "throughput")
// options.put("engine.MultiTier", "false")
// options.put("engine.OSR", "false")
// options.put("engine.PartialBlockCompilation", "false")
// options.put("engine.PartialBlockCompilationSize", "5000")
// options.put("engine.PartialBlockMaximumSize", "15000")
// options.put("engine.SingleTierCompilationThreshold", "500")
// options.put("engine.Splitting", "false")
// options.put("compiler.FirstTierUseEconomy", "false")
// options.put("compiler.InliningExpansionBudget", "20000")
// options.put("compiler.InliningInliningBudget", "20000")
// options.put("compiler.InliningRecursionDepth", "10")
// options.put("engine.IsolateMemoryProtection", "false")

engine = Engine
.newBuilder()
.allowExperimentalOptions(true)
Expand Down
9 changes: 7 additions & 2 deletions snapi-truffle/src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -303,8 +303,6 @@

exports raw.runtime.truffle;
exports raw.runtime.truffle.boundary;
exports raw.runtime.truffle.runtime.aggregation;
exports raw.runtime.truffle.runtime.aggregation.aggregator;
exports raw.runtime.truffle.runtime.record;
exports raw.runtime.truffle.runtime.operators;
exports raw.runtime.truffle.runtime.function;
Expand All @@ -314,6 +312,7 @@
exports raw.runtime.truffle.runtime.exceptions.csv;
exports raw.runtime.truffle.runtime.exceptions.binary;
exports raw.runtime.truffle.runtime.exceptions.rdbms;
exports raw.runtime.truffle.runtime.data_structures.treemap;
exports raw.runtime.truffle.runtime.primitives;
exports raw.runtime.truffle.runtime.list;
exports raw.runtime.truffle.runtime.or;
Expand Down Expand Up @@ -342,6 +341,7 @@
exports raw.runtime.truffle.runtime.iterable.sources;
exports raw.runtime.truffle.runtime.kryo;
exports raw.runtime.truffle.utils;
exports raw.runtime.truffle.tryable_nullable;
exports raw.runtime.truffle.ast;
exports raw.runtime.truffle.ast.io.kryo;
exports raw.runtime.truffle.ast.io.xml.parser;
Expand All @@ -357,6 +357,7 @@
exports raw.runtime.truffle.ast.io.binary;
exports raw.runtime.truffle.ast.local;
exports raw.runtime.truffle.ast.expressions.unary;
exports raw.runtime.truffle.ast.expressions.iterable;
exports raw.runtime.truffle.ast.expressions.iterable.collection;
exports raw.runtime.truffle.ast.expressions.iterable.list;
exports raw.runtime.truffle.ast.expressions.record;
Expand Down Expand Up @@ -387,7 +388,11 @@
exports raw.runtime.truffle.ast.expressions.builtin.string_package;
exports raw.runtime.truffle.ast.expressions.builtin.location_package;
exports raw.runtime.truffle.ast.expressions.builtin.binary_package;
exports raw.runtime.truffle.ast.expressions.aggregation;
exports raw.runtime.truffle.ast.controlflow;
exports raw.runtime.truffle.ast.osr;
exports raw.runtime.truffle.ast.osr.bodies;
exports raw.runtime.truffle.ast.osr.conditions;
exports raw.runtime.truffle.runtime.exceptions.validation;
exports raw.compiler.snapi.truffle.compiler;
exports raw.compiler.rql2output.truffle.builtin;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ public abstract class TruffleEmitter {

public abstract ClosureNode recurseLambda(TruffleBuildBody truffleBuildBody);

protected abstract RawLanguage getLanguage();
public abstract FrameDescriptor.Builder getFrameDescriptorBuilder();

public abstract RawLanguage getLanguage();

protected abstract StatementNode emitMethod(Rql2Method m);
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,15 @@ default ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage r
}

default ExpressionNode toTruffle(Type type, List<Rql2Arg> args, TruffleEmitter emitter) {
return toTruffle(
type,
args.stream()
.map(
a ->
new TruffleArg(
emitter.recurseExp(a.e()),
a.t(),
a.idn().isDefined() ? a.idn().get() : null))
.collect(Collectors.toList()),
emitter.getLanguage());
return toTruffle(type, rql2argsToTruffleArgs(args, emitter), emitter.getLanguage());
}

default List<TruffleArg> rql2argsToTruffleArgs(List<Rql2Arg> args, TruffleEmitter emitter) {
return args.stream()
.map(
a ->
new TruffleArg(
emitter.recurseExp(a.e()), a.t(), a.idn().isDefined() ? a.idn().get() : null))
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,30 @@

package raw.compiler.snapi.truffle.builtin.collection_extension;

import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.FrameSlotKind;
import java.util.List;
import raw.compiler.base.source.Type;
import raw.compiler.rql2.api.Rql2Arg;
import raw.compiler.rql2.builtin.CountCollectionEntry;
import raw.compiler.snapi.truffle.TruffleArg;
import raw.compiler.snapi.truffle.TruffleEmitter;
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionCountNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;

public class TruffleCountCollectionEntry extends CountCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionCountNodeGen.create(args.get(0).exprNode());
public ExpressionNode toTruffle(Type type, List<Rql2Arg> args, TruffleEmitter emitter) {
List<TruffleArg> truffleArgs = rql2argsToTruffleArgs(args, emitter);
FrameDescriptor.Builder builder = emitter.getFrameDescriptorBuilder();
int generatorSlot =
builder.addSlot(FrameSlotKind.Object, "generator", "a slot to store the generator of osr");
int resultSlot =
builder.addSlot(FrameSlotKind.Object, "result", "a slot to store the result of osr");
return new AggregateSingleNode(
truffleArgs.get(0).exprNode(), Aggregations.COUNT, generatorSlot, resultSlot);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,38 @@

package raw.compiler.snapi.truffle.builtin.collection_extension;

import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.FrameSlotKind;
import java.util.List;
import raw.compiler.base.source.Type;
import raw.compiler.rql2.api.Rql2Arg;
import raw.compiler.rql2.builtin.DistinctCollectionEntry;
import raw.compiler.rql2.source.Rql2IterableType;
import raw.compiler.rql2.source.Rql2TypeWithProperties;
import raw.compiler.snapi.truffle.TruffleArg;
import raw.compiler.snapi.truffle.TruffleEmitter;
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionDistinctNodeGen;

public class TruffleDistinctCollectionEntry extends DistinctCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
public ExpressionNode toTruffle(Type type, List<Rql2Arg> args, TruffleEmitter emitter) {
List<TruffleArg> truffleArgs = rql2argsToTruffleArgs(args, emitter);
FrameDescriptor.Builder builder = emitter.getFrameDescriptorBuilder();

int generatorSlot =
builder.addSlot(FrameSlotKind.Object, "generator", "a slot to store the generator of osr");

int offHeapDistinctSlot =
builder.addSlot(
FrameSlotKind.Object, "offHeapDistinct", "a slot to store the offHeapDistinct of osr");

return CollectionDistinctNodeGen.create(
args.get(0).exprNode(), (Rql2TypeWithProperties) ((Rql2IterableType) type).innerType());
truffleArgs.get(0).exprNode(),
(Rql2TypeWithProperties) ((Rql2IterableType) type).innerType(),
generatorSlot,
offHeapDistinctSlot);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,38 @@

package raw.compiler.snapi.truffle.builtin.collection_extension;

import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.FrameSlotKind;
import java.util.List;
import raw.compiler.base.source.Type;
import raw.compiler.rql2.api.Rql2Arg;
import raw.compiler.rql2.builtin.ExistsCollectionEntry;
import raw.compiler.rql2.source.FunType;
import raw.compiler.snapi.truffle.TruffleArg;
import raw.compiler.snapi.truffle.TruffleEmitter;
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionExistsNodeGen;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionExistsNode;

public class TruffleExistsCollectionEntry extends ExistsCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
FunType funType = (FunType) args.get(1).type();

return CollectionExistsNodeGen.create(args.get(0).exprNode(), args.get(1).exprNode());
public ExpressionNode toTruffle(Type type, List<Rql2Arg> args, TruffleEmitter emitter) {
List<TruffleArg> truffleArgs = rql2argsToTruffleArgs(args, emitter);
FrameDescriptor.Builder builder = emitter.getFrameDescriptorBuilder();
int generatorSlot =
builder.addSlot(FrameSlotKind.Object, "generator", "a slot to store the generator of osr");
int functionSlot =
builder.addSlot(FrameSlotKind.Object, "function", "a slot to store the function of osr");
int predicateResultSlot =
builder.addSlot(
FrameSlotKind.Boolean,
"predicateResult",
"a slot to store the result of applying the function");
return new CollectionExistsNode(
truffleArgs.get(0).exprNode(),
truffleArgs.get(1).exprNode(),
generatorSlot,
functionSlot,
predicateResultSlot);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,37 @@

package raw.compiler.snapi.truffle.builtin.collection_extension;

import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.FrameSlotKind;
import java.util.List;
import raw.compiler.base.source.Type;
import raw.compiler.rql2.api.Rql2Arg;
import raw.compiler.rql2.builtin.FilterCollectionEntry;
import raw.compiler.snapi.truffle.TruffleArg;
import raw.compiler.snapi.truffle.TruffleEmitter;
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionFilterNodeGen;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionFilterNode;

public class TruffleFilterCollectionEntry extends FilterCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionFilterNodeGen.create(args.get(0).exprNode(), args.get(1).exprNode());
public ExpressionNode toTruffle(Type type, List<Rql2Arg> args, TruffleEmitter emitter) {
List<TruffleArg> truffleArgs = rql2argsToTruffleArgs(args, emitter);
FrameDescriptor.Builder builder = emitter.getFrameDescriptorBuilder();
int collectionSlot =
builder.addSlot(
FrameSlotKind.Object, "collection", "a slot to store the collection of osr");
int predicateSlot =
builder.addSlot(FrameSlotKind.Object, "predicate", "a slot to store the predicate of osr");
int resultSlot =
builder.addSlot(FrameSlotKind.Object, "result", "a slot to store the result of osr");

return new CollectionFilterNode(
truffleArgs.get(0).exprNode(),
truffleArgs.get(1).exprNode(),
collectionSlot,
predicateSlot,
resultSlot);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,34 @@

package raw.compiler.snapi.truffle.builtin.collection_extension;

import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.FrameSlotKind;
import java.util.Arrays;
import java.util.List;
import raw.compiler.base.source.Type;
import raw.compiler.rql2.api.Rql2Arg;
import raw.compiler.rql2.builtin.GroupCollectionEntry;
import raw.compiler.rql2.source.*;
import raw.compiler.snapi.truffle.TruffleArg;
import raw.compiler.snapi.truffle.TruffleEmitter;
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionGroupByNodeGen;
import scala.collection.JavaConverters;
import scala.collection.immutable.HashSet;

public class TruffleGroupCollectionEntry extends GroupCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
public ExpressionNode toTruffle(Type type, List<Rql2Arg> args, TruffleEmitter emitter) {
List<TruffleArg> truffleArgs = rql2argsToTruffleArgs(args, emitter);
FrameDescriptor.Builder builder = emitter.getFrameDescriptorBuilder();

int generatorSlot =
builder.addSlot(FrameSlotKind.Object, "generator", "a slot to store the generator of osr");
int functionSlot =
builder.addSlot(FrameSlotKind.Object, "function", "a slot to store the function of osr");
int mapSlot = builder.addSlot(FrameSlotKind.Object, "map", "a slot to store the map of osr");

Rql2IterableType iterable = (Rql2IterableType) type;
Rql2RecordType record = (Rql2RecordType) iterable.innerType();
Expand Down Expand Up @@ -56,6 +67,12 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
Rql2TypeWithProperties valueType = (Rql2TypeWithProperties) iterableValueType.innerType();

return CollectionGroupByNodeGen.create(
args.get(0).exprNode(), args.get(1).exprNode(), keyType, valueType);
truffleArgs.get(0).exprNode(),
truffleArgs.get(1).exprNode(),
keyType,
valueType,
generatorSlot,
functionSlot,
mapSlot);
}
}
Loading

0 comments on commit c885796

Please sign in to comment.