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