Don't maintain immediate subtypes of java.lang.Object
Change-Id: Iaf08b12d00b2a9b9d2448040ad19e67bca3c5a41
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 7c5aef2..19b7db1 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1725,6 +1725,9 @@
}
private void populateInstantiatedHierarchy(DexType type, DexClass subtype) {
+ if (type == appInfo.dexItemFactory().objectType) {
+ return;
+ }
Set<DexClass> subtypes = instantiatedHierarchy.get(type);
if (subtypes != null) {
subtypes.add(subtype);
@@ -2299,14 +2302,26 @@
Consumer<DexProgramClass> subTypeConsumer,
Consumer<LambdaDescriptor> lambdaConsumer) {
WorkList<DexClass> worklist = WorkList.newIdentityWorkList();
- DexClass initialClass = definitionFor(type);
- if (initialClass == null) {
- // If no definition for the type is found, populate the worklist with any
- // instantiated subtypes and callback with any lambda instance.
- worklist.addIfNotSeen(instantiatedHierarchy.getOrDefault(type, Collections.emptySet()));
- instantiatedLambdas.getOrDefault(type, Collections.emptyList()).forEach(lambdaConsumer);
+ if (type == appInfo.dexItemFactory().objectType) {
+ // All types are below java.lang.Object, but we don't maintain an entry for it.
+ instantiatedHierarchy.forEach(
+ (key, subtypes) -> {
+ DexClass clazz = definitionFor(key);
+ if (clazz != null) {
+ worklist.addIfNotSeen(clazz);
+ }
+ worklist.addIfNotSeen(subtypes);
+ });
} else {
- worklist.addIfNotSeen(initialClass);
+ DexClass initialClass = definitionFor(type);
+ if (initialClass == null) {
+ // If no definition for the type is found, populate the worklist with any
+ // instantiated subtypes and callback with any lambda instance.
+ worklist.addIfNotSeen(instantiatedHierarchy.getOrDefault(type, Collections.emptySet()));
+ instantiatedLambdas.getOrDefault(type, Collections.emptyList()).forEach(lambdaConsumer);
+ } else {
+ worklist.addIfNotSeen(initialClass);
+ }
}
while (worklist.hasNext()) {