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())) {