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());
- }
}