Remove minification predicate from root set.

Bug: 157012327
Change-Id: Icf7598e6ad30ac302d976bda1065cfae9f68fba6
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 24bbae5..07948a1 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -611,7 +611,7 @@
 
       // Overwrite SourceFile if specified. This step should be done after IR conversion.
       timing.begin("Rename SourceFile");
-      new SourceFileRewriter(appView).run();
+      new SourceFileRewriter(appViewWithLiveness).run();
       timing.end();
 
       // Collect the already pruned types before creating a new app info without liveness.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
index 7272948..b1d8880 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
@@ -322,7 +322,8 @@
       return null;
     }
 
-    if (appView.options().isMinifying() && appView.rootSet().mayBeMinified(holder, appView)) {
+    if (appView.enableWholeProgramOptimizations()
+        && appView.withLiveness().appInfo().isMinificationAllowed(holder)) {
       if (invokedMethod == dexItemFactory.classMethods.getName) {
         return new DexItemBasedValueString(holder, ClassNameComputationInfo.getInstance(NAME));
       }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
index d00100a..af2dee2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
@@ -354,7 +354,8 @@
         continue;
       }
       boolean mayBeRenamed =
-          appView.options().isMinifying() && appView.rootSet().mayBeMinified(holder.type, appView);
+          appView.enableWholeProgramOptimizations()
+              && appView.withLiveness().appInfo().isMinificationAllowed(holder.type);
       // b/120138731: Filter out escaping uses. In such case, the result of this optimization will
       // be stored somewhere, which can lead to a regression if the corresponding class is in a deep
       // package hierarchy. For local cases, it is likely a one-time computation, but make sure the
diff --git a/src/main/java/com/android/tools/r8/naming/Minifier.java b/src/main/java/com/android/tools/r8/naming/Minifier.java
index 2ee7485..3d27387 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -130,10 +130,10 @@
   static class MinificationClassNamingStrategy extends BaseMinificationNamingStrategy
       implements ClassNamingStrategy {
 
-    final AppView<?> appView;
+    final AppView<AppInfoWithLiveness> appView;
     final DexItemFactory factory;
 
-    MinificationClassNamingStrategy(AppView<?> appView) {
+    MinificationClassNamingStrategy(AppView<AppInfoWithLiveness> appView) {
       super(
           appView.options().getProguardConfiguration().getClassObfuscationDictionary(),
           appView.options().getProguardConfiguration().hasDontUseMixedCaseClassnames());
@@ -169,7 +169,7 @@
 
     @Override
     public DexString reservedDescriptor(DexType type) {
-      if (appView.rootSet().mayNotBeMinified(type, appView)) {
+      if (!appView.appInfo().isMinificationAllowed(type)) {
         return type.descriptor;
       }
       return null;
@@ -207,11 +207,11 @@
   static class MinifierMemberNamingStrategy extends BaseMinificationNamingStrategy
       implements MemberNamingStrategy {
 
-    final AppView<?> appView;
+    final AppView<AppInfoWithLiveness> appView;
     private final DexItemFactory factory;
     private final boolean desugaredLibraryRenaming;
 
-    public MinifierMemberNamingStrategy(AppView<?> appView) {
+    public MinifierMemberNamingStrategy(AppView<AppInfoWithLiveness> appView) {
       super(appView.options().getProguardConfiguration().getObfuscationDictionary(), false);
       this.appView = appView;
       this.factory = appView.dexItemFactory();
@@ -254,7 +254,7 @@
       if (!allowMemberRenaming(holder)
           || holder.accessFlags.isAnnotation()
           || method.accessFlags.isConstructor()
-          || appView.rootSet().mayNotBeMinified(method.method, appView)) {
+          || !appView.appInfo().isMinificationAllowed(method.method)) {
         return method.method.name;
       }
       if (desugaredLibraryRenaming
@@ -268,7 +268,7 @@
 
     @Override
     public DexString getReservedName(DexEncodedField field, DexClass holder) {
-      if (holder.isLibraryClass() || appView.rootSet().mayNotBeMinified(field.field, appView)) {
+      if (holder.isLibraryClass() || !appView.appInfo().isMinificationAllowed(field.field)) {
         return field.field.name;
       }
       return null;
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index 57f63fa..ad27200 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -203,7 +203,7 @@
       if (clazz == null || !appView.options().isMinifying()) {
         notMappedReferences.add(type);
       } else if (appView.options().isMinifying()
-          && appView.rootSet().mayNotBeMinified(type, appView)) {
+          && !appView.appInfo().isMinificationAllowed(type)) {
         notMappedReferences.add(type);
       }
     }
@@ -392,7 +392,9 @@
     private final Set<String> mappedNames;
 
     ApplyMappingClassNamingStrategy(
-        AppView<?> appView, Map<DexType, DexString> mappings, Set<String> mappedNames) {
+        AppView<AppInfoWithLiveness> appView,
+        Map<DexType, DexString> mappings,
+        Set<String> mappedNames) {
       super(appView);
       this.mappings = mappings;
       this.mappedNames = mappedNames;
@@ -402,7 +404,7 @@
     public DexString next(
         DexType type, char[] packagePrefix, InternalNamingState state, Predicate<String> isUsed) {
       assert !mappings.containsKey(type);
-      assert appView.rootSet().mayBeMinified(type, appView);
+      assert appView.appInfo().isMinificationAllowed(type);
       return super.next(
           type,
           packagePrefix,
@@ -427,15 +429,12 @@
       if (clazz.isNotProgramClass() && mappings.containsKey(type)) {
         return mappings.get(type);
       }
-      if (clazz.isProgramClass() && appView.rootSet().mayBeMinified(type, appView)) {
-        if (mappings.containsKey(type)) {
+      if (clazz.isProgramClass()) {
+        if (appView.appInfo().isMinificationAllowed(type)) {
           return mappings.get(type);
         }
-        return null;
-      } else if (clazz.isProgramClass()
-          && !appView.rootSet().mayBeMinified(type, appView)
-          && mappings.containsKey(type)) {
-        // TODO(b/136694827): Report a warning here since the user may find this not intuitive.
+        // TODO(b/136694827): Report a warning here if in the mapping since the user may find this
+        //  non intuitive.
       }
       return type.descriptor;
     }
@@ -453,7 +452,7 @@
     private final Reporter reporter;
 
     public ApplyMappingMemberNamingStrategy(
-        AppView<?> appView, Map<DexReference, MemberNaming> mappedNames) {
+        AppView<AppInfoWithLiveness> appView, Map<DexReference, MemberNaming> mappedNames) {
       super(appView);
       this.mappedNames = mappedNames;
       this.factory = appView.dexItemFactory();
@@ -477,7 +476,7 @@
         nextName = reservedName;
       } else {
         assert !mappedNames.containsKey(reference);
-        assert appView.rootSet().mayBeMinified(reference, appView);
+        assert appView.appInfo().isMinificationAllowed(reference);
         nextName = super.next(method, internalState, isAvailable);
       }
       assert nextName == reference.name || !method.isInitializer();
@@ -500,7 +499,7 @@
         return reservedName;
       }
       assert !mappedNames.containsKey(reference);
-      assert appView.rootSet().mayBeMinified(reference, appView);
+      assert appView.appInfo().isMinificationAllowed(reference);
       return super.next(field, internalState, isAvailable);
     }
 
diff --git a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
index a5ead29..1e57331 100644
--- a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.graph.DexDebugEvent.SetFile;
 import com.android.tools.r8.graph.DexDebugInfo;
 import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.ProguardConfiguration;
 import java.util.Arrays;
 
@@ -20,9 +21,9 @@
  */
 public class SourceFileRewriter {
 
-  private final AppView<?> appView;
+  private final AppView<AppInfoWithLiveness> appView;
 
-  public SourceFileRewriter(AppView<?> appView) {
+  public SourceFileRewriter(AppView<AppInfoWithLiveness> appView) {
     this.appView = appView;
   }
 
@@ -45,7 +46,7 @@
       // of ART.
       if (!hasRenameSourceFileAttribute
           && proguardConfiguration.getKeepAttributes().sourceFile
-          && appView.rootSet().mayNotBeMinified(clazz.type, appView)) {
+          && !appView.appInfo().isMinificationAllowed(clazz.type)) {
         continue;
       }
       clazz.sourceFile = defaultRenaming;
diff --git a/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java b/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java
index 44efffc..db4613f 100644
--- a/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java
@@ -165,7 +165,7 @@
       boolean wasSeen = methodPoolCollection.markIfNotSeen(holder, method.method);
       if (wasSeen) {
         // We can't do anything further because even renaming is not allowed due to the keep rule.
-        if (appView.rootSet().mayNotBeMinified(method.method, appView)) {
+        if (!appView.appInfo().isMinificationAllowed(method.method)) {
           return false;
         }
         // TODO(b/111118390): Renaming will enable more private instance methods to be publicized.
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 04ac91a..d3afad2 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -917,6 +917,11 @@
     return this;
   }
 
+  public boolean isMinificationAllowed(DexReference reference) {
+    return options().isMinificationEnabled()
+        && keepInfo.getInfo(reference, this).isMinificationAllowed(options());
+  }
+
   public boolean isAccessModificationAllowed(DexReference reference) {
     assert options().getProguardConfiguration().isAccessModificationAllowed();
     return keepInfo.getInfo(reference, this).isAccessModificationAllowed(options());
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 09a6587..ec9f101 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -29,12 +29,10 @@
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
-import com.android.tools.r8.graph.GraphLense;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.graph.SubtypingInfo;
 import com.android.tools.r8.ir.analysis.proto.GeneratedMessageLiteBuilderShrinker;
-import com.android.tools.r8.ir.optimize.enums.EnumUnboxingRewriter;
 import com.android.tools.r8.logging.Log;
 import com.android.tools.r8.shaking.AnnotationMatchResult.AnnotationsIgnoredMatchResult;
 import com.android.tools.r8.shaking.AnnotationMatchResult.ConcreteAnnotationMatchResult;
@@ -1905,53 +1903,6 @@
       noObfuscation.add(reference);
     }
 
-    public boolean mayBeMinified(DexReference reference, AppView<?> appView) {
-      boolean minificationAllowed =
-          appView.getKeepInfo().isMinificationAllowed(reference, appView, appView.options());
-      // TODO: Remove this once consistency is established.
-      //  Assert consistency with existing root set info.
-      //  Split in to checks to make the direction clean in errors.
-      // minify -> not-in-set
-      assert !minificationAllowed
-          || !noObfuscation.contains(getOriginal(reference, appView))
-          // Compiler synthesized methods can be renamed regardless of keep rules.
-          || isCompilerSynthesizedMethod(reference, appView);
-      // !minify -> in-set
-      assert minificationAllowed
-          || noObfuscation.contains(getOriginal(reference, appView))
-          || !appView.options().isMinificationEnabled();
-      return minificationAllowed;
-    }
-
-    public boolean mayNotBeMinified(DexReference reference, AppView<?> appView) {
-      return !mayBeMinified(reference, appView);
-    }
-
-    private boolean isCompilerSynthesizedMethod(DexReference reference, AppView<?> appView) {
-      DexMethod method = reference.asDexMethod();
-      if (method == null) {
-        return false;
-      }
-      DexEncodedMethod definition = method.lookupOnClass(appView.definitionForHolder(method));
-      return definition != null
-          && (definition.isD8R8Synthesized()
-              || definition
-                  .qualifiedName()
-                  .contains(EnumUnboxingRewriter.ENUM_UNBOXING_UTILITY_CLASS_NAME));
-    }
-
-    private DexReference getOriginal(DexReference reference, AppView<?> appView) {
-      GraphLense lens = appView.graphLense();
-      if (reference.isDexType()) {
-        return lens.getOriginalType(reference.asDexType());
-      }
-      if (reference.isDexMethod()) {
-        return lens.getOriginalMethodSignature(reference.asDexMethod());
-      }
-      assert reference.isDexField();
-      return lens.getOriginalFieldSignature(reference.asDexField());
-    }
-
     public boolean verifyKeptFieldsAreAccessedAndLive(AppInfoWithLiveness appInfo) {
       noShrinking.forEachField(
           reference -> {
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index 367092b..83f8ec0 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -47,7 +47,7 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.naming.Range;
-import com.android.tools.r8.shaking.RootSetBuilder.RootSet;
+import com.android.tools.r8.shaking.KeepInfoCollection;
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
 import com.google.common.base.Suppliers;
 import java.util.ArrayList;
@@ -448,7 +448,7 @@
     if (appView.options().isGeneratingClassFiles()) {
       return true;
     }
-    RootSet rootSet = appView.rootSet();
+    KeepInfoCollection keepInfo = appView.getKeepInfo();
     boolean allSeenAreInstanceInitializers = true;
     DexString originalName = null;
     for (DexEncodedMethod method : methods) {
@@ -459,7 +459,7 @@
       }
       allSeenAreInstanceInitializers = false;
       // If the method is pinned, we cannot minify it.
-      if (rootSet.mayNotBeMinified(method.method, appView)) {
+      if (!keepInfo.isMinificationAllowed(method.method, appView, appView.options())) {
         continue;
       }
       // With desugared library, call-backs names are reserved here.