Merge "Test visibility bridge methods after inlining"
diff --git a/build.gradle b/build.gradle
index 7ff46eb..272fcdd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -255,9 +255,10 @@
 }
 
 def r8LibPath = "$buildDir/libs/r8lib.jar"
+def r8LibExludeDepsPath = "$buildDir/libs/r8lib-exclude-deps.jar"
 def r8LibGeneratedKeepRulesPath = "$buildDir/generated/keep.txt"
+def r8LibGeneratedKeepRulesExcludeDepsPath = "$buildDir/generated/keep-exclude-deps.txt"
 def r8LibTestPath = "$buildDir/classes/r8libtest"
-def r8TestsJarPath = "$buildDir/libs/r8tests.jar"
 
 def osString = OperatingSystem.current().isLinux() ? "linux" :
         OperatingSystem.current().isMacOsX() ? "mac" : "windows"
@@ -363,8 +364,7 @@
             def outputDir = "${entry.key}/${entryFile}"
             def gzFile = "${outputDir}.tar.gz"
             def sha1File = "${gzFile}.sha1"
-            inputs.file sha1File
-            outputs.file gzFile
+            inputs.files files(sha1File, gzFile)
             outputs.dir outputDir
             executable "bash"
             args "-c", "tools/download_from_x20.py ${sha1File}"
@@ -674,7 +674,6 @@
 }
 
 task testJar(type: ShadowJar, dependsOn: testClasses) {
-    outputs.upToDateWhen { false }
     baseName = "r8tests"
     from sourceSets.test.output
     if (!project.hasProperty('exclude_deps')) {
@@ -682,24 +681,30 @@
     }
 }
 
-task generateR8LibKeepRules(type: Exec) {
-    doFirst {
-        standardOutput new FileOutputStream(r8LibGeneratedKeepRulesPath)
+task testJarNoDeps(type: ShadowJar, dependsOn: testClasses) {
+    baseName = "r8tests-exclude-deps"
+    from sourceSets.test.output
+}
+
+def generateR8LibKeepRules(name, r8Source, testSource, output) {
+    return tasks.create("generateR8LibKeepRules_" + name, Exec) {
+        doFirst {
+            standardOutput new FileOutputStream(output)
+        }
+        dependsOn r8WithRelocatedDeps
+        dependsOn r8Source
+        dependsOn testSource
+        dependsOn downloadOpenJDKrt
+        inputs.files ([r8WithRelocatedDeps.outputs, r8Source.outputs, testSource.outputs])
+        outputs.file output
+        commandLine baseR8CommandLine([
+                "printuses",
+                "--keeprules",
+                "third_party/openjdk/openjdk-rt-1.8/rt.jar",
+                r8Source.outputs.files[0],
+                testSource.outputs.files[0]])
+        workingDir = projectDir
     }
-    def libSourceTask = project.hasProperty('exclude_deps') ? R8NoManifestNoDeps : R8NoManifest
-    dependsOn r8WithRelocatedDeps
-    dependsOn libSourceTask
-    dependsOn testJar
-    dependsOn downloadOpenJDKrt
-    inputs.files ([r8WithRelocatedDeps.outputs, libSourceTask.outputs, testJar.outputs])
-    outputs.file r8LibGeneratedKeepRulesPath
-    commandLine baseR8CommandLine([
-            "printuses",
-            "--keeprules",
-            "third_party/openjdk/openjdk-rt-1.8/rt.jar",
-            libSourceTask.outputs.files[0],
-            testJar.outputs.files[0]])
-    workingDir = projectDir
 }
 
 task R8LibApiOnly {
@@ -707,29 +712,40 @@
     outputs.file r8LibPath
 }
 
-task R8LibNoDeps {
-    dependsOn r8LibCreateTask(
-            "NoDeps",
-            "src/main/keep.txt",
-            R8NoManifestNoDeps,
-            r8LibPath,
-            ["--pg-conf", generateR8LibKeepRules.outputs.files[0]],
-            repackageDepsNoRelocate.outputs.files
-    ).dependsOn(repackageDepsNoRelocate, generateR8LibKeepRules)
-    outputs.file r8LibPath
-}
-
 task R8Lib {
+    def genRulesTask = generateR8LibKeepRules(
+            "Main",
+            R8NoManifest,
+            testJar,
+            r8LibGeneratedKeepRulesPath)
     dependsOn r8LibCreateTask(
             "Main",
             "src/main/keep.txt",
             R8NoManifest,
             r8LibPath,
-            ["--pg-conf", generateR8LibKeepRules.outputs.files[0]]
-    ).dependsOn(generateR8LibKeepRules)
+            ["--pg-conf", genRulesTask.outputs.files[0]]
+    ).dependsOn(genRulesTask)
     outputs.file r8LibPath
 }
 
+task R8LibNoDeps {
+    def genRulesTask = generateR8LibKeepRules(
+            "NoDeps",
+            R8NoManifestNoDeps,
+            testJarNoDeps,
+            r8LibGeneratedKeepRulesExcludeDepsPath
+    )
+    dependsOn r8LibCreateTask(
+            "NoDeps",
+            "src/main/keep.txt",
+            R8NoManifestNoDeps,
+            r8LibExludeDepsPath,
+            ["--pg-conf", genRulesTask.outputs.files[0]],
+            repackageDepsNoRelocate.outputs.files
+    ).dependsOn(repackageDepsNoRelocate, genRulesTask)
+    outputs.file r8LibExludeDepsPath
+}
+
 task CompatDxLib {
     dependsOn r8LibCreateTask(
             "CompatDx", "src/main/keep-compatdx.txt", CompatDx, "build/libs/compatdxlib.jar")
@@ -1413,7 +1429,7 @@
 
 task configureTestForR8Lib(type: Copy) {
     dependsOn testJar
-    inputs.file r8TestsJarPath
+    inputs.file "$buildDir/libs/r8tests.jar"
     if (getR8LibTask() != null) {
         dependsOn getR8LibTask()
         delete r8LibTestPath
diff --git a/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphEdgeInfo.java b/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphEdgeInfo.java
index 0c838ac..e3fa01b 100644
--- a/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphEdgeInfo.java
+++ b/src/main/java/com/android/tools/r8/experimental/graphinfo/GraphEdgeInfo.java
@@ -16,9 +16,11 @@
     InvokedFrom,
     InvokedFromLambdaCreatedIn,
     ReferencedFrom,
+    ReflectiveUseFrom,
     ReachableFromLiveType,
     ReferencedInAnnotation,
     IsLibraryMethod,
+    MethodHandleUseFrom
   }
 
   private final EdgeKind kind;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 97023f2..5aa2ee4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -685,9 +685,7 @@
   public DexEncodedMethod toStaticMethodWithoutThis() {
     checkIfObsolete();
     assert !accessFlags.isStatic();
-    Builder builder = builder(this);
-    builder.setStatic();
-    builder.withoutThisParameter();
+    Builder builder = builder(this).setStatic().unsetOptimizationInfo().withoutThisParameter();
     setObsolete();
     return builder.build();
   }
@@ -1257,17 +1255,24 @@
       this.method = method;
     }
 
-    public void setStatic() {
+    public Builder setStatic() {
       this.accessFlags.setStatic();
+      return this;
     }
 
-    public void withoutThisParameter() {
+    public Builder unsetOptimizationInfo() {
+      optimizationInfo = DefaultOptimizationInfoImpl.DEFAULT_INSTANCE;
+      return this;
+    }
+
+    public Builder withoutThisParameter() {
       assert code != null;
       if (code.isDexCode()) {
         code = code.asDexCode().withoutThisParameter();
       } else {
         throw new Unreachable("Code " + code.getClass().getSimpleName() + " is not supported.");
       }
+      return this;
     }
 
     public void setCode(Code code) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index ba01321..5938781 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.ir.optimize;
 
 import static com.android.tools.r8.ir.analysis.type.Nullability.definitelyNotNull;
+import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
 import static com.android.tools.r8.ir.optimize.ReflectionOptimizer.ClassNameComputationInfo.ClassNameComputationOption.CANONICAL_NAME;
 import static com.android.tools.r8.ir.optimize.ReflectionOptimizer.ClassNameComputationInfo.ClassNameComputationOption.NAME;
 import static com.android.tools.r8.ir.optimize.ReflectionOptimizer.ClassNameComputationInfo.ClassNameComputationOption.SIMPLE_NAME;
@@ -14,6 +15,7 @@
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DebugLocalInfo;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
@@ -155,6 +157,7 @@
 
   public final IRConverter converter;
   private final AppInfo appInfo;
+  private final AppView<? extends AppInfo> appView;
   private final DexItemFactory dexItemFactory;
   private final Set<DexMethod> libraryMethodsReturningReceiver;
   private final InternalOptions options;
@@ -165,6 +168,7 @@
       InternalOptions options) {
     this.converter = converter;
     this.appInfo = converter.appInfo;
+    this.appView = converter.appView;
     this.options = options;
     this.dexItemFactory = appInfo.dexItemFactory;
     this.libraryMethodsReturningReceiver = libraryMethodsReturningReceiver;
@@ -1571,20 +1575,31 @@
     }
   }
 
-  private boolean checkArgumentType(InvokeMethod invoke, DexMethod target, int argumentIndex) {
-    DexType returnType = invoke.getInvokedMethod().proto.returnType;
+  private boolean checkArgumentType(InvokeMethod invoke, int argumentIndex) {
     // TODO(sgjesse): Insert cast if required.
-    if (invoke.isInvokeStatic()) {
-      return invoke.getInvokedMethod().proto.parameters.values[argumentIndex] == returnType;
+    TypeLatticeElement returnType =
+        TypeLatticeElement.fromDexType(
+            invoke.getInvokedMethod().proto.returnType, maybeNull(), appInfo);
+    TypeLatticeElement argumentType =
+        TypeLatticeElement.fromDexType(
+            getArgumentType(invoke, argumentIndex), maybeNull(), appInfo);
+    if (appView != null && appView.enableWholeProgramOptimizations()) {
+      return argumentType.lessThanOrEqual(returnType, appInfo);
     } else {
-      if (argumentIndex == 0) {
-        return invoke.getInvokedMethod().getHolder() == returnType;
-      } else {
-        return invoke.getInvokedMethod().proto.parameters.values[argumentIndex - 1] == returnType;
-      }
+      return argumentType.equals(returnType);
     }
   }
 
+  private DexType getArgumentType(InvokeMethod invoke, int argumentIndex) {
+    if (invoke.isInvokeStatic()) {
+      return invoke.getInvokedMethod().proto.parameters.values[argumentIndex];
+    }
+    if (argumentIndex == 0) {
+      return invoke.getInvokedMethod().getHolder();
+    }
+    return invoke.getInvokedMethod().proto.parameters.values[argumentIndex - 1];
+  }
+
   // Replace result uses for methods where something is known about what is returned.
   public void rewriteMoveResult(IRCode code) {
     if (options.isGeneratingClassFiles()) {
@@ -1600,7 +1615,7 @@
         InvokeMethod invoke = current.asInvokeMethod();
         if (invoke.outValue() != null && !invoke.outValue().hasLocalInfo()) {
           if (libraryMethodsReturningReceiver.contains(invoke.getInvokedMethod())) {
-            if (checkArgumentType(invoke, invoke.getInvokedMethod(), 0)) {
+            if (checkArgumentType(invoke, 0)) {
               invoke.outValue().replaceUsers(invoke.arguments().get(0));
               invoke.setOutValue(null);
             }
@@ -1614,8 +1629,7 @@
               if (definition != null && definition.getOptimizationInfo().returnsArgument()) {
                 int argumentIndex = definition.getOptimizationInfo().getReturnedArgument();
                 // Replace the out value of the invoke with the argument and ignore the out value.
-                if (argumentIndex != -1
-                    && checkArgumentType(invoke, target.method, argumentIndex)) {
+                if (argumentIndex >= 0 && checkArgumentType(invoke, argumentIndex)) {
                   Value argument = invoke.arguments().get(argumentIndex);
                   Value outValue = invoke.outValue();
                   assert outValue.verifyCompatible(argument.outType());
diff --git a/src/main/java/com/android/tools/r8/references/Reference.java b/src/main/java/com/android/tools/r8/references/Reference.java
index bb8e57e..0e3d988 100644
--- a/src/main/java/com/android/tools/r8/references/Reference.java
+++ b/src/main/java/com/android/tools/r8/references/Reference.java
@@ -9,6 +9,7 @@
 import com.google.common.collect.MapMaker;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.List;
 import java.util.concurrent.ConcurrentMap;
 
 /**
@@ -119,15 +120,16 @@
   public static MethodReference method(
       ClassReference holderClass,
       String methodName,
-      ImmutableList<TypeReference> formalTypes,
+      List<TypeReference> formalTypes,
       TypeReference returnType) {
-    MethodReference key = new MethodReference(holderClass, methodName, formalTypes, returnType);
+    MethodReference key = new MethodReference(
+        holderClass, methodName, ImmutableList.copyOf(formalTypes), returnType);
     return getInstance().methods.computeIfAbsent(key,
         // Allocate a distinct value for the canonical reference so the key is not a strong pointer.
         k -> new MethodReference(
             k.getHolderClass(),
             k.getMethodName(),
-            (ImmutableList<TypeReference>) k.getFormalTypes(),
+            ImmutableList.copyOf(k.getFormalTypes()),
             k.getReturnType()));
   }
 
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 f10d000..673314d 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -604,7 +604,7 @@
       if (methodHandle.isMethodHandle() && use != MethodHandleUse.ARGUMENT_TO_LAMBDA_METAFACTORY) {
         DexClass holder = appInfo.definitionFor(methodHandle.asMethod().holder);
         if (holder != null) {
-          markClassAsInstantiatedWithMethodHandleRule(holder);
+          markInstantiated(holder.type, KeepReason.methodHandleReferencedIn(currentMethod));
         }
       }
     }
@@ -1189,8 +1189,10 @@
 
   private void markVirtualMethodAsLive(DexEncodedMethod method, KeepReason reason) {
     assert method != null;
-    // Only explicit keep rules should make abstract methods live.
-    assert !method.accessFlags.isAbstract() || reason.isDueToKeepRule();
+    // Only explicit keep rules or reflective use should make abstract methods live.
+    assert !method.accessFlags.isAbstract()
+        || reason.isDueToKeepRule()
+        || reason.isDueToReflectiveUse();
     if (!liveMethods.contains(method)) {
       if (Log.ENABLED) {
         Log.verbose(getClass(), "Adding virtual method `%s` to live set.", method.method);
@@ -1662,16 +1664,8 @@
             collectReachedFields(staticFields, this::tryLookupStaticField)));
   }
 
-  private void markClassAsInstantiatedWithMethodHandleRule(DexClass clazz) {
-    ProguardKeepRule rule =
-        ProguardConfigurationUtils.buildMethodHandleKeepRule(clazz);
-    proguardCompatibilityWorkList.add(
-        Action.markInstantiated(clazz, KeepReason.dueToProguardCompatibilityKeepRule(rule)));
-  }
-
   private void markClassAsInstantiatedWithCompatRule(DexClass clazz) {
-    ProguardKeepRule rule =
-        ProguardConfigurationUtils.buildDefaultInitializerKeepRule(clazz);
+    ProguardKeepRule rule = ProguardConfigurationUtils.buildDefaultInitializerKeepRule(clazz);
     proguardCompatibilityWorkList.add(
         Action.markInstantiated(clazz, KeepReason.dueToProguardCompatibilityKeepRule(rule)));
     if (clazz.hasDefaultInitializer()) {
@@ -1681,19 +1675,6 @@
     }
   }
 
-  private void markFieldAsKeptWithCompatRule(DexEncodedField field, boolean keepClass) {
-    DexClass holderClass = appInfo.definitionFor(field.field.getHolder());
-    ProguardKeepRule rule =
-        ProguardConfigurationUtils.buildFieldKeepRule(holderClass, field, keepClass);
-    if (keepClass) {
-      proguardCompatibilityWorkList.add(
-          Action.markInstantiated(
-              holderClass, KeepReason.dueToProguardCompatibilityKeepRule(rule)));
-    }
-    proguardCompatibilityWorkList.add(
-        Action.markFieldKept(field, KeepReason.dueToProguardCompatibilityKeepRule(rule)));
-  }
-
   private void markMethodAsKeptWithCompatRule(DexEncodedMethod method) {
     DexClass holderClass = appInfo.definitionFor(method.method.getHolder());
     ProguardKeepRule rule =
@@ -1733,7 +1714,11 @@
     if (identifierItem.isDexType()) {
       DexClass clazz = appInfo.definitionFor(identifierItem.asDexType());
       if (clazz != null) {
-        markClassAsInstantiatedWithCompatRule(clazz);
+        markInstantiated(clazz.type, KeepReason.reflectiveUseIn(method));
+        if (clazz.hasDefaultInitializer()) {
+          markDirectStaticOrConstructorMethodAsLive(
+              clazz.getDefaultInitializer(), KeepReason.reflectiveUseIn(method));
+        }
       }
     } else if (identifierItem.isDexField()) {
       DexEncodedField encodedField = appInfo.definitionFor(identifierItem.asDexField());
@@ -1746,13 +1731,22 @@
         boolean keepClass =
             !encodedField.accessFlags.isStatic()
                 && appInfo.dexItemFactory.atomicFieldUpdaterMethods.isFieldUpdater(invokedMethod);
-        markFieldAsKeptWithCompatRule(encodedField, keepClass);
+        if (keepClass) {
+          DexClass holderClass = appInfo.definitionFor(encodedField.field.getHolder());
+          markInstantiated(holderClass.type, KeepReason.reflectiveUseIn(method));
+        }
+        markFieldAsKept(encodedField, KeepReason.reflectiveUseIn(method));
       }
     } else {
       assert identifierItem.isDexMethod();
       DexEncodedMethod encodedMethod = appInfo.definitionFor(identifierItem.asDexMethod());
       if (encodedMethod != null) {
-        markMethodAsKeptWithCompatRule(encodedMethod);
+        if (encodedMethod.accessFlags.isStatic() || encodedMethod.accessFlags.isConstructor()) {
+          markDirectStaticOrConstructorMethodAsLive(
+              encodedMethod, KeepReason.reflectiveUseIn(method));
+        } else {
+          markVirtualMethodAsLive(encodedMethod, KeepReason.reflectiveUseIn(method));
+        }
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepReason.java b/src/main/java/com/android/tools/r8/shaking/KeepReason.java
index 16d78a7..a797742 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepReason.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepReason.java
@@ -61,6 +61,10 @@
     return false;
   }
 
+  public boolean isDueToReflectiveUse() {
+    return false;
+  }
+
   public boolean isDueToProguardCompatibility() {
     return false;
   }
@@ -73,6 +77,14 @@
     return new TargetedBySuper(from);
   }
 
+  public static KeepReason reflectiveUseIn(DexEncodedMethod method) {
+    return new ReflectiveUseFrom(method);
+  }
+
+  public static KeepReason methodHandleReferencedIn(DexEncodedMethod method) {
+    return new MethodHandleReferencedFrom(method);
+  }
+
   private static class DueToKeepRule extends KeepReason {
 
     final ProguardKeepRule keepRule;
@@ -289,4 +301,43 @@
       return enqueuer.getAnnotationGraphNode(holder);
     }
   }
+
+  private static class ReflectiveUseFrom extends BasedOnOtherMethod {
+
+    private ReflectiveUseFrom(DexEncodedMethod method) {
+      super(method);
+    }
+
+    @Override
+    public boolean isDueToReflectiveUse() {
+      return true;
+    }
+
+    @Override
+    public EdgeKind edgeKind() {
+      return EdgeKind.ReflectiveUseFrom;
+    }
+
+    @Override
+    String getKind() {
+      return "reflective use in";
+    }
+  }
+
+  private static class MethodHandleReferencedFrom extends BasedOnOtherMethod {
+
+    private MethodHandleReferencedFrom(DexEncodedMethod method) {
+      super(method);
+    }
+
+    @Override
+    public EdgeKind edgeKind() {
+      return EdgeKind.MethodHandleUseFrom;
+    }
+
+    @Override
+    String getKind() {
+      return "method handle referenced from";
+    }
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
index 163c60b..f9846b8 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
@@ -5,13 +5,8 @@
 package com.android.tools.r8.shaking;
 
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexReference;
-import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.ProguardConfigurationParser.IdentifierPatternWithWildcards;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -31,19 +26,6 @@
         }
       };
 
-  public static ProguardKeepRule buildMethodHandleKeepRule(DexClass clazz) {
-    ProguardKeepRule.Builder builder = ProguardKeepRule.builder();
-    builder.setOrigin(proguardCompatOrigin);
-    builder.setType(ProguardKeepRuleType.KEEP);
-    builder.getModifiersBuilder().setAllowsObfuscation(true);
-    builder.getModifiersBuilder().setAllowsOptimization(true);
-    builder.setClassType(
-        clazz.isInterface() ? ProguardClassType.INTERFACE : ProguardClassType.CLASS);
-    builder.setClassNames(
-        ProguardClassNameList.singletonList(ProguardTypeMatcher.create(clazz.type)));
-    return builder.build();
-  }
-
   public static ProguardKeepRule buildDefaultInitializerKeepRule(DexClass clazz) {
     ProguardKeepRule.Builder builder = ProguardKeepRule.builder();
     builder.setOrigin(proguardCompatOrigin);
@@ -64,36 +46,6 @@
     return builder.build();
   }
 
-  public static ProguardKeepRule buildFieldKeepRule(
-      DexClass clazz, DexEncodedField field, boolean keepClass) {
-    assert clazz.type == field.field.getHolder();
-    ProguardKeepRule.Builder builder = ProguardKeepRule.builder();
-    builder.setOrigin(proguardCompatOrigin);
-    if (keepClass) {
-      builder.setType(ProguardKeepRuleType.KEEP);
-    } else {
-      builder.setType(ProguardKeepRuleType.KEEP_CLASS_MEMBERS);
-    }
-    builder.getModifiersBuilder().setAllowsObfuscation(true);
-    builder.getModifiersBuilder().setAllowsOptimization(true);
-    builder.getClassAccessFlags().setVisibility(clazz.accessFlags);
-    if (clazz.isInterface()) {
-      builder.setClassType(ProguardClassType.INTERFACE);
-    } else {
-      builder.setClassType(ProguardClassType.CLASS);
-    }
-    builder.setClassNames(
-        ProguardClassNameList.singletonList(ProguardTypeMatcher.create(clazz.type)));
-    ProguardMemberRule.Builder memberRuleBuilder = ProguardMemberRule.builder();
-    memberRuleBuilder.setRuleType(ProguardMemberType.FIELD);
-    memberRuleBuilder.getAccessFlags().setFlags(field.accessFlags);
-    memberRuleBuilder.setName(
-        IdentifierPatternWithWildcards.withoutWildcards(field.field.name.toString()));
-    memberRuleBuilder.setTypeMatcher(ProguardTypeMatcher.create(field.field.type));
-    builder.getMemberRules().add(memberRuleBuilder.build());
-    return builder.build();
-  }
-
   public static ProguardKeepRule buildMethodKeepRule(DexClass clazz, DexEncodedMethod method) {
     // TODO(b/122295241): These generated rules should be linked into the graph, eg, the method
     // using identified reflection should be the source keeping the target alive.
@@ -125,41 +77,6 @@
     return builder.build();
   }
 
-  public static ProguardIdentifierNameStringRule buildIdentifierNameStringRule(DexReference item) {
-    assert item.isDexField() || item.isDexMethod();
-    ProguardIdentifierNameStringRule.Builder builder = ProguardIdentifierNameStringRule.builder();
-    ProguardMemberRule.Builder memberRuleBuilder = ProguardMemberRule.builder();
-    DexType holderType;
-    if (item.isDexField()) {
-      DexField field = item.asDexField();
-      holderType = field.getHolder();
-      memberRuleBuilder.setRuleType(ProguardMemberType.FIELD);
-      memberRuleBuilder.setName(
-          IdentifierPatternWithWildcards.withoutWildcards(field.name.toString()));
-      memberRuleBuilder.setTypeMatcher(ProguardTypeMatcher.create(field.type));
-    } else {
-      DexMethod method = item.asDexMethod();
-      holderType = method.getHolder();
-      memberRuleBuilder.setRuleType(ProguardMemberType.METHOD);
-      memberRuleBuilder.setName(
-          IdentifierPatternWithWildcards.withoutWildcards(method.name.toString()));
-      memberRuleBuilder.setTypeMatcher(ProguardTypeMatcher.create(method.proto.returnType));
-      List<ProguardTypeMatcher> arguments = Arrays.stream(method.proto.parameters.values)
-          .map(ProguardTypeMatcher::create)
-          .collect(Collectors.toList());
-      memberRuleBuilder.setArguments(arguments);
-    }
-    if (holderType.isInterface()) {
-      builder.setClassType(ProguardClassType.INTERFACE);
-    } else {
-      builder.setClassType(ProguardClassType.CLASS);
-    }
-    builder.setClassNames(
-        ProguardClassNameList.singletonList(ProguardTypeMatcher.create(holderType)));
-    builder.getMemberRules().add(memberRuleBuilder.build());
-    return builder.build();
-  }
-
   public static ProguardAssumeValuesRule buildAssumeValuesForApiLevel(
       DexItemFactory factory, AndroidApiLevel apiLevel) {
     Origin synthesizedFromApiLevel =
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 6504169..906aee9 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -23,8 +23,6 @@
 import com.android.tools.r8.shaking.ProguardConfigurationParser;
 import com.android.tools.r8.shaking.ProguardConfigurationRule;
 import com.android.tools.r8.shaking.ProguardKeepAttributes;
-import com.android.tools.r8.shaking.ProguardKeepRule;
-import com.android.tools.r8.shaking.ProguardKeepRuleType;
 import com.android.tools.r8.shaking.ProguardMemberRule;
 import com.android.tools.r8.shaking.ProguardMemberType;
 import com.android.tools.r8.shaking.forceproguardcompatibility.defaultmethods.ClassImplementingInterface;
@@ -40,8 +38,6 @@
 import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
-import it.unimi.dsi.fastutil.objects.Object2BooleanArrayMap;
-import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
 import java.io.File;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -277,39 +273,6 @@
       assertEquals(subject.isPresent() && allowObfuscation, subject.isRenamed());
     });
 
-    // Check the Proguard compatibility rules generated.
-    ProguardConfigurationParser parser =
-        new ProguardConfigurationParser(new DexItemFactory(), new Reporter());
-    parser.parse(proguardCompatibilityRules);
-    ProguardConfiguration configuration = parser.getConfigRawForTesting();
-    if (forceProguardCompatibility) {
-      List<ProguardConfigurationRule> rules = configuration.getRules();
-      assertEquals(2, rules.size());
-      for (ProguardConfigurationRule r : rules) {
-        assertTrue(r instanceof ProguardKeepRule);
-        ProguardKeepRule rule = (ProguardKeepRule) r;
-        assertEquals(ProguardKeepRuleType.KEEP, rule.getType());
-        assertTrue(rule.getModifiers().allowsObfuscation);
-        assertTrue(rule.getModifiers().allowsOptimization);
-        List<ProguardMemberRule> memberRules = rule.getMemberRules();
-        ProguardClassNameList classNames = rule.getClassNames();
-        assertEquals(1, classNames.size());
-        DexType type = classNames.asSpecificDexTypes().get(0);
-        if (type.toSourceString().equals(forNameClass1.getCanonicalName())) {
-          assertEquals(1, memberRules.size());
-          assertEquals(ProguardMemberType.INIT, memberRules.iterator().next().getRuleType());
-        } else {
-          assertTrue(type.toSourceString().equals(forNameClass2.getCanonicalName()));
-          // During parsing we add in the default constructor if there are otherwise no single
-          // member rule.
-          assertEquals(1, memberRules.size());
-          assertEquals(ProguardMemberType.INIT, memberRules.iterator().next().getRuleType());
-        }
-      }
-    } else {
-      assertEquals(0, configuration.getRules().size());
-    }
-
     if (isRunProguard()) {
       Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
       Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
@@ -376,38 +339,6 @@
     assertTrue(bar.isPresent());
     assertEquals(bar.isPresent() && allowObfuscation, bar.isRenamed());
 
-    // Check the Proguard compatibility rules generated.
-    ProguardConfigurationParser parser =
-        new ProguardConfigurationParser(new DexItemFactory(), new Reporter());
-    parser.parse(proguardCompatibilityRules);
-    ProguardConfiguration configuration = parser.getConfigRawForTesting();
-    if (forceProguardCompatibility) {
-      List<ProguardConfigurationRule> rules = configuration.getRules();
-      assertEquals(2, rules.size());
-      for (ProguardConfigurationRule r : rules) {
-        assertTrue(r instanceof ProguardKeepRule);
-        ProguardKeepRule rule = (ProguardKeepRule) r;
-        assertEquals(ProguardKeepRuleType.KEEP_CLASS_MEMBERS, rule.getType());
-        assertTrue(rule.getModifiers().allowsObfuscation);
-        assertTrue(rule.getModifiers().allowsOptimization);
-        List<ProguardMemberRule> memberRules = rule.getMemberRules();
-        ProguardClassNameList classNames = rule.getClassNames();
-        assertEquals(1, classNames.size());
-        DexType type = classNames.asSpecificDexTypes().get(0);
-        assertEquals(withMemberClass.getCanonicalName(), type.toSourceString());
-        assertEquals(1, memberRules.size());
-        ProguardMemberRule memberRule = memberRules.iterator().next();
-        if (memberRule.getRuleType() == ProguardMemberType.FIELD) {
-          assertTrue(memberRule.getName().matches("foo"));
-        } else {
-          assertEquals(ProguardMemberType.METHOD, memberRule.getRuleType());
-          assertTrue(memberRule.getName().matches("bar"));
-        }
-      }
-    } else {
-      assertEquals(0, configuration.getRules().size());
-    }
-
     if (isRunProguard()) {
       Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
       Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
@@ -481,39 +412,6 @@
     assertTrue(f.isPresent());
     assertEquals(f.isPresent() && allowObfuscation, f.isRenamed());
 
-    // Check the Proguard compatibility rules generated.
-    ProguardConfigurationParser parser =
-        new ProguardConfigurationParser(new DexItemFactory(), new Reporter());
-    parser.parse(proguardCompatibilityRules);
-    ProguardConfiguration configuration = parser.getConfigRawForTesting();
-    if (forceProguardCompatibility) {
-      List<ProguardConfigurationRule> rules = configuration.getRules();
-      assertEquals(3, rules.size());
-      Object2BooleanMap<String> keptFields = new Object2BooleanArrayMap<>();
-      for (ProguardConfigurationRule r : rules) {
-        assertTrue(r instanceof ProguardKeepRule);
-        ProguardKeepRule rule = (ProguardKeepRule) r;
-        assertEquals(ProguardKeepRuleType.KEEP, rule.getType());
-        assertTrue(rule.getModifiers().allowsObfuscation);
-        assertTrue(rule.getModifiers().allowsOptimization);
-        List<ProguardMemberRule> memberRules = rule.getMemberRules();
-        ProguardClassNameList classNames = rule.getClassNames();
-        assertEquals(1, classNames.size());
-        DexType type = classNames.asSpecificDexTypes().get(0);
-        assertEquals(withVolatileFields.getCanonicalName(), type.toSourceString());
-        assertEquals(1, memberRules.size());
-        ProguardMemberRule memberRule = memberRules.iterator().next();
-        assertEquals(ProguardMemberType.FIELD, memberRule.getRuleType());
-        keptFields.put(memberRule.getName().toString(), true);
-      }
-      assertEquals(3, keptFields.size());
-      assertTrue(keptFields.containsKey("intField"));
-      assertTrue(keptFields.containsKey("longField"));
-      assertTrue(keptFields.containsKey("objField"));
-    } else {
-      assertEquals(0, configuration.getRules().size());
-    }
-
     if (isRunProguard()) {
       Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
       Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
diff --git a/tools/archive.py b/tools/archive.py
index ce04494..d8fb4d0 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -91,12 +91,6 @@
   if not utils.is_bot() and not options.dry_run:
     raise Exception('You are not a bot, don\'t archive builds')
 
-  # Generate an r8-ed build without dependencies.
-  # The '-Pno_internal' flag is important because we generate the lib based on uses in tests.
-  gradle.RunGradleExcludeDeps([utils.R8LIB_NO_DEPS, '-Pno_internal'])
-  shutil.copyfile(utils.R8LIB_JAR, utils.R8LIB_EXCLUDE_DEPS_JAR)
-  shutil.copyfile(utils.R8LIB_JAR + '.map', utils.R8LIB_EXCLUDE_DEPS_JAR + '.map')
-
   # Create maven release which uses a build that exclude dependencies.
   create_maven_release.main(["--out", utils.LIBS])
 
@@ -114,6 +108,7 @@
     utils.COMPATDX,
     utils.COMPATPROGUARD,
     utils.R8LIB,
+    utils.R8LIB_NO_DEPS,
     utils.COMPATDXLIB,
     utils.COMPATPROGUARDLIB,
     '-Pno_internal'
diff --git a/tools/test.py b/tools/test.py
index 6b24433..043487c 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -185,7 +185,6 @@
     gradle_args.append('-Pr8lib')
   if options.r8lib_no_deps:
     gradle_args.append('-Pr8lib_no_deps')
-    gradle_args.append('-Pexclude_deps')
 
   # Add Gradle tasks
   gradle_args.append('cleanTest')