Enable lir-to-lir desugaring in R8

Change-Id: I2f84369889c261782322d8ec1ab28a890014579c
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiModelingOptions.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiModelingOptions.java
index 813529f..6c61415 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiModelingOptions.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiModelingOptions.java
@@ -6,6 +6,7 @@
 import static com.android.tools.r8.utils.CfUtils.extractClassDescriptor;
 
 import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.references.ClassReference;
@@ -126,18 +127,26 @@
     return isApiModelingEnabled() && options.isGeneratingDex() && enableOutliningOfMethods;
   }
 
-  public boolean isCfToCfApiOutliningEnabled() {
+  public boolean isCfToCfApiOutliningEnabled(AppView<?> appView) {
     if (isOutliningOfMethodsEnabled()) {
-      // Enable cf-to-cf when running normal D8/R8. When running R8 partial, enable cf-to-cf
-      // desugaring when there is no library desugaring.
-      return options.partialSubCompilationConfiguration == null
-          || !options.getSubCompilationLibraryDesugaringOptions().isEnabled();
+      if (options.partialSubCompilationConfiguration != null) {
+        // When running R8 partial, enable cf-to-cf desugaring when there is no library desugaring.
+        return !options.getSubCompilationLibraryDesugaringOptions().isEnabled();
+      }
+      if (appView.enableWholeProgramOptimizations()) {
+        // When running R8, for consistency with R8 partial, enable cf-to-cf desugaring when there
+        // is no library desugaring.
+        return !options.getLibraryDesugaringOptions().isEnabled();
+      } else {
+        // Always use cf-to-cf desugaring in D8.
+        return true;
+      }
     }
     return false;
   }
 
-  public boolean isLirToLirApiOutliningEnabled() {
-    return isOutliningOfMethodsEnabled() && !isCfToCfApiOutliningEnabled();
+  public boolean isLirToLirApiOutliningEnabled(AppView<?> appView) {
+    return isOutliningOfMethodsEnabled() && !isCfToCfApiOutliningEnabled(appView);
   }
 
   public boolean isCheckAllApiReferencesAreSet() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
index b765ca4..9f1c7be 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
@@ -128,15 +128,15 @@
       }
       if (appView.enableWholeProgramOptimizations()) {
         if (enqueuer != null) {
-          return libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled();
+          return libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled(appView);
         } else {
           // We only reach here if we are running lir-to-lir library desugaring.
-          assert libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled();
+          assert libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled(appView);
           return true;
         }
       } else {
         // Library desugaring is cf-to-cf in D8.
-        assert libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled();
+        assert libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled(appView);
         return true;
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
index 3bd73cf..cd2567f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
@@ -59,7 +59,7 @@
 
   public static CfToCfApiInvokeOutlinerDesugaring createCfToCf(
       AppView<?> appView, AndroidApiLevelCompute apiLevelCompute) {
-    if (appView.options().apiModelingOptions().isCfToCfApiOutliningEnabled()) {
+    if (appView.options().apiModelingOptions().isCfToCfApiOutliningEnabled(appView)) {
       return new CfToCfApiInvokeOutlinerDesugaring(appView, apiLevelCompute);
     }
     return null;
@@ -69,7 +69,7 @@
       AppView<?> appView,
       AndroidApiLevelCompute apiLevelCompute,
       CfInstructionDesugaringEventConsumer eventConsumer) {
-    if (appView.options().apiModelingOptions().isLirToLirApiOutliningEnabled()) {
+    if (appView.options().apiModelingOptions().isLirToLirApiOutliningEnabled(appView)) {
       return new LirToLirApiInvokeOutlinerDesugaring(appView, apiLevelCompute, eventConsumer);
     }
     return null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java
index 0a6aa20..3f90327 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.desugar.desugaredlibrary;
 
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
@@ -131,14 +132,14 @@
     return !synthesizedClassPrefix.isEmpty();
   }
 
-  public boolean isCfToCfLibraryDesugaringEnabled() {
-    return isEnabled() && !isLirToLirLibraryDesugaringEnabled();
+  public boolean isCfToCfLibraryDesugaringEnabled(AppView<?> appView) {
+    // Cf-to-cf library desugaring is always enabled in D8.
+    return isEnabled() && !appView.enableWholeProgramOptimizations();
   }
 
-  public boolean isLirToLirLibraryDesugaringEnabled() {
-    return isEnabled()
-        && options.partialSubCompilationConfiguration != null
-        && options.partialSubCompilationConfiguration.isR8();
+  public boolean isLirToLirLibraryDesugaringEnabled(AppView<?> appView) {
+    // Lir-to-lir library desugaring is always enabled in R8 and R8 partial.
+    return isEnabled() && appView.enableWholeProgramOptimizations();
   }
 
   public void resetDesugaredLibrarySpecificationForTesting() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/R8LibraryDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/R8LibraryDesugaring.java
index 9874af7..593c603 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/R8LibraryDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/R8LibraryDesugaring.java
@@ -58,12 +58,15 @@
       throws ExecutionException {
     InternalOptions options = appView.options();
     if (options.isDesugaring()) {
-      if (options.getLibraryDesugaringOptions().isEnabled()
-          && options.getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled()
-          && options.isGeneratingDex()) {
+      boolean needsApiModeling =
+          options.apiModelingOptions().isApiModelingEnabled()
+              && options.apiModelingOptions().isLirToLirApiOutliningEnabled(appView);
+      boolean needsLibraryDesugaring =
+          options.getLibraryDesugaringOptions().isEnabled()
+              && options.getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled(appView);
+      if (needsApiModeling || needsLibraryDesugaring) {
+        assert options.isGeneratingDex();
         new R8LibraryDesugaring(appView).run(executorService, timing);
-      } else {
-        assert !appView.options().apiModelingOptions().isLirToLirApiOutliningEnabled();
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index 837225a..7471f0c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -77,7 +77,7 @@
       InterfaceMethodRewriter interfaceMethodRewriter) {
     LibraryDesugaringOptions libraryDesugaringOptions =
         appView.options().getLibraryDesugaringOptions();
-    if (libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled()
+    if (libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled(appView)
         && libraryDesugaringOptions.hasTypeRewriter()) {
       return new CfToCfDesugaredLibraryApiConverter(
           appView, interfaceMethodRewriter, precedingDesugarings);
@@ -91,7 +91,7 @@
       InterfaceMethodRewriter interfaceMethodRewriter) {
     LibraryDesugaringOptions libraryDesugaringOptions =
         appView.options().getLibraryDesugaringOptions();
-    if (libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled()
+    if (libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled(appView)
         && libraryDesugaringOptions.hasTypeRewriter()) {
       return new LirToLirDesugaredLibraryApiConverter(
           appView, eventConsumer, interfaceMethodRewriter);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
index 7f938a4..5c144af 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
@@ -28,14 +28,20 @@
 
   public static CfToCfDesugaredLibraryDisableDesugarer createCfToCf(AppView<?> appView) {
     return DesugaredLibraryDisableDesugarerHelper.shouldCreate(appView)
-            && appView.options().getLibraryDesugaringOptions().isCfToCfLibraryDesugaringEnabled()
+            && appView
+                .options()
+                .getLibraryDesugaringOptions()
+                .isCfToCfLibraryDesugaringEnabled(appView)
         ? new CfToCfDesugaredLibraryDisableDesugarer(appView)
         : null;
   }
 
   public static LirToLirDesugaredLibraryDisableDesugarer createLirToLir(AppView<?> appView) {
     return DesugaredLibraryDisableDesugarerHelper.shouldCreate(appView)
-            && appView.options().getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled()
+            && appView
+                .options()
+                .getLibraryDesugaringOptions()
+                .isLirToLirLibraryDesugaringEnabled(appView)
         ? new LirToLirDesugaredLibraryDisableDesugarer(appView)
         : null;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
index 4c31664..2a40cee 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
@@ -49,7 +49,7 @@
   public static CfToCfDesugaredLibraryRetargeter createCfToCf(AppView<?> appView) {
     LibraryDesugaringOptions libraryDesugaringOptions =
         appView.options().getLibraryDesugaringOptions();
-    if (libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled()
+    if (libraryDesugaringOptions.isCfToCfLibraryDesugaringEnabled(appView)
         && libraryDesugaringOptions.getMachineDesugaredLibrarySpecification().hasRetargeting()) {
       return new CfToCfDesugaredLibraryRetargeter(appView);
     }
@@ -60,7 +60,7 @@
       AppView<?> appView, CfInstructionDesugaringEventConsumer eventConsumer) {
     LibraryDesugaringOptions libraryDesugaringOptions =
         appView.options().getLibraryDesugaringOptions();
-    if (libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled()
+    if (libraryDesugaringOptions.isLirToLirLibraryDesugaringEnabled(appView)
         && libraryDesugaringOptions.getMachineDesugaredLibrarySpecification().hasRetargeting()) {
       return new LirToLirDesugaredLibraryRetargeter(appView, eventConsumer);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
index aac75bc..cbe7634 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
@@ -46,6 +46,7 @@
 import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.structural.Ordered;
 import com.google.common.collect.ImmutableList;
 import java.util.function.Predicate;
@@ -97,6 +98,22 @@
 
   static InterfaceDesugaringSyntheticHelper createSubCompilationHelper(
       AppView<?> appView, InterfaceMethodDesugaringMode desugaringMode) {
+    if (desugaringMode.isLibraryDesugaring()) {
+      // Don't create a sub compilation helper when library desugaring is already enabled.
+      // The sub compilation helper is only needed to tweak interface method desugaring when
+      // library desugaring is performed lir-to-lir.
+      return null;
+    }
+    InternalOptions options = appView.options();
+    if (!appView.enableWholeProgramOptimizations()
+        && options.partialSubCompilationConfiguration == null) {
+      // In D8 all desugaring runs cf-to-cf and we do not need to do anything.
+      return null;
+    }
+    // This is an R8 build or the D8 build of an R8 partial build. In this case, we tweak interface
+    // method desugaring using the library desugaring options.
+    assert options.partialSubCompilationConfiguration == null
+        || options.partialSubCompilationConfiguration.isD8();
     LibraryDesugaringOptions libraryDesugaringOptions =
         appView.options().getSubCompilationLibraryDesugaringOptions();
     return new InterfaceDesugaringSyntheticHelper(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodDesugaringMode.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodDesugaringMode.java
index 33a822d..be84827 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodDesugaringMode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodDesugaringMode.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.desugar.itf;
 
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.utils.InternalOptions;
 
 public enum InterfaceMethodDesugaringMode {
@@ -18,14 +19,20 @@
   // Desugaring is disabled.
   NONE;
 
-  public static InterfaceMethodDesugaringMode createCfToCf(InternalOptions options) {
+  public static InterfaceMethodDesugaringMode createCfToCf(AppView<?> appView) {
+    InternalOptions options = appView.options();
     return create(
-        options, true, options.getLibraryDesugaringOptions().isCfToCfLibraryDesugaringEnabled());
+        options,
+        true,
+        options.getLibraryDesugaringOptions().isCfToCfLibraryDesugaringEnabled(appView));
   }
 
-  public static InterfaceMethodDesugaringMode createLirToLir(InternalOptions options) {
+  public static InterfaceMethodDesugaringMode createLirToLir(AppView<?> appView) {
+    InternalOptions options = appView.options();
     return create(
-        options, false, options.getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled());
+        options,
+        false,
+        options.getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled(appView));
   }
 
   public static InterfaceMethodDesugaringMode createForInterfaceMethodDesugaringInRootSetBuilder(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 280d710..65d9650 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -101,13 +101,8 @@
     this.options = appView.options();
     this.factory = appView.dexItemFactory();
     this.helper = new InterfaceDesugaringSyntheticHelper(appView, desugaringMode);
-    if (options.partialSubCompilationConfiguration != null
-        && options.partialSubCompilationConfiguration.isD8()) {
-      this.subCompilationHelper =
-          InterfaceDesugaringSyntheticHelper.createSubCompilationHelper(appView, desugaringMode);
-    } else {
-      this.subCompilationHelper = null;
-    }
+    this.subCompilationHelper =
+        InterfaceDesugaringSyntheticHelper.createSubCompilationHelper(appView, desugaringMode);
 
     if (desugaringMode.isLibraryDesugaring()) {
       initializeEmulatedInterfaceVariables();
@@ -120,7 +115,7 @@
       Set<CfInstructionDesugaring> precedingDesugaringsForInvokeDynamic) {
     return create(
         appView,
-        InterfaceMethodDesugaringMode.createCfToCf(appView.options()),
+        InterfaceMethodDesugaringMode.createCfToCf(appView),
         precedingDesugaringsForInvoke,
         precedingDesugaringsForInvokeDynamic);
   }
@@ -128,7 +123,7 @@
   public static LirToLirInterfaceMethodRewriter createLirToLir(
       AppView<?> appView, CfInstructionDesugaringEventConsumer eventConsumer) {
     InterfaceMethodDesugaringMode desugaringMode =
-        InterfaceMethodDesugaringMode.createLirToLir(appView.options());
+        InterfaceMethodDesugaringMode.createLirToLir(appView);
     return desugaringMode.isSome()
         ? new LirToLirInterfaceMethodRewriter(appView, desugaringMode, eventConsumer)
         : null;
@@ -285,6 +280,12 @@
       // We did not create this code yet, but it will not require rewriting.
       return RetargetMethodSupplier.none();
     }
+    if (holder.isLibraryClass()
+        && subCompilationHelper != null
+        && subCompilationHelper.isInDesugaredLibrary(holder)) {
+      // Defer desugaring of this invoke-static to lir-to-lir library desugaring.
+      return RetargetMethodSupplier.none();
+    }
     if (isNonDesugaredLibraryClass(holder)) {
       // NOTE: we intentionally don't desugar static calls into static interface
       // methods coming from android.jar since it is only possible in case v24+
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
index 4c12b8f..40b386a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -65,13 +65,13 @@
 
   public static InterfaceProcessor createCfToCf(AppView<?> appView) {
     InterfaceMethodDesugaringMode desugaringMode =
-        InterfaceMethodDesugaringMode.createCfToCf(appView.options());
+        InterfaceMethodDesugaringMode.createCfToCf(appView);
     return create(appView, desugaringMode);
   }
 
   public static InterfaceProcessor createLirToLir(AppView<?> appView) {
     InterfaceMethodDesugaringMode desugaringMode =
-        InterfaceMethodDesugaringMode.createLirToLir(appView.options());
+        InterfaceMethodDesugaringMode.createLirToLir(appView);
     return create(appView, desugaringMode);
   }
 
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 f020f5c..ca00c0c 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -4498,7 +4498,10 @@
         .dexItemFactory()
         .forEachPossiblyCompilerSynthesizedType(this::recordCompilerSynthesizedTypeReference);
     appView.rootSet().rootNonProgramTypes.forEach(this::recordCompilerSynthesizedTypeReference);
-    if (appView.options().getLibraryDesugaringOptions().isLirToLirLibraryDesugaringEnabled()) {
+    if (appView
+        .options()
+        .getLibraryDesugaringOptions()
+        .isLirToLirLibraryDesugaringEnabled(appView)) {
       appView
           .options()
           .getLibraryDesugaringOptions()
diff --git a/src/test/examplesJava9/desugaredlib/ProgramRewritingTest.java b/src/test/examplesJava9/desugaredlib/ProgramRewritingTest.java
index 3333f39..2d0c5ca 100644
--- a/src/test/examplesJava9/desugaredlib/ProgramRewritingTest.java
+++ b/src/test/examplesJava9/desugaredlib/ProgramRewritingTest.java
@@ -140,7 +140,7 @@
   }
 
   private void checkRewrittenInvokes(CodeInspector inspector) {
-    if (parameters.getApiLevel().getLevel() >= AndroidApiLevel.N.getLevel()) {
+    if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
       return;
     }
     ClassSubject classSubject = inspector.clazz(TEST_CLASS);
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java
index 4c11361..e0f24cd 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java
@@ -1,13 +1,12 @@
 // Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-
 package com.android.tools.r8.classmerging.vertical;
 
 import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.R8_L8DEBUG;
 import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsentIf;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.NeverClassInline;
@@ -22,14 +21,20 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
 public class ForceInlineConstructorWithRetargetedLibMemberTest extends DesugaredLibraryTestBase {
 
-  private final TestParameters parameters;
-  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
-  private final CompilationSpecification compilationSpecification;
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameter(1)
+  public LibraryDesugaringSpecification libraryDesugaringSpecification;
+
+  @Parameter(2)
+  public CompilationSpecification compilationSpecification;
 
   @Parameters(name = "{0}, spec: {1}, {2}")
   public static List<Object[]> data() {
@@ -39,15 +44,6 @@
         ImmutableList.of(R8_L8DEBUG));
   }
 
-  public ForceInlineConstructorWithRetargetedLibMemberTest(
-      TestParameters parameters,
-      LibraryDesugaringSpecification libraryDesugaringSpecification,
-      CompilationSpecification compilationSpecification) {
-    this.parameters = parameters;
-    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
-    this.compilationSpecification = compilationSpecification;
-  }
-
   @Test
   public void test() throws Throwable {
     testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
@@ -55,12 +51,20 @@
         .addKeepMainRule(TestClass.class)
         .enableNeverClassInliningAnnotations()
         .enableInliningAnnotations()
+        // Arrays#stream was introduced in API 24.
         .addVerticallyMergedClassesInspector(
-            inspector -> inspector.assertMergedIntoSubtype(A.class))
+            inspector ->
+                inspector
+                    .applyIf(
+                        parameters.canUseDefaultAndStaticInterfaceMethods(),
+                        i -> i.assertMergedIntoSubtype(A.class))
+                    .assertNoOtherClassesMerged())
         .compile()
         .inspect(
             inspector -> {
-              assertThat(inspector.clazz(A.class), not(isPresent()));
+              assertThat(
+                  inspector.clazz(A.class),
+                  isAbsentIf(parameters.canUseDefaultAndStaticInterfaceMethods()));
               assertThat(inspector.clazz(B.class), isPresent());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
index ed5b42a..b472dd6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
@@ -14,14 +14,11 @@
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.NoVerticalClassMerging;
-import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
-import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.SetUtils;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.codeinspector.CheckCastInstructionSubject;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
@@ -98,7 +95,6 @@
   private void checkRewrittenInvokes(CodeInspector inspector) {
     Set<String> expectedInvokeHolders;
     Set<String> expectedCatchGuards;
-    Set<String> expectedCheckCastType;
     String expectedInstanceOfTypes;
     boolean isR8 = compilationSpecification.isProgramShrink();
     if (!libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
@@ -108,7 +104,6 @@
         expectedInvokeHolders.add("java.time.ZoneOffset");
       }
       expectedCatchGuards = ImmutableSet.of("java.time.format.DateTimeParseException");
-      expectedCheckCastType = ImmutableSet.of("java.time.ZoneId");
       expectedInstanceOfTypes = "java.time.ZoneOffset";
     } else {
       expectedInvokeHolders =
@@ -117,7 +112,6 @@
         expectedInvokeHolders.add("j$.time.ZoneOffset");
       }
       expectedCatchGuards = ImmutableSet.of("j$.time.format.DateTimeParseException");
-      expectedCheckCastType = ImmutableSet.of("j$.time.ZoneId");
       expectedInstanceOfTypes = "j$.time.ZoneOffset";
     }
     ClassSubject classSubject = inspector.clazz(TestClass.class);
@@ -132,13 +126,6 @@
             .filter(holder -> holder.startsWith("j$.time.") || holder.startsWith("java.time."))
             .collect(Collectors.toSet());
     assertEquals(expectedInvokeHolders, foundInvokeHolders);
-    main.streamInstructions()
-        .filter(InstructionSubject::isCheckCast)
-        .map(InstructionSubject::asCheckCast)
-        .map(CheckCastInstructionSubject::getType)
-        .map(DexType::toSourceString)
-        .collect(Collectors.toSet())
-        .equals(expectedCheckCastType);
     assertEquals(
         1,
         main.streamInstructions().filter(io -> io.isInstanceOf(expectedInstanceOfTypes)).count());
@@ -149,10 +136,7 @@
             .map(TypeSubject::toString)
             .collect(Collectors.toSet());
     assertEquals(expectedCatchGuards, foundCatchGuards);
-    if (parameters
-            .getApiLevel()
-            .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
-        && isR8) {
+    if (parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring() && isR8) {
       String holder =
           libraryDesugaringSpecification.hasTimeDesugaring(parameters)
               ? "j$.time.temporal.TemporalAccessor"
@@ -160,23 +144,17 @@
       assertThat(
           inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
           invokesMethod(null, holder, "query", null));
+    } else if (!parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring() && isR8) {
+      assertThat(
+          inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
+          invokesMethod(null, "j$.time.temporal.TemporalAccessor$-CC", "$default$query", null));
     } else {
-      if (!parameters
-              .getApiLevel()
-              .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
-          && isR8) {
-        assertThat(
-            inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
-            invokesMethod(null, "j$.time.temporal.TemporalAccessor$-CC", "$default$query", null));
-      } else {
-        assertThat(
-            inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
-            invokesMethod(
-                null, inspector.clazz(TemporalAccessorImpl.class).getFinalName(), "query", null));
-      }
+      assertThat(
+          inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
+          invokesMethod(
+              null, inspector.clazz(TemporalAccessorImpl.class).getFinalName(), "query", null));
     }
-    if (parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring()
-        || (isR8 && !compilationSpecification.isProgramShrinkWithPartial())) {
+    if (parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring()) {
       assertThat(
           inspector.clazz(TemporalAccessorImpl.class).uniqueMethodWithOriginalName("query"),
           isAbsent());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
index 89079d4..155cff7 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
@@ -34,7 +34,7 @@
   @Parameters(name = "{0}, spec: {1}, {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        getTestParameters().withDexRuntimesAndAllApiLevels().build(),
         getJdk8Jdk11(),
         SPECIFICATIONS_WITH_CF2CF);
   }
@@ -59,17 +59,13 @@
         .applyIf(
             !libraryDesugaringSpecification.hasJDollarFunction(parameters)
                 || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)
-                || (compilationSpecification.isProgramShrinkWithPartial()
+                || (compilationSpecification.isProgramShrink()
                     && (parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V7_0_0)
                         || libraryDesugaringSpecification == JDK11)),
             r -> r.assertSuccessWithOutput(EXPECTED_RESULT),
             r -> {
               if (compilationSpecification.isProgramShrink()) {
-                if (compilationSpecification.isProgramShrinkWithPartial()) {
-                  r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
-                } else {
-                  r.assertFailureWithErrorThatThrows(NoSuchMethodError.class);
-                }
+                r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
               } else {
                 r.assertFailureWithErrorThatThrows(AbstractMethodError.class);
               }