Fix missing type propagation in uninstantiated type optimization
Change-Id: I3da17084365b322f9c32c395bd250e9d35111b28
diff --git a/src/main/java/com/android/tools/r8/ir/code/Assume.java b/src/main/java/com/android/tools/r8/ir/code/Assume.java
index fca4c2e..7c2b109 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Assume.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Assume.java
@@ -231,6 +231,23 @@
}
@Override
+ public boolean verifyTypes(AppView<?> appView) {
+ assert super.verifyTypes(appView);
+
+ TypeLatticeElement inType = src().getTypeLattice();
+ TypeLatticeElement outType = outValue().getTypeLattice();
+ if (isAssumeDynamicType()) {
+ assert outType.equals(inType);
+ } else {
+ assert isAssumeNonNull();
+ assert inType.isReference();
+ assert inType.isNullType()
+ || outType.equals(inType.asReferenceTypeLatticeElement().asNotNull());
+ }
+ return true;
+ }
+
+ @Override
public String toString() {
if (isAssumeDynamicType()) {
return super.toString() + "; type: " + asAssumeDynamicType().getAssumption().type;
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 8d5bf96..0b043fe 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
@@ -406,11 +406,7 @@
}
if (instruction.isFieldInstruction()) {
rewriteFieldInstruction(
- instruction.asFieldInstruction(),
- blockIterator,
- instructionIterator,
- code,
- blocksToBeRemoved);
+ instruction.asFieldInstruction(), instructionIterator, code, valuesToNarrow);
} else if (instruction.isInvokeMethod()) {
rewriteInvoke(
instruction.asInvokeMethod(),
@@ -476,10 +472,9 @@
// At this point, field-instruction whose target field type is uninstantiated will be handled.
private void rewriteFieldInstruction(
FieldInstruction instruction,
- ListIterator<BasicBlock> blockIterator,
InstructionListIterator instructionIterator,
IRCode code,
- Set<BasicBlock> blocksToBeRemoved) {
+ Set<Value> affectedValues) {
DexType fieldType = instruction.getField().type;
if (fieldType.isAlwaysNull(appView)) {
AbstractError abstractError =
@@ -517,6 +512,7 @@
} else {
// Replace the field read by the constant null.
instructionIterator.replaceCurrentInstruction(code.createConstNull());
+ affectedValues.addAll(instruction.outValue().affectedValues());
}
if (block.hasCatchHandlers()) {