From e38242621d6f1f71315aa3efa93474c7cdf02f3f Mon Sep 17 00:00:00 2001 From: Aske Simon Christensen Date: Thu, 8 Dec 2022 22:11:32 +0000 Subject: [PATCH] [dart2wasm] Canonicalize boxed constant values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This saves space for the constant values, since the same value will use the same constant box object, and it avoids runtime allocation of boxes for literal values that are boxed directly. New passing tests: - language/super/bound_closure_test/01 - co19/LanguageFeatures/Patterns/constant_A05_t01 - co19/LibTest/collection/ListBase/ListBase_class_A01_t03 - co19/LibTest/collection/ListBase/ListBase_class_A01_t04 - co19/LibTest/collection/ListBase/ListBase_class_A01_t05 - co19/LibTest/collection/ListBase/ListBase_class_A01_t06 - co19/LibTest/collection/ListMixin/ListMixin_class_A01_t03 - co19/LibTest/collection/ListMixin/ListMixin_class_A01_t04 - co19/LibTest/collection/ListMixin/ListMixin_class_A01_t05 - co19/LibTest/collection/ListMixin/ListMixin_class_A01_t06 - co19/LibTest/core/List/List_all_t03 - co19/LibTest/core/List/List_all_t04 - co19/LibTest/core/List/List_all_t05 - co19/LibTest/core/List/List_all_t06 Change-Id: Id7570a2dd16f02590e722115e4d7168c4a741d99 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/273843 Commit-Queue: Aske Simon Christensen Reviewed-by: Ömer Ağacan --- pkg/dart2wasm/lib/code_generator.dart | 15 ++++--- pkg/dart2wasm/lib/constants.dart | 61 +++++++++++++++++---------- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/pkg/dart2wasm/lib/code_generator.dart b/pkg/dart2wasm/lib/code_generator.dart index 55db2d73030..adc9a1515fc 100644 --- a/pkg/dart2wasm/lib/code_generator.dart +++ b/pkg/dart2wasm/lib/code_generator.dart @@ -2389,20 +2389,23 @@ class CodeGenerator extends ExpressionVisitor1 @override w.ValueType visitBoolLiteral(BoolLiteral node, w.ValueType expectedType) { - b.i32_const(node.value ? 1 : 0); - return w.NumType.i32; + translator.constants.instantiateConstant( + function, b, BoolConstant(node.value), expectedType); + return expectedType; } @override w.ValueType visitIntLiteral(IntLiteral node, w.ValueType expectedType) { - b.i64_const(node.value); - return w.NumType.i64; + translator.constants.instantiateConstant( + function, b, IntConstant(node.value), expectedType); + return expectedType; } @override w.ValueType visitDoubleLiteral(DoubleLiteral node, w.ValueType expectedType) { - b.f64_const(node.value); - return w.NumType.f64; + translator.constants.instantiateConstant( + function, b, DoubleConstant(node.value), expectedType); + return expectedType; } @override diff --git a/pkg/dart2wasm/lib/constants.dart b/pkg/dart2wasm/lib/constants.dart index 108d18536a8..30dcdf52761 100644 --- a/pkg/dart2wasm/lib/constants.dart +++ b/pkg/dart2wasm/lib/constants.dart @@ -204,38 +204,25 @@ class ConstantInstantiator extends ConstantVisitor { return const w.RefType.none(nullable: true); } - w.ValueType _maybeBox(w.ValueType wasmType, void Function() pushValue) { - if (expectedType is w.RefType) { - ClassInfo info = translator.classInfo[translator.boxedClasses[wasmType]]!; - b.i32_const(info.classId); - pushValue(); - b.struct_new(info.struct); - return info.nonNullableType; - } else { - pushValue(); - return wasmType; - } - } - @override w.ValueType visitBoolConstant(BoolConstant constant) { - return _maybeBox(w.NumType.i32, () { - b.i32_const(constant.value ? 1 : 0); - }); + if (expectedType is w.RefType) return defaultConstant(constant); + b.i32_const(constant.value ? 1 : 0); + return w.NumType.i32; } @override w.ValueType visitIntConstant(IntConstant constant) { - return _maybeBox(w.NumType.i64, () { - b.i64_const(constant.value); - }); + if (expectedType is w.RefType) return defaultConstant(constant); + b.i64_const(constant.value); + return w.NumType.i64; } @override w.ValueType visitDoubleConstant(DoubleConstant constant) { - return _maybeBox(w.NumType.f64, () { - b.f64_const(constant.value); - }); + if (expectedType is w.RefType) return defaultConstant(constant); + b.f64_const(constant.value); + return w.NumType.f64; } } @@ -296,6 +283,36 @@ class ConstantCreator extends ConstantVisitor { @override ConstantInfo? defaultConstant(Constant constant) => null; + @override + ConstantInfo? visitBoolConstant(BoolConstant constant) { + ClassInfo info = translator.classInfo[translator.boxedBoolClass]!; + return createConstant(constant, info.nonNullableType, (function, b) { + b.i32_const(info.classId); + b.i32_const(constant.value ? 1 : 0); + b.struct_new(info.struct); + }); + } + + @override + ConstantInfo? visitIntConstant(IntConstant constant) { + ClassInfo info = translator.classInfo[translator.boxedIntClass]!; + return createConstant(constant, info.nonNullableType, (function, b) { + b.i32_const(info.classId); + b.i64_const(constant.value); + b.struct_new(info.struct); + }); + } + + @override + ConstantInfo? visitDoubleConstant(DoubleConstant constant) { + ClassInfo info = translator.classInfo[translator.boxedDoubleClass]!; + return createConstant(constant, info.nonNullableType, (function, b) { + b.i32_const(info.classId); + b.f64_const(constant.value); + b.struct_new(info.struct); + }); + } + @override ConstantInfo? visitStringConstant(StringConstant constant) { bool isOneByte = constant.value.codeUnits.every((c) => c <= 255);