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();
}