Assert $r8$classId values are unchanged at refinement

Change-Id: I707077f4182b7ef953f4b5ec94f608308fb5f5b0
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
index efb9b58..2b63089 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.horizontalclassmerging.HorizontalClassMergerUtils;
 import com.android.tools.r8.ir.analysis.value.AbstractValue;
 import com.android.tools.r8.ir.analysis.value.BottomValue;
+import com.android.tools.r8.ir.analysis.value.NonConstantNumberValue;
 import com.android.tools.r8.ir.analysis.value.SingleValue;
 import com.android.tools.r8.ir.analysis.value.UnknownValue;
 import com.android.tools.r8.ir.code.FieldInstruction;
@@ -177,7 +178,7 @@
         AbstractValue abstractValue = entry.getValue();
 
         // The power set lattice is an expensive abstraction, so use it with caution.
-        boolean allowNonConstantNumbers = HorizontalClassMergerUtils.isClassIdField(appView, field);
+        boolean isClassIdField = HorizontalClassMergerUtils.isClassIdField(appView, field);
 
         InstanceFieldInitializationInfo initializationInfo =
             initializationInfoCollection.get(field);
@@ -191,7 +192,7 @@
                   argumentAbstractValue,
                   appView.abstractValueFactory(),
                   field.getType(),
-                  allowNonConstantNumbers);
+                  isClassIdField);
           assert !abstractValue.isBottom();
         } else if (initializationInfo.isSingleValue()) {
           SingleValue singleValueInitializationInfo = initializationInfo.asSingleValue();
@@ -200,7 +201,7 @@
                   singleValueInitializationInfo,
                   appView.abstractValueFactory(),
                   field.getType(),
-                  allowNonConstantNumbers);
+                  isClassIdField);
         } else if (initializationInfo.isTypeInitializationInfo()) {
           // TODO(b/149732532): Not handled, for now.
           abstractValue = UnknownValue.getInstance();
@@ -214,16 +215,19 @@
         // When approximating the possible values for the $r8$classId fields from horizontal class
         // merging, give up if the set of possible values equals the size of the merge group. In
         // this case, the information is useless.
-        if (allowNonConstantNumbers
-            && abstractValue.isNonConstantNumberValue()
-            && field.getOptimizationInfo().getAbstractValue().isNonConstantNumberValue()) {
-          if (abstractValue.asNonConstantNumberValue().getAbstractionSize()
-              >= field
-                  .getOptimizationInfo()
-                  .getAbstractValue()
-                  .asNonConstantNumberValue()
-                  .getAbstractionSize()) {
-            abstractValue = UnknownValue.getInstance();
+        if (isClassIdField && abstractValue.isNonConstantNumberValue()) {
+          NonConstantNumberValue initialAbstractValue =
+              field.getOptimizationInfo().getAbstractValue().asNonConstantNumberValue();
+          if (initialAbstractValue != null) {
+            if (abstractValue.asNonConstantNumberValue().getAbstractionSize()
+                >= initialAbstractValue.getAbstractionSize()) {
+              abstractValue = UnknownValue.getInstance();
+            }
+          } else {
+            assert false
+                : "Expected abstract value of "
+                    + field.toSourceString()
+                    + " to be instance of NonConstantNumberValue";
           }
         }