1
0
mirror of https://github.com/dart-lang/sdk synced 2024-07-01 07:14:29 +00:00

[dart2wasm] Switch binaryen optimization levels from -O3 to -Os

We want dart2wasm be comparable to dart2js / dart2aot, the ladder two
are much more conservative with inlining compared to current dart2wasm.

The -O3 is described in the binaryen sources as agressive for
performance and therefore willing to compromise code size.

The -Os is more nuanced: It will perform many optimizations that are
done in -O3 (and e.g. not in -O2) but it will make inlining less
agressive.

This reduces flute compile-time by 10% and code size by 10%
This benchmark results are mixed (some things get faster, some things
slower). Naturally there'll be specialized micro benchmarks that
get hit hard by this.

Where performance matters we should rather make dart2wasm use better
inlining heuristics and annotate code with
`@pragma('wasm:prefer-inline')`

Change-Id: Idf7e75e4e385629c9cec66359efe0afe50db3e72
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/352523
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
This commit is contained in:
Martin Kustermann 2024-02-14 13:45:13 +00:00 committed by Commit Queue
parent 2f0bbd9c09
commit af1b5b8044
14 changed files with 121 additions and 3 deletions

View File

@ -15,27 +15,33 @@ class MockClass {
List<int>.filled(int.parse('3'), int.parse('42'));
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
String get1() => str;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
List<int> get2() => list;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
void use1(String a0) => a0.length;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
void use2(String a0, List<int> a1) => a0.length + a1.length;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
void use4(String a0, List<int> a1, String a2, List<int> a3) =>
a0.length + a1.length + a2.length + a3.length;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
void use8(String a0, List<int> a1, String a2, List<int> a3, String a4,
List<int> a5, String a6, List<int> a7) =>
@ -49,6 +55,7 @@ class MockClass {
a7.length;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<void> asyncMethod() async {}
}
@ -58,26 +65,32 @@ class MockClass2 {
static int val2 = int.parse('43');
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int get1() => val1;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int get2() => val2;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
void use1(int a0) => a0;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
void use2(int a0, int a1) => a0 + a1;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
void use4(int a0, int a1, int a2, int a3) => a0 + a1 + a2 + a3;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<void> asyncMethod() async {}
}

View File

@ -103,6 +103,7 @@ Future main() async {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> performAwaitCallsClosureTargetPolymorphic(
FutureOr<int> Function(int) fun) async {
@ -115,6 +116,7 @@ Future<int> performAwaitCallsClosureTargetPolymorphic(
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> performAwaitAsyncCallsInstanceTargetPolymorphic(
Target target) async {
@ -127,6 +129,7 @@ Future<int> performAwaitAsyncCallsInstanceTargetPolymorphic(
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> performAwaitFutureCallsInstanceTargetPolymorphic(
Target target) async {
@ -139,6 +142,7 @@ Future<int> performAwaitFutureCallsInstanceTargetPolymorphic(
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> performAwaitFutureOrCallsInstanceTargetPolymorphic(
Target target) async {
@ -151,6 +155,7 @@ Future<int> performAwaitFutureOrCallsInstanceTargetPolymorphic(
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> performAwaitAsyncCalls() async {
int sum = 0;
@ -162,6 +167,7 @@ Future<int> performAwaitAsyncCalls() async {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> performAwaitFutureCalls() async {
int sum = 0;
@ -173,6 +179,7 @@ Future<int> performAwaitFutureCalls() async {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> performAwaitFutureOrCalls() async {
int sum = 0;
@ -184,6 +191,7 @@ Future<int> performAwaitFutureOrCalls() async {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> performAwaitAsyncCallsInstanceTargetPolymorphicManyAwaits(
Target t) async {
@ -284,6 +292,7 @@ Future<int> performAwaitAsyncCallsInstanceTargetPolymorphicManyAwaits(
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> performAwaitForIterationPolymorphic(
Stream<int> Function(int) fun) async {
@ -296,6 +305,7 @@ Future<int> performAwaitForIterationPolymorphic(
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int performSyncCallsClosureTarget(int Function(int) fun) {
int sum = 0;
@ -307,6 +317,7 @@ int performSyncCallsClosureTarget(int Function(int) fun) {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int performSyncCallsInstanceTargetPolymorphic(Target target) {
int sum = 0;
@ -318,6 +329,7 @@ int performSyncCallsInstanceTargetPolymorphic(Target target) {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int performSyncCalls() {
int sum = 0;
@ -329,6 +341,7 @@ int performSyncCalls() {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int performSyncIterationPolymorphic(Iterable<int> Function(int) fun) {
int sum = 0;
@ -340,18 +353,22 @@ int performSyncIterationPolymorphic(Iterable<int> Function(int) fun) {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
FutureOr<int> returnFutureOr(int i) => i;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> returnFuture(int i) => Future.value(i);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> returnAsync(int i) async => i;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Stream<int> generateNumbersAsyncStar(int limit) async* {
for (int i = 0; i < limit; ++i) {
@ -360,6 +377,7 @@ Stream<int> generateNumbersAsyncStar(int limit) async* {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Stream<int> generateNumbersAsyncStar2(int limit) async* {
for (int i = 0; i < limit; ++i) {
@ -368,6 +386,7 @@ Stream<int> generateNumbersAsyncStar2(int limit) async* {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Stream<int> generateNumbersManualAsync(int limit) {
int current = 0;
@ -395,10 +414,12 @@ Stream<int> generateNumbersManualAsync(int limit) {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int returnSync(int i) => i;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Iterable<int> generateNumbersSyncStar(int limit) sync* {
for (int i = 0; i < limit; ++i) {
@ -407,6 +428,7 @@ Iterable<int> generateNumbersSyncStar(int limit) sync* {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Iterable<int> generateNumbersSyncStar2(int limit) sync* {
for (int i = 0; i < limit; ++i) {
@ -415,11 +437,13 @@ Iterable<int> generateNumbersSyncStar2(int limit) sync* {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Iterable<int> generateNumbersManual(int limit) =>
Iterable<int>.generate(limit, (int i) => i);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Iterable<int> generateNumbersSyncStarManyYields(int limit) sync* {
int i = 0;
@ -574,6 +598,7 @@ Iterable<int> generateNumbersSyncStarManyYields(int limit) sync* {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Stream<int> generateNumbersAsyncStarManyYields(int limit) async* {
int i = 0;
@ -729,18 +754,22 @@ Stream<int> generateNumbersAsyncStarManyYields(int limit) async* {
class Target {
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
FutureOr<int> returnFutureOr(int i) => i;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> returnFuture(int i) => Future.value(i);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> returnAsync(int i) async => i;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int returnSync(int i) => i;
}
@ -748,21 +777,25 @@ class Target {
class Target2 extends Target {
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
FutureOr<int> returnFutureOr(int i) => i;
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> returnFuture(int i) => Future.value(i);
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> returnAsync(int i) async => i;
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int returnSync(int i) => i;
}
@ -770,21 +803,25 @@ class Target2 extends Target {
class Target3 extends Target {
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
FutureOr<int> returnFutureOr(int i) => i;
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> returnFuture(int i) => Future.value(i);
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Future<int> returnAsync(int i) async => i;
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
int returnSync(int i) => i;
}

View File

@ -50,40 +50,58 @@ void main() {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
void f1(String s) {}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
Function(String) c1 = (String s) => {};
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
void f2(String s, [String t = 'default']) {}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
Function(String, [String]) c2 = (String s, [String t = 'default']) => {};
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
void f3(String s, {String t = 'default'}) {}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
Function(String, {String t}) c3 = (String s, {String t = 'default'}) => {};
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic df1 = f1 as dynamic;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic dc1 = c1 as dynamic;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic df2 = f2 as dynamic;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic dc2 = c2 as dynamic;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic df3 = f3 as dynamic;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic dc3 = c3 as dynamic;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic df1NonCast(dynamic s) {}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
Function dc1NonCast = (dynamic s) => {};
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic df2NonCast(dynamic s, [dynamic t = 'default']) {}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
Function dc2NonCast = (dynamic s, [dynamic t = 'default']) => {};
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic df3NonCast(dynamic s, {dynamic t = 'default'}) {}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
Function dc3NonCast = (dynamic s, {dynamic t = 'default'}) => {};
class A {
@ -95,6 +113,7 @@ class B extends A {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic k = (A a) {};
class C {
@ -106,6 +125,7 @@ class D extends C {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
dynamic j = (C c) {};
class NonDynamicFunction extends BenchmarkBase {

View File

@ -1192,11 +1192,13 @@ class Instantiate1000 extends BenchmarkBase {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void blackhole<T>() => null;
class D<T> {
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
static void instantiate<S>() => blackhole<D<S>>();
}

View File

@ -70,11 +70,13 @@ class Instantiate$count extends BenchmarkBase {
output.write('''
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void blackhole<T>() => null;
class D<T> {
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
static void instantiate<S>() => blackhole<D<S>>();
}

View File

@ -180,6 +180,7 @@ class PolyBenchmark extends Benchmark {
/// This function is the inner loop of the benchmark.
@pragma('dart2js:noInline')
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
void sinkAll(Iterable iterable) {
for (final value in iterable) {
sink = value;

View File

@ -22,52 +22,64 @@ class ResultClass {
}
@pragma('vm:prefer-inline')
@pragma('wasm:prefer-inline')
@pragma('dart2js:prefer-inline')
List<Object> inlinedList() => [input1, input2];
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
List<Object> notInlinedList() => [input1, input2];
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
List<Object> forwardedList() => notInlinedList();
@pragma('vm:prefer-inline')
@pragma('wasm:prefer-inline')
@pragma('dart2js:prefer-inline')
ResultClass inlinedClass() => ResultClass(input1, input2);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
ResultClass notInlinedClass() => ResultClass(input1, input2);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
ResultClass forwardedClass() => notInlinedClass();
@pragma('vm:prefer-inline')
@pragma('wasm:prefer-inline')
@pragma('dart2js:prefer-inline')
(int, String) inlinedRecord() => (input1, input2);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
(int, String) notInlinedRecord() => (input1, input2);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
(int, String) forwardedRecord() => notInlinedRecord();
@pragma('vm:prefer-inline')
@pragma('wasm:prefer-inline')
@pragma('dart2js:prefer-inline')
({int result0, String result1}) inlinedRecordNamed() =>
(result0: input1, result1: input2);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
({int result0, String result1}) notInlinedRecordNamed() =>
(result0: input1, result1: input2);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
({int result0, String result1}) forwardedRecordNamed() =>
notInlinedRecordNamed();

View File

@ -25,6 +25,7 @@ class Pair {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
List<Object> getPolymorphicListOfClass(
int length, bool growable, bool withValues) {
@ -40,6 +41,7 @@ List<Object> getPolymorphicListOfClass(
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
List<Object> getPolymorphicListOfRecords(
int length, bool growable, bool withValues) {

View File

@ -3897,6 +3897,7 @@ class STCSame1000 extends STCBenchmarkBase {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void check<S>(dynamic s) => s as C<S> Function();

View File

@ -111,6 +111,7 @@ class STCSame$maxCount extends STCBenchmarkBase {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void check<S>(dynamic s) => s as C<S> Function();

View File

@ -13,12 +13,14 @@ class BenchTearOffInlined extends BenchmarkBase {
int sum = 0;
@pragma('vm:prefer-inline')
@pragma('wasm:prefer-inline')
@pragma('dart2js:prefer-inline')
void foo(int arg) {
sum += arg;
}
@pragma('vm:prefer-inline')
@pragma('wasm:prefer-inline')
@pragma('dart2js:prefer-inline')
void callIt(void Function(int) func, int arg) {
func(arg);
@ -26,6 +28,7 @@ class BenchTearOffInlined extends BenchmarkBase {
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void run() {
sum = 0;
@ -54,12 +57,14 @@ class BenchTearOffInlinedInTry extends BenchmarkBase {
int sum = 0;
@pragma('vm:prefer-inline')
@pragma('wasm:prefer-inline')
@pragma('dart2js:prefer-inline')
void foo(int arg) {
sum += arg;
}
@pragma('vm:prefer-inline')
@pragma('wasm:prefer-inline')
@pragma('dart2js:prefer-inline')
void callIt(void Function(int) func, int arg) {
func(arg);
@ -67,6 +72,7 @@ class BenchTearOffInlinedInTry extends BenchmarkBase {
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void run() {
sum = 0;
@ -97,12 +103,14 @@ class BenchTearOffNotInlined extends BenchmarkBase {
int sum = 0;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void foo(int arg) {
sum += arg;
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void callIt(void Function(int) func, int arg) {
func(arg);
@ -110,6 +118,7 @@ class BenchTearOffNotInlined extends BenchmarkBase {
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void run() {
sum = 0;
@ -138,12 +147,14 @@ class BenchTearOffNotInlinedInTry extends BenchmarkBase {
int sum = 0;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void foo(int arg) {
sum += arg;
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void callIt(void Function(int) func, int arg) {
func(arg);
@ -151,6 +162,7 @@ class BenchTearOffNotInlinedInTry extends BenchmarkBase {
@override
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
void run() {
sum = 0;

View File

@ -125,35 +125,43 @@ void main() {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Type getT<T>() => T;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Type getNullableT<T>() => MakeNullable<T?>;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Type getListOfT<T>() => List<T>;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Type getListOfNullableT<T>() => List<T?>;
class Foo<T> {
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Type getT() => T;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Type getNullableT() => MakeNullable<T?>;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Type getListOfT() => List<T>;
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:noInline')
Type getListOfNullableT() => List<T?>;
}

View File

@ -66,6 +66,7 @@ class Monomorphic extends Base {
/// can specialize the method according to different sets of input
/// implementation types.
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
static int sum(List<int> list) {
var s = 0;
@ -102,6 +103,7 @@ class Baseline extends Base {
super('TypedDataPoly.baseline', n);
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
static int sum(List<int> list) {
return list.length;
@ -141,6 +143,7 @@ class Polymorphic1 extends Base {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
static int sum(List<int> list) {
var s = 0;
@ -192,6 +195,7 @@ class Polymorphic2 extends Base {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
static int sum(List<int> list) {
var s = 0;
@ -235,6 +239,7 @@ class Polymorphic3 extends Base {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
static int sum(List<int> list) {
var s = 0;
@ -281,6 +286,7 @@ class Polymorphic4 extends Base {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
static int sum(List<int> list) {
var s = 0;
@ -360,6 +366,7 @@ class Polymorphic5 extends Base {
}
@pragma('vm:never-inline')
@pragma('wasm:never-inline')
@pragma('dart2js:never-inline')
static int sum(List<int> list) {
var s = 0;

View File

@ -545,12 +545,12 @@ class CompileWasmCommand extends CompileSubcommandCommand {
--closed-world
--traps-never-happen
--type-unfinalizing
-O3
-Os
--type-ssa
--gufa
-O3
-Os
--type-merging
-O1
-Os
--type-finalizing
'''); // end of binaryenFlags