Only prune dead library items from root set

Bug: 150736225
Change-Id: I8cdf0a019f9c897d0673f9790aea0001989b71be
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 7c21891..c4dcb14 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2286,10 +2286,21 @@
     return targetedMethods.contains(method);
   }
 
+  public boolean isTypeLive(DexClass clazz) {
+    return clazz.isProgramClass()
+        ? isTypeLive(clazz.asProgramClass())
+        : isNonProgramTypeLive(clazz);
+  }
+
   public boolean isTypeLive(DexProgramClass clazz) {
     return liveTypes.contains(clazz);
   }
 
+  public boolean isNonProgramTypeLive(DexClass clazz) {
+    assert !clazz.isProgramClass();
+    return liveNonProgramTypes.contains(clazz);
+  }
+
   // Package protected due to entry point from worklist.
   void markInstanceFieldAsReachable(DexEncodedField encodedField, KeepReason reason) {
     DexField field = encodedField.field;
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
index b48c50c..c89dd04 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -1475,16 +1475,27 @@
           reference -> {
             if (reference.isDexField()) {
               DexEncodedField definition = definitions.definitionFor(reference.asDexField());
-              return definition == null || !enqueuer.isFieldReferenced(definition);
+              if (definition == null) {
+                return true;
+              }
+              DexClass holder = definitions.definitionFor(definition.holder());
+              if (holder.isProgramClass()) {
+                return !enqueuer.isFieldReferenced(definition);
+              }
+              return !enqueuer.isNonProgramTypeLive(holder);
             } else if (reference.isDexMethod()) {
               DexEncodedMethod definition = definitions.definitionFor(reference.asDexMethod());
-              return definition == null
-                  || !(enqueuer.isMethodLive(definition) || enqueuer.isMethodTargeted(definition));
+              if (definition == null) {
+                return true;
+              }
+              DexClass holder = definitions.definitionFor(definition.holder());
+              if (holder.isProgramClass()) {
+                return !enqueuer.isMethodLive(definition) && !enqueuer.isMethodTargeted(definition);
+              }
+              return !enqueuer.isNonProgramTypeLive(holder);
             } else {
               DexClass definition = definitions.definitionFor(reference.asDexType());
-              return definition == null
-                  || (definition.isProgramClass()
-                      && !enqueuer.isTypeLive(definition.asProgramClass()));
+              return definition == null || !enqueuer.isTypeLive(definition);
             }
           });
     }