Minor cleanup of optimization info rewrite

Change-Id: Idbda66117a4887d5315a9f990083cfdac28f5db9
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
index f33a1d4..caca28e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
@@ -134,10 +134,10 @@
 
   @Override
   public ArrayTypeElement fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, Function<DexType, DexType> mapping) {
     if (memberTypeLattice.isReferenceType()) {
       TypeElement substitutedMemberType =
-          memberTypeLattice.fixupClassTypeReferences(mapping, appView);
+          memberTypeLattice.fixupClassTypeReferences(appView, mapping);
       if (substitutedMemberType != memberTypeLattice) {
         return ArrayTypeElement.create(substitutedMemberType, nullability);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
index 144f465..e1a924c 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
@@ -156,7 +156,7 @@
 
   @Override
   public TypeElement fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, Function<DexType, DexType> mapping) {
     DexType mappedType = mapping.apply(type);
     if (mappedType.isPrimitiveType()) {
       return PrimitiveTypeElement.fromDexType(mappedType, false);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
index a89c486..88d8b66 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
@@ -85,7 +85,7 @@
               || operandType.isPrimitiveType()
               || operandType.isNullType()
               || (operandType.isReferenceType()
-                  && operandType.fixupClassTypeReferences(mapping, appView) == operandType);
+                  && operandType.fixupClassTypeReferences(appView, mapping) == operandType);
         }
       }
     }
@@ -98,7 +98,7 @@
       BasicBlock block = blocks.next();
       for (Phi phi : block.getPhis()) {
         TypeElement phiType = phi.getType();
-        TypeElement substituted = phiType.fixupClassTypeReferences(mapping, appView);
+        TypeElement substituted = phiType.fixupClassTypeReferences(appView, mapping);
         assert substituted == phiType || affectedPhis.contains(phi);
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
index 9736b13..ecc466a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.ir.code.Value;
 import java.util.function.Function;
 
@@ -68,10 +69,15 @@
   }
 
   public TypeElement fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, Function<DexType, DexType> mapping) {
     return this;
   }
 
+  public final TypeElement rewrittenWithLens(
+      AppView<? extends AppInfoWithClassHierarchy> appView, GraphLens graphLens) {
+    return fixupClassTypeReferences(appView, graphLens::lookupType);
+  }
+
   public boolean isNullable() {
     return nullability().isNullable();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 66e7ff7..b02d5e7 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -122,8 +122,7 @@
   private Value makeOutValue(Instruction insn, IRCode code) {
     if (insn.outValue() != null) {
       TypeElement oldType = insn.getOutType();
-      TypeElement newType =
-          oldType.fixupClassTypeReferences(appView.graphLens()::lookupType, appView);
+      TypeElement newType = oldType.rewrittenWithLens(appView, appView.graphLens());
       return code.createValue(newType, insn.getLocalInfo());
     }
     return null;
@@ -622,8 +621,7 @@
               Assume assume = current.asAssume();
               if (assume.hasOutValue()) {
                 TypeElement type = assume.getOutType();
-                TypeElement substituted =
-                    type.fixupClassTypeReferences(graphLens::lookupType, appView);
+                TypeElement substituted = type.rewrittenWithLens(appView, graphLens);
                 if (substituted != type) {
                   assert type.isArrayType() || type.isClassType();
                   if (substituted.isPrimitiveType()) {
@@ -659,8 +657,7 @@
             if (current.hasOutValue()) {
               // For all other instructions, substitute any changed type.
               TypeElement type = current.getOutType();
-              TypeElement substituted =
-                  type.fixupClassTypeReferences(graphLens::lookupType, appView);
+              TypeElement substituted = type.rewrittenWithLens(appView, graphLens);
               if (substituted != type) {
                 current.outValue().setType(substituted);
                 affectedPhis.addAll(current.outValue().uniquePhiUsers());
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 5afd25d..b637199 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
@@ -77,8 +77,7 @@
 import com.android.tools.r8.ir.optimize.enums.EnumInstanceFieldData.EnumInstanceFieldOrdinalData;
 import com.android.tools.r8.ir.optimize.enums.EnumInstanceFieldData.EnumInstanceFieldUnknownData;
 import com.android.tools.r8.ir.optimize.enums.eligibility.Reason;
-import com.android.tools.r8.ir.optimize.info.FieldOptimizationInfo;
-import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.MutableFieldOptimizationInfo;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedback.OptimizationInfoFixer;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
 import com.android.tools.r8.ir.optimize.info.UpdatableMethodOptimizationInfo;
@@ -469,31 +468,20 @@
         executorService,
         new OptimizationInfoFixer() {
           @Override
-          public void fixup(DexEncodedField field) {
-            FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
-            if (optimizationInfo.isMutableFieldOptimizationInfo()) {
-              optimizationInfo
-                  .asMutableFieldOptimizationInfo()
-                  .fixupClassTypeReferences(appView.graphLens()::lookupType, appView)
-                  .fixupAbstractValue(appView, appView.graphLens());
-            } else {
-              assert optimizationInfo.isDefaultFieldOptimizationInfo();
-            }
+          public void fixup(DexEncodedField field, MutableFieldOptimizationInfo optimizationInfo) {
+            optimizationInfo
+                .asMutableFieldOptimizationInfo()
+                .fixupClassTypeReferences(appView, appView.graphLens())
+                .fixupAbstractValue(appView, appView.graphLens());
           }
 
           @Override
-          public void fixup(DexEncodedMethod method) {
-            MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
-            if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
-              UpdatableMethodOptimizationInfo updatableOptimizationInfo =
-                  optimizationInfo.asUpdatableMethodOptimizationInfo();
-              updatableOptimizationInfo
-                  .fixupClassTypeReferences(appView.graphLens()::lookupType, appView)
-                  .fixupAbstractReturnValue(appView, appView.graphLens())
-                  .fixupInstanceInitializerInfo(appView, appView.graphLens());
-            } else {
-              assert optimizationInfo.isDefaultMethodOptimizationInfo();
-            }
+          public void fixup(
+              DexEncodedMethod method, UpdatableMethodOptimizationInfo optimizationInfo) {
+            optimizationInfo
+                .fixupClassTypeReferences(appView, appView.graphLens())
+                .fixupAbstractReturnValue(appView, appView.graphLens())
+                .fixupInstanceInitializerInfo(appView, appView.graphLens());
           }
         });
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
index 41ee658..b2f291a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
@@ -6,14 +6,12 @@
 
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.analysis.value.AbstractValue;
 import com.android.tools.r8.ir.analysis.value.UnknownValue;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import java.util.function.Function;
 
 /**
  * Optimization info for fields.
@@ -35,13 +33,13 @@
   private TypeElement dynamicUpperBoundType = null;
 
   public MutableFieldOptimizationInfo fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, GraphLens lens) {
     if (dynamicUpperBoundType != null) {
-      dynamicUpperBoundType = dynamicUpperBoundType.fixupClassTypeReferences(mapping, appView);
+      dynamicUpperBoundType = dynamicUpperBoundType.rewrittenWithLens(appView, lens);
     }
     if (dynamicLowerBoundType != null) {
       TypeElement dynamicLowerBoundType =
-          this.dynamicLowerBoundType.fixupClassTypeReferences(mapping, appView);
+          this.dynamicLowerBoundType.rewrittenWithLens(appView, lens);
       if (dynamicLowerBoundType.isClassType()) {
         this.dynamicLowerBoundType = dynamicLowerBoundType.asClassType();
       } else {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
index 46cff7b..256f80a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
@@ -20,9 +20,9 @@
 
   public interface OptimizationInfoFixer {
 
-    void fixup(DexEncodedField field);
+    void fixup(DexEncodedField field, MutableFieldOptimizationInfo optimizationInfo);
 
-    void fixup(DexEncodedMethod method);
+    void fixup(DexEncodedMethod method, UpdatableMethodOptimizationInfo optimizationInfo);
   }
 
   public void fixupOptimizationInfos(
@@ -31,8 +31,22 @@
     ThreadUtils.processItems(
         appView.appInfo().classes(),
         clazz -> {
-          clazz.fields().forEach(fixer::fixup);
-          clazz.methods().forEach(fixer::fixup);
+          for (DexEncodedField field : clazz.fields()) {
+            FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
+            if (optimizationInfo.isMutableFieldOptimizationInfo()) {
+              fixer.fixup(field, optimizationInfo.asMutableFieldOptimizationInfo());
+            } else {
+              assert optimizationInfo.isDefaultFieldOptimizationInfo();
+            }
+          }
+          for (DexEncodedMethod method : clazz.methods()) {
+            MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
+            if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
+              fixer.fixup(method, optimizationInfo.asUpdatableMethodOptimizationInfo());
+            } else {
+              assert optimizationInfo.isDefaultMethodOptimizationInfo();
+            }
+          }
         },
         executorService);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
index d6bdd6b..e33f49c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
@@ -23,7 +23,6 @@
 import com.android.tools.r8.utils.BooleanUtils;
 import java.util.BitSet;
 import java.util.Set;
-import java.util.function.Function;
 
 public class UpdatableMethodOptimizationInfo extends MethodOptimizationInfo {
 
@@ -147,14 +146,14 @@
   }
 
   public UpdatableMethodOptimizationInfo fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, GraphLens lens) {
     if (returnsObjectWithUpperBoundType != null) {
       returnsObjectWithUpperBoundType =
-          returnsObjectWithUpperBoundType.fixupClassTypeReferences(mapping, appView);
+          returnsObjectWithUpperBoundType.rewrittenWithLens(appView, lens);
     }
     if (returnsObjectWithLowerBoundType != null) {
       TypeElement returnsObjectWithLowerBoundType =
-          this.returnsObjectWithLowerBoundType.fixupClassTypeReferences(mapping, appView);
+          this.returnsObjectWithLowerBoundType.rewrittenWithLens(appView, lens);
       if (returnsObjectWithLowerBoundType.isClassType()) {
         this.returnsObjectWithLowerBoundType = returnsObjectWithLowerBoundType.asClassType();
       } else {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
index 262671f..708c84a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
@@ -62,12 +62,9 @@
     }
     return new InstanceFieldTypeInitializationInfo(
         dynamicLowerBoundType != null
-            ? dynamicLowerBoundType
-                .fixupClassTypeReferences(lens::lookupType, appView.withClassHierarchy())
-                .asClassType()
+            ? dynamicLowerBoundType.rewrittenWithLens(appView, lens).asClassType()
             : null,
-        dynamicUpperBoundType.fixupClassTypeReferences(
-            lens::lookupType, appView.withClassHierarchy()));
+        dynamicUpperBoundType.rewrittenWithLens(appView, lens));
   }
 
   @Override