Fix inadequate lens rewriting and dynamic type join
Change-Id: Icddf65cd55a9bb91ea6a571c53cc335dd8a1a967
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicTypeWithUpperBound.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicTypeWithUpperBound.java
index 57af3a5..fa985fa 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicTypeWithUpperBound.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DynamicTypeWithUpperBound.java
@@ -38,15 +38,10 @@
public static DynamicTypeWithUpperBound create(
AppView<AppInfoWithLiveness> appView, TypeElement dynamicUpperBoundType) {
- ClassTypeElement dynamicLowerBoundType = null;
- if (dynamicUpperBoundType.isClassType()) {
- ClassTypeElement dynamicUpperBoundClassType = dynamicUpperBoundType.asClassType();
- DexClass dynamicUpperBoundClass =
- appView.definitionFor(dynamicUpperBoundClassType.getClassType());
- if (dynamicUpperBoundClass != null && dynamicUpperBoundClass.isEffectivelyFinal(appView)) {
- dynamicLowerBoundType = dynamicUpperBoundClassType;
- }
- }
+ ClassTypeElement dynamicLowerBoundType =
+ isEffectivelyFinal(appView, dynamicUpperBoundType)
+ ? dynamicUpperBoundType.asClassType()
+ : null;
return create(appView, dynamicUpperBoundType, dynamicLowerBoundType);
}
@@ -86,6 +81,15 @@
return create(appView, dynamicUpperBoundType, dynamicLowerBoundType);
}
+ private static boolean isEffectivelyFinal(AppView<?> appView, TypeElement type) {
+ if (type.isClassType()) {
+ ClassTypeElement classType = type.asClassType();
+ DexClass clazz = appView.definitionFor(classType.getClassType());
+ return clazz != null && clazz.isEffectivelyFinal(appView);
+ }
+ return false;
+ }
+
@Override
public boolean hasDynamicUpperBoundType() {
return true;
@@ -157,7 +161,10 @@
AppView<AppInfoWithLiveness> appView, DynamicTypeWithUpperBound dynamicType) {
TypeElement upperBoundType =
getDynamicUpperBoundType().join(dynamicType.getDynamicUpperBoundType(), appView);
- ClassTypeElement lowerBoundType = meetDynamicLowerBound(appView, dynamicType);
+ ClassTypeElement lowerBoundType =
+ isEffectivelyFinal(appView, upperBoundType)
+ ? upperBoundType.asClassType()
+ : meetDynamicLowerBound(appView, dynamicType);
if (upperBoundType.equals(getDynamicUpperBoundType())
&& Objects.equals(lowerBoundType, getDynamicLowerBoundType())) {
return this;
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
index e65e4b8..897aaa8 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
@@ -15,6 +15,7 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.MethodCollection;
+import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.graph.RewrittenPrototypeDescription;
import com.android.tools.r8.graph.TreeFixerBase;
import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfoFixer;
@@ -100,6 +101,7 @@
}
private void fixupOptimizationInfos(ExecutorService executorService) throws ExecutionException {
+ PrunedItems prunedItems = PrunedItems.empty(appView.app());
getSimpleFeedback()
.fixupOptimizationInfos(
appView,
@@ -116,7 +118,9 @@
DexEncodedMethod method, MutableMethodOptimizationInfo optimizationInfo) {
// Fixup the return value in case the method returns a field that had its signature
// changed.
- optimizationInfo.fixupAbstractReturnValue(appView, graphLens);
+ optimizationInfo
+ .fixupAbstractReturnValue(appView, graphLens)
+ .fixupInstanceInitializerInfo(appView, graphLens, prunedItems);
// Rewrite the optimization info to account for method signature changes.
if (graphLens.hasPrototypeChanges(method.getReference())) {