Ensure lambda desugaring never exceeds class file method size limit

Bug: b/225839019
Change-Id: Ib19ff165493de159e44d3ca5a020a49a3eaa2c28
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index a6934c4..8e23208 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -116,6 +116,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
index 234c2fe..0d2810f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
@@ -50,6 +50,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfDesugaringInfo.java b/src/main/java/com/android/tools/r8/ir/desugar/CfDesugaringInfo.java
new file mode 100644
index 0000000..280b30b
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfDesugaringInfo.java
@@ -0,0 +1,10 @@
+// Copyright (c) 2023, 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.ir.desugar;
+
+public interface CfDesugaringInfo {
+
+  boolean canIncreaseBytecodeSize();
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
index 90eda8a..bcace75 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
@@ -63,6 +63,7 @@
       CfInstruction instruction,
       FreshLocalProvider freshLocalProvider,
       LocalStackAllocator localStackAllocator,
+      CfDesugaringInfo desugaringInfo,
       CfInstructionDesugaringEventConsumer eventConsumer,
       ProgramMethod context,
       MethodProcessingContext methodProcessingContext);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java
index ab7f14a..635f975 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java
@@ -35,6 +35,7 @@
   public Collection<CfInstruction> desugarInstruction(
       FreshLocalProvider freshLocalProvider,
       LocalStackAllocator localStackAllocator,
+      CfDesugaringInfo desugaringInfo,
       CfInstructionDesugaringEventConsumer eventConsumer,
       ProgramMethod context,
       MethodProcessingContext methodProcessingContext,
@@ -62,6 +63,7 @@
     Collection<CfInstruction> desugarInstruction(
         FreshLocalProvider freshLocalProvider,
         LocalStackAllocator localStackAllocator,
+        CfDesugaringInfo desugaringInfo,
         CfInstructionDesugaringEventConsumer eventConsumer,
         ProgramMethod context,
         MethodProcessingContext methodProcessingContext,
@@ -141,6 +143,7 @@
         public Collection<CfInstruction> desugarInstruction(
             FreshLocalProvider freshLocalProvider,
             LocalStackAllocator localStackAllocator,
+            CfDesugaringInfo desugaringInfo,
             CfInstructionDesugaringEventConsumer eventConsumer,
             ProgramMethod context,
             MethodProcessingContext methodProcessingContext,
@@ -151,6 +154,7 @@
               : desugarRewrite.desugarInstruction(
                   freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   context,
                   methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
index 64bc96e..b8a7565 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
@@ -55,6 +55,7 @@
       CfInstruction instruction,
       FreshLocalProvider freshLocalProvider,
       LocalStackAllocator localStackAllocator,
+      CfDesugaringInfo desugaringInfo,
       CfInstructionDesugaringEventConsumer eventConsumer,
       ProgramMethod context,
       MethodProcessingContext methodProcessingContext) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
index 79041fe..867a9c7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
@@ -43,6 +43,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index dc59f92..44f9afd 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -84,7 +84,8 @@
       LambdaInstructionDesugaring desugaring,
       ProgramMethod accessedFrom,
       LambdaDescriptor descriptor,
-      DesugarInvoke desugarInvoke) {
+      DesugarInvoke desugarInvoke,
+      boolean useFactoryMethodForConstruction) {
     assert desugaring != null;
     assert descriptor != null;
     this.type = builder.getType();
@@ -109,7 +110,8 @@
             ? factory.createField(type, type, factory.lambdaInstanceFieldName)
             : null;
     this.factoryMethod =
-        appView.options().testing.alwaysGenerateLambdaFactoryMethods
+        useFactoryMethodForConstruction
+                || appView.options().testing.alwaysGenerateLambdaFactoryMethods
             ? factory.createMethod(
                 type,
                 factory.createProto(type, descriptor.captures.values),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
index d16016a..3ae702e 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
@@ -230,6 +230,25 @@
     IntBox maxStackForCode = new IntBox(cfCode.getMaxStack());
     IntBox maxStackForInstruction = new IntBox(cfCode.getMaxStack());
 
+    class CfDesugaringInfoImpl implements CfDesugaringInfo {
+      int bytecodeSizeUpperBound;
+
+      private CfDesugaringInfoImpl(int bytecodeSizeUpperBound) {
+        this.bytecodeSizeUpperBound = bytecodeSizeUpperBound;
+      }
+
+      @Override
+      public boolean canIncreaseBytecodeSize() {
+        return bytecodeSizeUpperBound < 65000;
+      }
+
+      private void updateBytecodeSize(int delta) {
+        bytecodeSizeUpperBound += delta;
+      }
+    }
+
+    CfDesugaringInfoImpl desugaringInfo = new CfDesugaringInfoImpl(cfCode.bytecodeSizeUpperBound());
+
     List<CfInstruction> desugaredInstructions =
         ListUtils.flatMapSameType(
             cfCode.getInstructions(),
@@ -239,6 +258,7 @@
                       instruction,
                       maxLocalsForInstruction::getAndIncrement,
                       maxStackForInstruction::getAndIncrement,
+                      desugaringInfo,
                       eventConsumer,
                       method,
                       methodProcessingContext);
@@ -247,6 +267,10 @@
                 // and reset the next temporary locals register.
                 maxLocalsForCode.setMax(maxLocalsForInstruction.getAndSet(cfCode.getMaxLocals()));
                 maxStackForCode.setMax(maxStackForInstruction.getAndSet(cfCode.getMaxStack()));
+                // Record the change in bytecode size.
+                desugaringInfo.updateBytecodeSize(-instruction.bytecodeSizeUpperBound());
+                replacement.forEach(
+                    i -> desugaringInfo.updateBytecodeSize(i.bytecodeSizeUpperBound()));
               } else {
                 // The next temporary locals register should be unchanged.
                 assert maxLocalsForInstruction.get() == cfCode.getMaxLocals();
@@ -293,6 +317,7 @@
       CfInstruction instruction,
       FreshLocalProvider freshLocalProvider,
       LocalStackAllocator localStackAllocator,
+      CfDesugaringInfo desugaringInfo,
       CfInstructionDesugaringEventConsumer eventConsumer,
       ProgramMethod context,
       MethodProcessingContext methodProcessingContext) {
@@ -302,6 +327,7 @@
             instruction,
             freshLocalProvider,
             localStackAllocator,
+            desugaringInfo,
             eventConsumer,
             context,
             methodProcessingContext,
@@ -315,6 +341,7 @@
         instruction,
         freshLocalProvider,
         localStackAllocator,
+        desugaringInfo,
         eventConsumer,
         context,
         methodProcessingContext,
@@ -325,6 +352,7 @@
       CfInstruction instruction,
       FreshLocalProvider freshLocalProvider,
       LocalStackAllocator localStackAllocator,
+      CfDesugaringInfo desugaringInfo,
       CfInstructionDesugaringEventConsumer eventConsumer,
       ProgramMethod context,
       MethodProcessingContext methodProcessingContext,
@@ -337,6 +365,7 @@
               .desugarInstruction(
                   freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   context,
                   methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java b/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java
index 31c2f61..4a64cba 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java
@@ -167,6 +167,7 @@
           .setDesugarRewrite(
               (freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   context,
                   methodProcessingContext,
@@ -220,6 +221,7 @@
           .setDesugarRewrite(
               (freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   context,
                   methodProcessingContext,
@@ -269,6 +271,7 @@
           .setDesugarRewrite(
               (freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   context,
                   methodProcessingContext,
@@ -312,6 +315,7 @@
           .setDesugarRewrite(
               (freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   context,
                   methodProcessingContext,
@@ -356,6 +360,7 @@
           .setDesugarRewrite(
               (freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   context,
                   methodProcessingContext,
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 9085bd8..a1657bd 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
@@ -76,6 +76,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context1,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
index 5021e7b..d8796a6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
@@ -97,6 +97,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context1,
                 methodProcessingContext,
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 4c56b9b..0bb4dff 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
@@ -98,6 +98,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 theContext,
                 methodProcessingContext,
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 a602e52..5028df9 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
@@ -51,6 +51,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryLibRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryLibRewriter.java
index 2c039d1..7776a31 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryLibRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryLibRewriter.java
@@ -100,6 +100,7 @@
           .setDesugarRewrite(
               (freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   localContext,
                   methodProcessingContext,
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 85154ce..d83a724 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
@@ -109,6 +109,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -135,6 +136,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context1,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
index e7a534f..0d70826 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
@@ -72,6 +72,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -95,6 +96,7 @@
             .setDesugarRewrite(
                 (freshLocalProvider,
                     localStackAllocator,
+                    desugaringInfo,
                     eventConsumer,
                     context,
                     methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
index c946b68..092423e 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
@@ -70,6 +70,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -85,6 +86,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
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 4912fe6..275d2c2 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
@@ -433,6 +433,7 @@
           .setDesugarRewrite(
               (freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   context1,
                   methodProcessingContext,
@@ -482,6 +483,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context12,
                 methodProcessingContext,
@@ -528,6 +530,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context1,
                 methodProcessingContext,
@@ -576,6 +579,7 @@
           .setDesugarRewrite(
               (freshLocalProvider,
                   localStackAllocator,
+                  desugaringInfo,
                   eventConsumer,
                   context1,
                   methodProcessingContext,
@@ -616,6 +620,7 @@
             .setDesugarRewrite(
                 (freshLocalProvider,
                     localStackAllocator,
+                    desugaringInfo,
                     eventConsumer,
                     context12,
                     methodProcessingContext,
@@ -736,6 +741,7 @@
             .setDesugarRewrite(
                 (freshLocalProvider,
                     localStackAllocator,
+                    desugaringInfo,
                     eventConsumer,
                     context1,
                     methodProcessingContext,
@@ -759,6 +765,7 @@
             .setDesugarRewrite(
                 (freshLocalProvider,
                     localStackAllocator,
+                    desugaringInfo,
                     eventConsumer,
                     context12,
                     methodProcessingContext,
@@ -823,6 +830,7 @@
               .setDesugarRewrite(
                   (freshLocalProvider,
                       localStackAllocator,
+                      desugaringInfo,
                       eventConsumer,
                       context13,
                       methodProcessingContext,
@@ -850,6 +858,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context14,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
index aea4f4b..6eb429f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
@@ -22,6 +22,7 @@
 import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.ValueType;
+import com.android.tools.r8.ir.desugar.CfDesugaringInfo;
 import com.android.tools.r8.ir.desugar.CfInstructionDesugaring;
 import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.DesugarDescription;
@@ -79,6 +80,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -88,6 +90,7 @@
                     instruction.asInvokeDynamic(),
                     freshLocalProvider,
                     localStackAllocator,
+                    desugaringInfo,
                     eventConsumer,
                     context,
                     methodProcessingContext,
@@ -96,6 +99,7 @@
                             invoke,
                             localProvider,
                             stackAllocator,
+                            desugaringInfo,
                             eventConsumer,
                             context,
                             methodProcessingContext)))
@@ -113,12 +117,18 @@
       CfInvokeDynamic invoke,
       FreshLocalProvider freshLocalProvider,
       LocalStackAllocator localStackAllocator,
+      CfDesugaringInfo desugaringInfo,
       LambdaDesugaringEventConsumer eventConsumer,
       ProgramMethod context,
       MethodProcessingContext methodProcessingContext,
       DesugarInvoke desugarInvoke) {
     LambdaClass lambdaClass =
-        createLambdaClass(invoke, context, methodProcessingContext, desugarInvoke);
+        createLambdaClass(
+            invoke,
+            context,
+            methodProcessingContext,
+            desugarInvoke,
+            !desugaringInfo.canIncreaseBytecodeSize());
     if (lambdaClass == null) {
       return null;
     }
@@ -161,7 +171,8 @@
       CfInvokeDynamic invoke,
       ProgramMethod context,
       MethodProcessingContext methodProcessingContext,
-      DesugarInvoke desugarInvoke) {
+      DesugarInvoke desugarInvoke,
+      boolean useFactoryMethodForConstruction) {
     LambdaDescriptor descriptor =
         LambdaDescriptor.tryInfer(
             invoke.getCallSite(), appView, appView.appInfoForDesugaring(), context);
@@ -180,7 +191,13 @@
                 builder ->
                     box.set(
                         new LambdaClass(
-                            builder, appView, this, context, descriptor, desugarInvoke)));
+                            builder,
+                            appView,
+                            this,
+                            context,
+                            descriptor,
+                            desugarInvoke,
+                            useFactoryMethodForConstruction)));
     // Immediately set the actual program class on the lambda.
     LambdaClass lambdaClass = box.get();
     lambdaClass.setClass(clazz);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index 54f5677..6678a66 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -337,6 +337,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -367,6 +368,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
index 9bc7654..bdbd423 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
@@ -199,6 +199,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -218,6 +219,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
index 52ac56e..eda990b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
@@ -93,6 +93,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -128,6 +129,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
index 9127af6..a0ec6dd 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
@@ -70,6 +70,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -94,6 +95,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -115,6 +117,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
index bb81445..18ddcef 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
@@ -326,6 +326,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -352,6 +353,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -378,6 +380,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
@@ -405,6 +408,7 @@
         .setDesugarRewrite(
             (freshLocalProvider,
                 localStackAllocator,
+                desugaringInfo,
                 eventConsumer,
                 context,
                 methodProcessingContext,
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
index 181723e..40b7606 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
@@ -172,7 +172,9 @@
   @Override
   public void acceptLambdaClass(LambdaClass lambdaClass, ProgramMethod context) {
     addLambdaClassAndInstanceInitializersIfSynthesizingContextIsInProfile(lambdaClass, context);
+    addLambdaFactoryMethodIfSynthesizingContextIsInProfile(lambdaClass, context);
     addLambdaVirtualMethodsIfLambdaImplementationIsInProfile(lambdaClass, context);
+
     parent.acceptLambdaClass(lambdaClass, context);
   }
 
@@ -194,6 +196,16 @@
   }
 
   @SuppressWarnings("ReferenceEquality")
+  private void addLambdaFactoryMethodIfSynthesizingContextIsInProfile(
+      LambdaClass lambdaClass, ProgramMethod context) {
+    if (lambdaClass.hasFactoryMethod()) {
+      additionsCollection.applyIfContextIsInProfile(
+          context,
+          additionsBuilder -> additionsBuilder.addMethodRule(lambdaClass.getFactoryMethod()));
+    }
+  }
+
+  @SuppressWarnings("ReferenceEquality")
   private void addLambdaVirtualMethodsIfLambdaImplementationIsInProfile(
       LambdaClass lambdaClass, ProgramMethod context) {
     Target target = lambdaClass.getTarget();
diff --git a/src/test/java/com/android/tools/r8/desugar/lambdas/LambdasInHugeMethod.java b/src/test/java/com/android/tools/r8/desugar/lambdas/LambdasInHugeMethod.java
index 45f1165..c242996 100644
--- a/src/test/java/com/android/tools/r8/desugar/lambdas/LambdasInHugeMethod.java
+++ b/src/test/java/com/android/tools/r8/desugar/lambdas/LambdasInHugeMethod.java
@@ -3,10 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.desugar.lambdas;
 
-import static org.junit.Assert.assertThrows;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.DesugarTestConfiguration;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -63,44 +59,7 @@
 
   @Test
   public void testDesugaring() throws Exception {
-    // Cf to cf desugaring fails generating too large method in class file.
-    if (parameters.isCfRuntime()) {
-      assertThrows(
-          CompilationFailedException.class,
-          () ->
-              testForDesugaring(
-                      parameters,
-                      (options) -> {
-                        /* no options change */
-                      },
-                      configuration -> configuration == DesugarTestConfiguration.D8_CF)
-                  .addProgramClasses(MyConsumer.class, MyTriConsumer.class)
-                  .addProgramClassFileData(generateTestClass())
-                  .run(parameters.getRuntime(), TestClass.class));
-    } else {
-      assertThrows(
-          CompilationFailedException.class,
-          () ->
-              testForDesugaring(
-                      parameters,
-                      (options) -> {
-                        /* no options change */
-                      },
-                      configuration -> configuration == DesugarTestConfiguration.D8_CF_D8_DEX)
-                  .addProgramClasses(MyConsumer.class, MyTriConsumer.class)
-                  .addProgramClassFileData(generateTestClass())
-                  .run(parameters.getRuntime(), TestClass.class));
-    }
-
-    // Desugaring directly to DEX works with large methods.
-    testForDesugaring(
-            parameters,
-            (options) -> {
-              /* no options change */
-            },
-            configuration ->
-                configuration != DesugarTestConfiguration.D8_CF
-                    && configuration != DesugarTestConfiguration.D8_CF_D8_DEX)
+    testForDesugaring(parameters)
         .addProgramClasses(MyConsumer.class, MyTriConsumer.class)
         .addProgramClassFileData(generateTestClass())
         .run(parameters.getRuntime(), TestClass.class)
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index b475941..931fe23 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -150,12 +150,6 @@
 def setUpFakeAndroidHome(androidHomeTemp):
   # Bazel will check if 30 is present then extract android.jar from 32.
   # We copy android.jar from third_party to mimic repository structure.
-  subpath = os.path.join(androidHomeTemp, "build-tools")
-  cmd = ["mkdir", subpath]
-  subprocess.check_call(cmd)
-  subpath = os.path.join(subpath, "32.0.0")
-  cmd = ["mkdir", subpath]
-  subprocess.check_call(cmd)
   subpath = os.path.join(androidHomeTemp, "platforms")
   cmd = ["mkdir", subpath]
   subprocess.check_call(cmd)