Use constant evaluation in allocator analysis
Change-Id: I93543c7f295d4b325a34ced632c2d0a7555391e6
Reviewed-on: https://dart-review.googlesource.com/c/92421
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Stephen Adams <sra@google.com>
diff --git a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
index 123f627..631d3cf 100644
--- a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
@@ -47,20 +47,11 @@
Map<ir.Field, ConstantValue> inits = {};
for (ir.Field field in classNode.fields) {
if (!field.isInstanceMember) continue;
- ir.Expression initializer = field.initializer;
- // TODO(sra): Should really be using constant evaluator to determine
- // value.
- if (initializer == null || initializer is ir.NullLiteral) {
- inits[field] = const NullConstantValue();
- } else if (initializer is ir.IntLiteral) {
- BigInt intValue = BigInt.from(initializer.value).toUnsigned(64);
- inits[field] = IntConstantValue(intValue);
- } else if (initializer is ir.BoolLiteral) {
- inits[field] = BoolConstantValue(initializer.value);
- } else if (initializer is ir.StringLiteral) {
- if (initializer.value.length <= 20) {
- inits[field] = StringConstantValue(initializer.value);
- }
+ ir.Expression expression = field.initializer;
+ ConstantValue value = _elementMap.getConstantValue(expression,
+ requireConstant: false, implicitNull: true);
+ if (value != null && value.isConstant) {
+ inits[field] = value;
}
}
@@ -124,12 +115,11 @@
var result = JAllocatorAnalysis._();
kAnalysis._fixedInitializers.forEach((KField kField, ConstantValue value) {
- // TODO(sra): Translate constant, but Null and these primitives do not
- // need translating.
if (value.isNull || value.isInt || value.isBool || value.isString) {
+ // TODO(johnniwinther): Support non-primitive constants.
JField jField = map.toBackendMember(kField);
if (jField != null) {
- result._fixedInitializers[jField] = value;
+ result._fixedInitializers[jField] = map.toBackendConstant(value);
}
}
});
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 8fd2d17..3a22be9 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -108,8 +108,6 @@
js.Name getNameForJsGetName(ConstantValue constant, Namer namer);
/// Computes the [ConstantValue] for the constant [expression].
- // TODO(johnniwinther): Move to [KernelToElementMapForBuilding]. This is only
- // used in impact builder for symbol constants.
ConstantValue getConstantValue(ir.Expression expression,
{bool requireConstant: true, bool implicitNull: false});
diff --git a/tests/compiler/dart2js/allocator_analysis/jdata/simple_initializers.dart b/tests/compiler/dart2js/allocator_analysis/jdata/simple_initializers.dart
index be12d6c..05a5f22 100644
--- a/tests/compiler/dart2js/allocator_analysis/jdata/simple_initializers.dart
+++ b/tests/compiler/dart2js/allocator_analysis/jdata/simple_initializers.dart
@@ -46,10 +46,10 @@
/*element: Class1.field11:*/
var field11 = #foo;
- /*element: Class1.field12:*/
+ /*element: Class1.field12:initial=IntConstant(5)*/
var field12 = 2 + 3;
- /*element: Class1.field13:*/
+ /*element: Class1.field13:initial=BoolConstant(true)*/
var field13 = const1;
}
diff --git a/tests/compiler/dart2js/allocator_analysis/kdata/simple_initializers.dart b/tests/compiler/dart2js/allocator_analysis/kdata/simple_initializers.dart
index be12d6c..3504415 100644
--- a/tests/compiler/dart2js/allocator_analysis/kdata/simple_initializers.dart
+++ b/tests/compiler/dart2js/allocator_analysis/kdata/simple_initializers.dart
@@ -34,23 +34,26 @@
/*element: Class1.field7:initial=StringConstant("foo")*/
var field7 = 'foo';
- /*element: Class1.field8:*/
+ /*element: Class1.field8:initial=DoubleConstant(0.5)*/
var field8 = 0.5;
- /*element: Class1.field9:*/
+ /*element: Class1.field9:initial=ListConstant([])*/
var field9 = const [];
- /*element: Class1.field10:*/
+ /*element: Class1.field10:initial=MapConstant({})*/
var field10 = const {};
- /*element: Class1.field11:*/
+ /*element: Class1.field11:initial=ConstructedConstant(Symbol(_name=StringConstant("foo")))*/
var field11 = #foo;
- /*element: Class1.field12:*/
+ /*element: Class1.field12:initial=IntConstant(5)*/
var field12 = 2 + 3;
- /*element: Class1.field13:*/
+ /*element: Class1.field13:initial=BoolConstant(true)*/
var field13 = const1;
+
+ /*element: Class1.field14:*/
+ var field14 = const1 is int;
}
class Class2 {
@@ -93,6 +96,9 @@
/*element: Class2.field13:*/
var field13;
+ /*element: Class2.field14:*/
+ var field14;
+
Class2()
: field1 = null,
field2 = true,
@@ -106,5 +112,6 @@
field10 = const {},
field11 = #foo,
field12 = 2 + 3,
- field13 = const1;
+ field13 = const1,
+ field14 = const1 is int;
}