Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(Truffle optimizations) Final truffle optimizations #379

Merged
merged 78 commits into from
Mar 29, 2024
Merged
Show file tree
Hide file tree
Changes from 69 commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
0c55576
updated aggregations
alexzerntev Feb 4, 2024
5046dfd
Headers
alexzerntev Feb 4, 2024
d04e19d
Finished joins
alexzerntev Feb 4, 2024
e5f17f0
Fixed tests
alexzerntev Feb 4, 2024
b6b4a35
Finished List OSR
alexzerntev Feb 4, 2024
bddc1cf
Added compilation finals
alexzerntev Feb 4, 2024
1fa3144
Finished iterables
alexzerntev Feb 5, 2024
f0d0335
Finished json reader
alexzerntev Feb 5, 2024
7131a7c
Merge remote-tracking branch 'origin/main' into RD-10562-implement-os…
alexzerntev Feb 15, 2024
4e3d069
Updated some OSR nodes according to comments
alexzerntev Feb 15, 2024
0efd125
finished list OSR
alexzerntev Feb 16, 2024
e376168
Updated compute next
alexzerntev Feb 16, 2024
4325af9
format
alexzerntev Feb 16, 2024
e6ea58c
Updated compute next
alexzerntev Feb 16, 2024
4db112c
Fix
alexzerntev Feb 16, 2024
bae21c9
Fix
alexzerntev Feb 16, 2024
6827dc0
Fix
alexzerntev Feb 16, 2024
61863b9
Fix
alexzerntev Feb 16, 2024
66ff36b
fixes
alexzerntev Feb 16, 2024
a471176
test
alexzerntev Feb 17, 2024
e54533e
fix
alexzerntev Feb 17, 2024
a9f0673
fix
alexzerntev Feb 17, 2024
a82c9fc
wip
alexzerntev Feb 17, 2024
637cbb4
wip
alexzerntev Feb 17, 2024
41d966b
added std deviation to metrics
alexzerntev Feb 18, 2024
8a05a1d
Added multirun
alexzerntev Feb 20, 2024
cd384cf
fixed filter OSR to use frame
alexzerntev Feb 20, 2024
499dca6
added osr Auxiliary slots
alexzerntev Feb 21, 2024
c72a0a2
Applied frame changes
alexzerntev Feb 21, 2024
bf96ff7
wip
alexzerntev Feb 24, 2024
d7b1dbc
finished lists
alexzerntev Feb 25, 2024
bddc147
wip
alexzerntev Feb 25, 2024
39922d6
finished OSR
alexzerntev Feb 26, 2024
f7ba5b4
fixed test
alexzerntev Feb 27, 2024
f3b117e
updated slots
alexzerntev Feb 27, 2024
c74d453
metrics
alexzerntev Mar 3, 2024
98e5020
Merge remote-tracking branch 'origin/main' into RD-10562-implement-os…
alexzerntev Mar 4, 2024
ac9af7e
metrics
alexzerntev Mar 4, 2024
e9d6a13
improvement
alexzerntev Mar 5, 2024
a62e98b
metrics
alexzerntev Mar 5, 2024
8e70955
initial commit
alexzerntev Mar 6, 2024
30c0ac0
wip
alexzerntev Mar 8, 2024
3aa33c9
improved time with manual tree map
alexzerntev Mar 9, 2024
4f30ab2
wip
alexzerntev Mar 9, 2024
770f9e3
Merge remote-tracking branch 'origin/main' into improve-record-perfor…
alexzerntev Mar 9, 2024
5eb96b5
stable
alexzerntev Mar 9, 2024
e356a9f
stable with order by
alexzerntev Mar 9, 2024
eb07862
wip
alexzerntev Mar 9, 2024
769ee3f
fix
alexzerntev Mar 9, 2024
0b61335
format
alexzerntev Mar 9, 2024
6fb78f6
fix
alexzerntev Mar 9, 2024
e31c17e
format
alexzerntev Mar 9, 2024
fa22914
initial commit
alexzerntev Mar 10, 2024
4d34f8f
removed unnneeded lang
alexzerntev Mar 10, 2024
3cb6136
rebase
alexzerntev Mar 10, 2024
edc2382
improvement
alexzerntev Mar 10, 2024
aa88721
improvement
alexzerntev Mar 10, 2024
9f2973a
fix and format
alexzerntev Mar 10, 2024
b0edfb6
fix
alexzerntev Mar 10, 2024
c7a11e9
removed shared
alexzerntev Mar 10, 2024
c73e041
wip
alexzerntev Mar 13, 2024
baa86c5
wip
alexzerntev Mar 15, 2024
d1d9eb3
wip
alexzerntev Mar 15, 2024
261917f
fixes
alexzerntev Mar 16, 2024
41c6c47
fixes
alexzerntev Mar 16, 2024
bd29f6c
wip
alexzerntev Mar 17, 2024
276b2a6
fixes
alexzerntev Mar 17, 2024
3c6d2f2
wip
alexzerntev Mar 17, 2024
7d07d8b
more metrics
alexzerntev Mar 19, 2024
8f91aa8
fixes
alexzerntev Mar 19, 2024
06dac26
update
alexzerntev Mar 20, 2024
1df8a75
fix possible bug of nested OSR nodes
alexzerntev Mar 21, 2024
baf641e
rebase
alexzerntev Mar 21, 2024
2756ec1
Removed sourceContext from runtime objects
alexzerntev Mar 22, 2024
a7e1606
Cached context values and fixed osr in compute next nodes
alexzerntev Mar 22, 2024
9825a8d
updated records to also differentiate between boolean,short,byte,float
alexzerntev Mar 27, 2024
6cae1dc
fix
alexzerntev Mar 27, 2024
3f0f963
fix
alexzerntev Mar 27, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -15,39 +15,39 @@ package raw.compiler.rql2.tests.builtin
import raw.compiler.rql2.tests.CompilerTestContext

trait RecordPackageTest extends CompilerTestContext {

test("""Record.Build(a = 1, b = "Hello")""".stripMargin)(_ should (typeAs("record(a: int, b: string)") and run))

test("""Record.Build(a = 1, a = 3, b = "Hello")""".stripMargin)(it =>
it should typeAs("record(a: int, a: int, b: string)")
)

test("""(Record.Build(a = 1, b = "Hello")).a""".stripMargin) { it =>
it should typeAs("int")
it should evaluateTo("1")
}

test("""(Record.Build(a = 1, b = "Hello")).b""".stripMargin) { it =>
it should typeAs("string")
it should evaluateTo(""" "Hello" """)
}

test("""(Record.Build(a = 1, b = "Hello")).c""".stripMargin)(it =>
it should typeErrorAs("expected package, record, collection or list with field c but got record(a: int,b: string)")
)

test("""
|let r = Record.Build(a = 1, b = "Hello")
|in
| Record.AddField(r, a = "World")""".stripMargin)(it => it should typeErrorAs("field already exists in record"))

test("""
|let r = Record.Build(a = 1, b = "Hello")
|in
| Record.AddField(r, c = "World")""".stripMargin) { it =>
it should typeAs("record(a: int, b: string, c: string)")
it should evaluateTo("""Record.Build(a=1, b="Hello", c="World")""")
}
//
// test("""Record.Build(a = 1, b = "Hello")""".stripMargin)(_ should (typeAs("record(a: int, b: string)") and run))
//
// test("""Record.Build(a = 1, a = 3, b = "Hello")""".stripMargin)(it =>
// it should typeAs("record(a: int, a: int, b: string)")
// )
//
// test("""(Record.Build(a = 1, b = "Hello")).a""".stripMargin) { it =>
// it should typeAs("int")
// it should evaluateTo("1")
// }
//
// test("""(Record.Build(a = 1, b = "Hello")).b""".stripMargin) { it =>
// it should typeAs("string")
// it should evaluateTo(""" "Hello" """)
// }
//
// test("""(Record.Build(a = 1, b = "Hello")).c""".stripMargin)(it =>
// it should typeErrorAs("expected package, record, collection or list with field c but got record(a: int,b: string)")
// )
//
// test("""
// |let r = Record.Build(a = 1, b = "Hello")
// |in
// | Record.AddField(r, a = "World")""".stripMargin)(it => it should typeErrorAs("field already exists in record"))

// test("""
// |let r = Record.Build(a = 1, b = "Hello")
// |in
// | Record.AddField(r, c = "World")""".stripMargin) { it =>
// it should typeAs("record(a: int, b: string, c: string)")
// it should evaluateTo("""Record.Build(a=1, b="Hello", c="World")""")
// }

test("""
|let r = Record.Build(a = 1, b = "Hello")
Expand Down
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,43 @@ 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")

// // 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
10 changes: 8 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,8 +388,13 @@
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;
exports raw.runtime.truffle.runtime.generator.collection.off_heap_generator;
}
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.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 @@ -19,12 +19,12 @@
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());
return new CollectionFilterNode(args.get(0).exprNode(), args.get(1).exprNode());
}
}
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.LastCollectionEntry;
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.CollectionLastNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;

public class TruffleLastCollectionEntry extends LastCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionLastNodeGen.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.LAST, generatorSlot, resultSlot);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,29 @@

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.MaxCollectionEntry;
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.CollectionMaxNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;

public class TruffleMaxCollectionEntry extends MaxCollectionEntry implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionMaxNodeGen.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.MAX, generatorSlot, resultSlot);
}
}
Loading
Loading