Eagerly process enum unboxing utility methods for inlining

Fixes: 192426913
Change-Id: I0077fb7333d81889162dbf9d041de2baa00456ce
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
index a0d2505..eb6014b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -94,7 +94,6 @@
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedback.OptimizationInfoFixer;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.shaking.FieldAccessInfoCollectionModifier;
 import com.android.tools.r8.shaking.KeepInfoCollection;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
@@ -525,23 +524,12 @@
     enumUnboxingCandidatesInfo.clear();
     // Update keep info on any of the enum methods of the removed classes.
     updateKeepInfo(enumsToUnbox);
-    FieldAccessInfoCollectionModifier.Builder fieldAccessInfoCollectionModifierBuilder =
-        FieldAccessInfoCollectionModifier.builder();
 
     EnumUnboxingUtilityClasses utilityClasses =
         EnumUnboxingUtilityClasses.builder(appView)
-            .synthesizeEnumUnboxingUtilityClasses(
-                enumClassesToUnbox,
-                enumDataMap,
-                fieldAccessInfoCollectionModifierBuilder)
-            .build();
-    utilityClasses.forEach(
-        utilityClass -> {
-          utilityClass.ensureMethods(appView);
-          utilityClass.getDefinition().forEachProgramMethod(postBuilder::add);
-        });
+            .synthesizeEnumUnboxingUtilityClasses(enumClassesToUnbox, enumDataMap)
+            .build(converter, executorService);
 
-    fieldAccessInfoCollectionModifierBuilder.build().modify(appView);
     EnumUnboxingTreeFixer.Result treeFixerResult =
         new EnumUnboxingTreeFixer(
                 appView, checkNotNullMethods, enumDataMap, enumClassesToUnbox, utilityClasses)
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingUtilityClasses.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingUtilityClasses.java
index 3e19b10..8dd1398 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingUtilityClasses.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingUtilityClasses.java
@@ -8,12 +8,17 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.conversion.IRConverter;
+import com.android.tools.r8.ir.conversion.OneTimeMethodProcessor;
 import com.android.tools.r8.ir.optimize.enums.EnumDataMap.EnumData;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.FieldAccessInfoCollectionModifier;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.google.common.collect.ImmutableMap;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
 import java.util.function.Consumer;
 
 public class EnumUnboxingUtilityClasses {
@@ -61,14 +66,15 @@
     private ImmutableMap<DexType, LocalEnumUnboxingUtilityClass> localUtilityClasses;
     private SharedEnumUnboxingUtilityClass sharedUtilityClass;
 
+    private final FieldAccessInfoCollectionModifier.Builder
+        fieldAccessInfoCollectionModifierBuilder = FieldAccessInfoCollectionModifier.builder();
+
     public Builder(AppView<AppInfoWithLiveness> appView) {
       this.appView = appView;
     }
 
     public Builder synthesizeEnumUnboxingUtilityClasses(
-        Set<DexProgramClass> enumsToUnbox,
-        EnumDataMap enumDataMap,
-        FieldAccessInfoCollectionModifier.Builder fieldAccessInfoCollectionModifierBuilder) {
+        Set<DexProgramClass> enumsToUnbox, EnumDataMap enumDataMap) {
       SharedEnumUnboxingUtilityClass sharedUtilityClass =
           SharedEnumUnboxingUtilityClass.builder(
                   appView, enumDataMap, enumsToUnbox, fieldAccessInfoCollectionModifierBuilder)
@@ -80,8 +86,32 @@
       return this;
     }
 
-    public EnumUnboxingUtilityClasses build() {
-      return new EnumUnboxingUtilityClasses(sharedUtilityClass, localUtilityClasses);
+    public EnumUnboxingUtilityClasses build(IRConverter converter, ExecutorService executorService)
+        throws ExecutionException {
+      EnumUnboxingUtilityClasses utilityClasses =
+          new EnumUnboxingUtilityClasses(sharedUtilityClass, localUtilityClasses);
+
+      // Extend the field access info collection with information about synthesized fields.
+      fieldAccessInfoCollectionModifierBuilder.build().modify(appView);
+
+      // Create and process the utility methods.
+      OneTimeMethodProcessor.Builder methodProcessorBuilder =
+          OneTimeMethodProcessor.builder(appView.createProcessorContext());
+      utilityClasses.forEach(
+          utilityClass -> {
+            utilityClass.ensureMethods(appView);
+            utilityClass.getDefinition().forEachProgramMethod(methodProcessorBuilder::add);
+          });
+      OneTimeMethodProcessor methodProcessor = methodProcessorBuilder.build();
+      methodProcessor.forEachWaveWithExtension(
+          (method, methodProcessingContext) ->
+              converter.processDesugaredMethod(
+                  method,
+                  OptimizationFeedbackSimple.getInstance(),
+                  methodProcessor,
+                  methodProcessingContext),
+          executorService);
+      return utilityClasses;
     }
 
     private ImmutableMap<DexType, LocalEnumUnboxingUtilityClass> createLocalUtilityClasses(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 006b46e..fd13bbf 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -366,17 +366,11 @@
       InstructionSubject instruction = iterator.next();
       if (instruction.isInstanceGet()) {
         ++instanceGetCount;
-      } else if (instruction.isInvoke() && !isEnumInvoke(instruction)) {
+      } else if (instruction.isInvoke()) {
         ++invokeCount;
       }
     }
     assertEquals(1, instanceGetCount);
     assertEquals(0, invokeCount);
   }
-
-  // TODO(b/192426913): This is only required due to inadequate inlining.
-  private boolean isEnumInvoke(InstructionSubject instruction) {
-    return SyntheticItemsTestUtils.isEnumUnboxingSharedUtilityClass(
-        instruction.getMethod().getHolderType().asClassReference());
-  }
 }