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;
 }