Fix choice of field read cast after horizontal class merging

Change-Id: Id6a798ff002784267414f167c5ce19b22c3dcdb3
diff --git a/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
index e657932..61bb888 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
@@ -155,6 +155,19 @@
   protected abstract MethodLookupResult internalDescribeLookupMethod(
       MethodLookupResult previous, DexMethod context, GraphLens codeLens);
 
+  public final DexType getNextType(DexType type) {
+    if (type.isArrayType()) {
+      DexType baseType = type.toBaseType(dexItemFactory());
+      DexType newBaseType = getNextClassType(baseType);
+      if (newBaseType.isNotIdenticalTo(baseType)) {
+        return type.replaceBaseType(newBaseType, dexItemFactory());
+      }
+    } else if (type.isClassType()) {
+      return getNextClassType(type);
+    }
+    return type;
+  }
+
   protected abstract DexType getNextClassType(DexType type);
 
   public abstract DexField getPreviousFieldSignature(DexField field);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
index 92931c2..81d95ee 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
@@ -136,14 +136,14 @@
     if (lookup.getReference().isIdenticalTo(previous.getReference())) {
       return lookup;
     }
+    DexType newFieldType = lookup.getReference().getType();
+    DexType preciseNewFieldType = getNextType(previous.getReference().getType());
     return FieldLookupResult.builder(this)
         .setReference(lookup.getReference())
         .setReboundReference(lookup.getReboundReference())
         .setReadCastType(
-            lookup.getReference().getType().isNotIdenticalTo(previous.getReference().getType())
-                ? lookupType(previous.getReference().getType())
-                : null)
-        .setWriteCastType(previous.getRewrittenWriteCastType(this::getNextClassType))
+            preciseNewFieldType.isNotIdenticalTo(newFieldType) ? preciseNewFieldType : null)
+        .setWriteCastType(previous.getRewrittenWriteCastType(this::getNextType))
         .build();
   }