Disable passthrough of DefaultInstanceInitializerCode for inlining
Change-Id: Iee38e16dd2597775ef8e4c07485d18e12c568561
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
index 66df280..b0e0aba 100644
--- a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
@@ -236,7 +236,8 @@
return getMaxLocals(method);
}
- static DexMethod getParentConstructor(DexClassAndMethod method, DexItemFactory dexItemFactory) {
+ public static DexMethod getParentConstructor(
+ DexClassAndMethod method, DexItemFactory dexItemFactory) {
return dexItemFactory.createInstanceInitializer(method.getHolder().getSuperType());
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 7b531fb..f695327 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -8,6 +8,8 @@
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.Code;
+import com.android.tools.r8.graph.DefaultInstanceInitializerCode;
+import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
@@ -948,7 +950,19 @@
}
Code code = method.getDefinition().getCode();
assert !code.isThrowNullCode();
- return code.isDefaultInstanceInitializerCode();
+ if (code.isDefaultInstanceInitializerCode()) {
+ // Passthrough unless the parent constructor may be inlineable.
+ if (options.canInitNewInstanceUsingSuperclassConstructor()) {
+ DexMethod parentConstructorReference =
+ DefaultInstanceInitializerCode.getParentConstructor(method, appView.dexItemFactory());
+ DexClassAndMethod parentConstructor = appView.definitionFor(parentConstructorReference);
+ if (parentConstructor != null && parentConstructor.isProgramMethod()) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
}
// Compute optimization info summary for the current method unless it is pinned