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
})
]
}),