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()) {