Share the type-checking logic for field put instructions.

Uninstantiated type optimizer didn't allow field put instructions whose
right-hand side is of interface type (with broken hierarchy).
We allow it while verifying type correctness of IR code, so does the
uninstantiated type optimizer.

Bug: 130762267
Change-Id: Ia2d15e9eb28fb1ea84b2e7d7496c9d6ef7700e20
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java b/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java
index d8a0a50..553834c 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java
@@ -64,7 +64,7 @@
     return checkFieldPut(instruction);
   }
 
-  private boolean checkFieldPut(FieldInstruction instruction) {
+  public boolean checkFieldPut(FieldInstruction instruction) {
     assert instruction.isFieldPut();
     Value value =
         instruction.isInstancePut()
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
index 40f20ed..43f8211 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
@@ -25,8 +25,7 @@
 import com.android.tools.r8.graph.GraphLense.RewrittenPrototypeDescription.RemovedArgumentsInfo;
 import com.android.tools.r8.graph.TopDownClassHierarchyTraversal;
 import com.android.tools.r8.ir.analysis.AbstractError;
-import com.android.tools.r8.ir.analysis.type.Nullability;
-import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
+import com.android.tools.r8.ir.analysis.TypeChecker;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.FieldInstruction;
 import com.android.tools.r8.ir.code.IRCode;
@@ -104,6 +103,7 @@
   private static final MethodSignatureEquivalence equivalence = MethodSignatureEquivalence.get();
 
   private final AppView<AppInfoWithLiveness> appView;
+  private final TypeChecker typeChecker;
 
   private int numberOfInstanceGetOrInstancePutWithNullReceiver = 0;
   private int numberOfArrayInstructionsWithNullArray = 0;
@@ -113,6 +113,7 @@
 
   public UninstantiatedTypeOptimization(AppView<AppInfoWithLiveness> appView) {
     this.appView = appView;
+    this.typeChecker = new TypeChecker(appView);
   }
 
   public GraphLense run(
@@ -484,14 +485,7 @@
 
       BasicBlock block = instruction.getBlock();
       if (instruction.isFieldPut()) {
-        Value value =
-            instruction.isInstancePut()
-                ? instruction.asInstancePut().value()
-                : instruction.asStaticPut().inValue();
-
-        TypeLatticeElement fieldLatticeType =
-            TypeLatticeElement.fromDexType(fieldType, Nullability.maybeNull(), appView);
-        if (!value.getTypeLattice().lessThanOrEqual(fieldLatticeType, appView)) {
+        if (!typeChecker.checkFieldPut(instruction)) {
           // Broken type hierarchy. See FieldTypeTest#test_brokenTypeHierarchy.
           assert appView.options().testing.allowTypeErrors;
           return;
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index e13b5c4..29d2bcf 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -597,7 +597,7 @@
 
     public boolean allowProguardRulesThatUseExtendsOrImplementsWrong = true;
     public boolean allowTypeErrors =
-        !Version.isDev() || System.getProperty("com.android.tools.r8.allowTypeErrors") != null;;
+        !Version.isDev() || System.getProperty("com.android.tools.r8.allowTypeErrors") != null;
     public boolean alwaysUsePessimisticRegisterAllocation = false;
     public boolean invertConditionals = false;
     public boolean placeExceptionalBlocksLast = false;
diff --git a/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java b/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
index 69232b8..55f5370 100644
--- a/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
@@ -5,10 +5,10 @@
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index 89017e7..9ef28a8 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -93,8 +93,7 @@
               'id': 'com.numix.calculator',
               'dir': 'Calculator',
               'name': 'numix-calculator',
-              'has_instrumentation_tests': True,
-              'skip': True
+              'has_instrumentation_tests': True
           })
       ]
   }),