Post-optimize methods with dead field references
Change-Id: I38e86858e4be88993ae5f3035833621771bed41f
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index af1d2e9..c8baebd 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -691,6 +691,14 @@
}
}
+ {
+ MainDexClasses finalMainDexClasses = mainDexClasses;
+ appView.withGeneratedExtensionRegistryShrinker(
+ shrinker ->
+ shrinker.postOptimizeGeneratedExtensionRegistry(
+ new IRConverter(appView, timing, null, finalMainDexClasses)));
+ }
+
// Add automatic main dex classes to an eventual manual list of classes.
if (!options.mainDexKeepRules.isEmpty()) {
application = application.builder().addToMainDexList(mainDexClasses.getClasses()).build();
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
index e30bf58..cb915b2 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.analysis.proto;
+import static com.google.common.base.Predicates.alwaysFalse;
+
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedField;
@@ -11,12 +13,17 @@
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.DexProgramClass;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldAccessInfo;
import com.android.tools.r8.graph.FieldAccessInfoCollection;
import com.android.tools.r8.graph.FieldAccessInfoImpl;
+import com.android.tools.r8.ir.conversion.CallSiteInformation;
+import com.android.tools.r8.ir.conversion.IRConverter;
+import com.android.tools.r8.ir.conversion.OptimizationFeedbackIgnore;
+import com.android.tools.r8.ir.optimize.Outliner;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.function.Consumer;
@@ -54,6 +61,7 @@
static class ProtoReferences {
+ public final DexType extensionRegistryLiteType;
public final DexType generatedExtensionType;
public final DexType generatedMessageLiteType;
public final DexType messageLiteType;
@@ -64,6 +72,8 @@
public final DexProto findLiteExtensionByNumberProto;
private ProtoReferences(DexItemFactory factory) {
+ extensionRegistryLiteType =
+ factory.createType(factory.createString("Lcom/google/protobuf/ExtensionRegistryLite;"));
generatedExtensionType =
factory.createType(
factory.createString(
@@ -114,6 +124,31 @@
});
}
+ public void postOptimizeGeneratedExtensionRegistry(IRConverter converter) {
+ forEachFindLiteExtensionByNumberMethod(
+ method ->
+ converter.processMethod(
+ method,
+ OptimizationFeedbackIgnore.getInstance(),
+ alwaysFalse(),
+ CallSiteInformation.empty(),
+ Outliner::noProcessing));
+ }
+
+ private void forEachFindLiteExtensionByNumberMethod(Consumer<DexEncodedMethod> consumer) {
+ for (DexProgramClass clazz : appView.appInfo().classes()) {
+ if (clazz.superType != references.extensionRegistryLiteType) {
+ continue;
+ }
+
+ for (DexEncodedMethod method : clazz.methods()) {
+ if (references.isFindLiteExtensionByNumberMethod(method.method)) {
+ consumer.accept(method);
+ }
+ }
+ }
+ }
+
public boolean isDeadProtoExtensionField(DexField field) {
return isDeadProtoExtensionField(field, appView.appInfo().getFieldAccessInfoCollection());
}