Avoid applying the graph lens more than once to the post method processor

This reenables enum unboxing.

Change-Id: Id5e621dbda46d9b946e13149b389bf0d721804c0
diff --git a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
index 158bf1f..7e46aad 100644
--- a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
@@ -101,8 +101,10 @@
   }
 
   @Override
-  public DexMethod getRenamedMethodSignature(DexMethod originalMethod) {
-    return originalMethodSignatures.inverse().getOrDefault(originalMethod, originalMethod);
+  public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) {
+    return this != applied
+        ? originalMethodSignatures.inverse().getOrDefault(originalMethod, originalMethod)
+        : originalMethod;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLense.java b/src/main/java/com/android/tools/r8/graph/GraphLense.java
index 2a5f317..ea55ec4 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLense.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLense.java
@@ -140,12 +140,23 @@
 
   public abstract DexField getRenamedFieldSignature(DexField originalField);
 
-  public abstract DexMethod getRenamedMethodSignature(DexMethod originalMethod);
+  public final DexMethod getRenamedMethodSignature(DexMethod originalMethod) {
+    return getRenamedMethodSignature(originalMethod, null);
+  }
+
+  public abstract DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied);
 
   public DexEncodedMethod mapDexEncodedMethod(
       DexEncodedMethod originalEncodedMethod, DexDefinitionSupplier definitions) {
+    return mapDexEncodedMethod(originalEncodedMethod, definitions, null);
+  }
+
+  public DexEncodedMethod mapDexEncodedMethod(
+      DexEncodedMethod originalEncodedMethod,
+      DexDefinitionSupplier definitions,
+      GraphLense applied) {
     assert originalEncodedMethod != DexEncodedMethod.SENTINEL;
-    DexMethod newMethod = getRenamedMethodSignature(originalEncodedMethod.method);
+    DexMethod newMethod = getRenamedMethodSignature(originalEncodedMethod.method, applied);
     // Note that:
     // * Even if `newMethod` is the same as `originalEncodedMethod.method`, we still need to look it
     //   up, since `originalEncodedMethod` may be obsolete.
@@ -445,7 +456,7 @@
     }
 
     @Override
-    public DexMethod getRenamedMethodSignature(DexMethod originalMethod) {
+    public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) {
       return originalMethod;
     }
 
@@ -511,8 +522,10 @@
     }
 
     @Override
-    public DexMethod getRenamedMethodSignature(DexMethod originalMethod) {
-      return previous.getRenamedMethodSignature(originalMethod);
+    public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) {
+      return this != applied
+          ? previous.getRenamedMethodSignature(originalMethod, applied)
+          : originalMethod;
     }
 
     @Override
@@ -611,8 +624,11 @@
     }
 
     @Override
-    public DexMethod getRenamedMethodSignature(DexMethod originalMethod) {
-      DexMethod renamedMethod = previousLense.getRenamedMethodSignature(originalMethod);
+    public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) {
+      if (this == applied) {
+        return originalMethod;
+      }
+      DexMethod renamedMethod = previousLense.getRenamedMethodSignature(originalMethod, applied);
       return originalMethodSignatures != null
           ? originalMethodSignatures.inverse().getOrDefault(renamedMethod, renamedMethod)
           : renamedMethod;
diff --git a/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java b/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java
index 5a5db62..c7edad2 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java
@@ -8,6 +8,7 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -121,6 +122,23 @@
     return null;
   }
 
+  @Override
+  void removeMethods(Set<DexEncodedMethod> methods) {
+    directMethods = removeMethodsHelper(methods, directMethods);
+    virtualMethods = removeMethodsHelper(methods, virtualMethods);
+  }
+
+  private static DexEncodedMethod[] removeMethodsHelper(
+      Set<DexEncodedMethod> methodsToRemove, DexEncodedMethod[] existingMethods) {
+    List<DexEncodedMethod> newMethods = new ArrayList<>(existingMethods.length);
+    for (DexEncodedMethod method : existingMethods) {
+      if (!methodsToRemove.contains(method)) {
+        newMethods.add(method);
+      }
+    }
+    return newMethods.toArray(DexEncodedMethod.EMPTY_ARRAY);
+  }
+
   private DexEncodedMethod removeMethodWithIndex(
       int index, DexEncodedMethod[] methods, Consumer<DexEncodedMethod[]> newMethodsConsumer) {
     DexEncodedMethod removed = methods[index];
diff --git a/src/main/java/com/android/tools/r8/graph/MethodCollection.java b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
index 14655d5..c93d366 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
@@ -259,6 +259,12 @@
     return removed;
   }
 
+  public void removeMethods(Set<DexEncodedMethod> methods) {
+    backing.removeMethods(methods);
+    resetDirectMethodCaches();
+    resetVirtualMethodCaches();
+  }
+
   public void setDirectMethods(DexEncodedMethod[] methods) {
     assert verifyCorrectnessOfMethodHolders(methods);
     resetDirectMethodCaches();
diff --git a/src/main/java/com/android/tools/r8/graph/MethodCollectionBacking.java b/src/main/java/com/android/tools/r8/graph/MethodCollectionBacking.java
index 2ce0cd8..0b3f435 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodCollectionBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodCollectionBacking.java
@@ -96,6 +96,8 @@
 
   abstract DexEncodedMethod removeMethod(DexMethod method);
 
+  abstract void removeMethods(Set<DexEncodedMethod> method);
+
   // Replacement/mutation methods.
 
   abstract void setDirectMethods(DexEncodedMethod[] methods);
diff --git a/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java b/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
index 18257c1..19c3cec 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
@@ -207,6 +207,11 @@
   }
 
   @Override
+  void removeMethods(Set<DexEncodedMethod> methods) {
+    methods.forEach(method -> methodMap.remove(wrap(method.getReference())));
+  }
+
+  @Override
   void setDirectMethods(DexEncodedMethod[] methods) {
     if ((methods == null || methods.length == 0) && methodMap.isEmpty()) {
       return;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
index c535709..fbeff68 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.GraphLense;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.conversion.MethodProcessingId.Factory.ReservedMethodProcessingIds;
@@ -60,8 +61,8 @@
   public static class Builder {
 
     private final Collection<CodeOptimization> defaultCodeOptimizations;
-    private final LongLivedProgramMethodSetBuilder methodsMap =
-        new LongLivedProgramMethodSetBuilder();
+    private final LongLivedProgramMethodSetBuilder<?> methodsToReprocess =
+        LongLivedProgramMethodSetBuilder.create();
     private final Map<DexEncodedMethod, Collection<CodeOptimization>> optimizationsMap =
         new IdentityHashMap<>();
 
@@ -76,7 +77,7 @@
         return;
       }
       for (ProgramMethod method : methodsToRevisit) {
-        methodsMap.add(method);
+        methodsToReprocess.add(method);
         optimizationsMap
             .computeIfAbsent(
                 method.getDefinition(),
@@ -102,13 +103,15 @@
     // Some optimizations may change methods, creating new instances of the encoded methods with a
     // new signature. The compiler needs to update the set of methods that must be reprocessed
     // according to the graph lens.
-    public void mapDexEncodedMethods(AppView<?> appView) {
+    public void rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense applied) {
+      methodsToReprocess.rewrittenWithLens(appView, applied);
       Map<DexEncodedMethod, Collection<CodeOptimization>> newOptimizationsMap =
           new IdentityHashMap<>();
       optimizationsMap.forEach(
           (method, optimizations) ->
               newOptimizationsMap.put(
-                  appView.graphLense().mapDexEncodedMethod(method, appView), optimizations));
+                  appView.graphLense().mapDexEncodedMethod(method, appView, applied),
+                  optimizations));
       optimizationsMap.clear();
       optimizationsMap.putAll(newOptimizationsMap);
     }
@@ -132,16 +135,14 @@
                 });
         put(set);
       }
-      if (methodsMap.isEmpty()) {
+      if (methodsToReprocess.isEmpty()) {
         // Nothing to revisit.
         return null;
       }
-      ProgramMethodSet methodsToReprocess =
-          appView.options().enableEnumUnboxing
-              ? methodsMap.build(appView)
-              : methodsMap.buildRaw(appView);
       CallGraph callGraph =
-          new PartialCallGraphBuilder(appView, methodsToReprocess).build(executorService, timing);
+          new PartialCallGraphBuilder(
+                  appView, methodsToReprocess.build(appView, appView.graphLense()))
+              .build(executorService, timing);
       return new PostMethodProcessor(appView, optimizationsMap, callGraph);
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
index 5c4197c..0ac7f7b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
@@ -114,8 +114,8 @@
   /** Result of first step (see {@link Outliner#createOutlineMethodIdentifierGenerator()}. */
   private final List<Multiset<Wrapper<ProgramMethod>>> candidateMethodLists = new ArrayList<>();
   /** Result of second step (see {@link Outliner#selectMethodsForOutlining()}. */
-  private final LongLivedProgramMethodSetBuilder methodsSelectedForOutlining =
-      new LongLivedProgramMethodSetBuilder();
+  private final LongLivedProgramMethodSetBuilder<?> methodsSelectedForOutlining =
+      LongLivedProgramMethodSetBuilder.create();
   /** Result of second step (see {@link Outliner#selectMethodsForOutlining()}. */
   private final Map<Outline, List<ProgramMethod>> outlineSites = new HashMap<>();
   /** Result of third step (see {@link Outliner#buildOutlinerClass(DexType)}. */
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 d35364d..c179446 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
@@ -328,47 +328,44 @@
     enumUnboxerRewriter = new EnumUnboxingRewriter(appView, enumsToUnbox);
     NestedGraphLense enumUnboxingLens = new TreeFixer(enumsToUnbox).fixupTypeReferences();
     appView.setUnboxedEnums(enumUnboxerRewriter.getEnumsToUnbox());
-    if (enumUnboxingLens != null) {
-      appView.setGraphLense(enumUnboxingLens);
-      appView.setAppInfo(
-          appView
-              .appInfo()
-              .rewrittenWithLens(appView.appInfo().app().asDirect(), enumUnboxingLens));
-      // Update optimization info.
-      feedback.fixupOptimizationInfos(
-          appView,
-          executorService,
-          new OptimizationInfoFixer() {
-            @Override
-            public void fixup(DexEncodedField field) {
-              FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
-              if (optimizationInfo.isMutableFieldOptimizationInfo()) {
-                optimizationInfo
-                    .asMutableFieldOptimizationInfo()
-                    .fixupClassTypeReferences(appView.graphLense()::lookupType, appView)
-                    .fixupAbstractValue(appView, appView.graphLense());
-              } else {
-                assert optimizationInfo.isDefaultFieldOptimizationInfo();
-              }
+    GraphLense previousLens = appView.graphLense();
+    appView.setGraphLense(enumUnboxingLens);
+    appView.setAppInfo(
+        appView.appInfo().rewrittenWithLens(appView.appInfo().app().asDirect(), enumUnboxingLens));
+    // Update optimization info.
+    feedback.fixupOptimizationInfos(
+        appView,
+        executorService,
+        new OptimizationInfoFixer() {
+          @Override
+          public void fixup(DexEncodedField field) {
+            FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
+            if (optimizationInfo.isMutableFieldOptimizationInfo()) {
+              optimizationInfo
+                  .asMutableFieldOptimizationInfo()
+                  .fixupClassTypeReferences(appView.graphLense()::lookupType, appView)
+                  .fixupAbstractValue(appView, appView.graphLense());
+            } else {
+              assert optimizationInfo.isDefaultFieldOptimizationInfo();
             }
+          }
 
-            @Override
-            public void fixup(DexEncodedMethod method) {
-              MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
-              if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
-                optimizationInfo
-                    .asUpdatableMethodOptimizationInfo()
-                    .fixupClassTypeReferences(appView.graphLense()::lookupType, appView)
-                    .fixupAbstractReturnValue(appView, appView.graphLense())
-                    .fixupInstanceInitializerInfo(appView, appView.graphLense());
-              } else {
-                assert optimizationInfo.isDefaultMethodOptimizationInfo();
-              }
+          @Override
+          public void fixup(DexEncodedMethod method) {
+            MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
+            if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
+              optimizationInfo
+                  .asUpdatableMethodOptimizationInfo()
+                  .fixupClassTypeReferences(appView.graphLense()::lookupType, appView)
+                  .fixupAbstractReturnValue(appView, appView.graphLense())
+                  .fixupInstanceInitializerInfo(appView, appView.graphLense());
+            } else {
+              assert optimizationInfo.isDefaultMethodOptimizationInfo();
             }
-          });
-    }
+          }
+        });
     postBuilder.put(this);
-    postBuilder.mapDexEncodedMethods(appView);
+    postBuilder.rewrittenWithLens(appView, previousLens);
   }
 
   public void finishAnalysis() {
@@ -698,6 +695,7 @@
         if (enumsToUnbox.contains(clazz.type)) {
           assert clazz.instanceFields().size() == 0;
           // Clear the initializers and move the static methods to the utility class.
+          Set<DexEncodedMethod> methodsToRemove = Sets.newIdentityHashSet();
           clazz
               .methods()
               .forEach(
@@ -708,8 +706,10 @@
                       assert m.isStatic();
                       unboxedEnumsMethods.add(
                           fixupEncodedMethodToUtility(m, factory.enumUnboxingUtilityType));
+                      methodsToRemove.add(m);
                     }
                   });
+          clazz.getMethodCollection().removeMethods(methodsToRemove);
         } else {
           clazz.getMethodCollection().replaceMethods(this::fixupEncodedMethod);
           fixupFields(clazz.staticFields(), clazz::setStaticField);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
index 35add7f..6e0805e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
@@ -195,8 +195,8 @@
   // we mark a method for further processing, and then invalidate the only lambda referenced
   // from it. In this case we will reprocess method that does not need patching, but it
   // should not be happening very frequently and we ignore possible overhead.
-  private final LongLivedProgramMethodSetBuilder methodsToReprocess =
-      new LongLivedProgramMethodSetBuilder();
+  private final LongLivedProgramMethodSetBuilder<SortedProgramMethodSet> methodsToReprocess =
+      LongLivedProgramMethodSetBuilder.createSorted();
 
   private final AppView<AppInfoWithLiveness> appView;
   private final Kotlin kotlin;
@@ -455,8 +455,7 @@
     if (methodsToReprocess.isEmpty()) {
       return;
     }
-    SortedProgramMethodSet methods =
-        methodsToReprocess.build(appView, ignore -> SortedProgramMethodSet.create());
+    SortedProgramMethodSet methods = methodsToReprocess.build(appView);
     converter.processMethodsConcurrently(methods, executorService);
     assert methods.stream()
         .map(DexClassAndMethod::getDefinition)
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
index acba57f..499c975 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
@@ -102,7 +102,7 @@
     }
   }
 
-  final Map<CandidateInfo, LongLivedProgramMethodSetBuilder> referencedFrom =
+  final Map<CandidateInfo, LongLivedProgramMethodSetBuilder<?>> referencedFrom =
       new IdentityHashMap<>();
 
   // The map storing all the potential candidates for staticizing.
@@ -291,7 +291,7 @@
             // Ignore just read instruction.
           }
           referencedFrom
-              .computeIfAbsent(candidateInfo, ignore -> new LongLivedProgramMethodSetBuilder())
+              .computeIfAbsent(candidateInfo, ignore -> LongLivedProgramMethodSetBuilder.create())
               .add(context);
         }
         continue;
@@ -313,7 +313,7 @@
         CandidateInfo info = processStaticFieldRead(instruction.asStaticGet());
         if (info != null) {
           referencedFrom
-              .computeIfAbsent(info, ignore -> new LongLivedProgramMethodSetBuilder())
+              .computeIfAbsent(info, ignore -> LongLivedProgramMethodSetBuilder.create())
               .add(context);
           // If the candidate is still valid, ignore all usages in further analysis.
           Value value = instruction.outValue();
@@ -329,7 +329,7 @@
         CandidateInfo info = processInvokeStatic(instruction.asInvokeStatic());
         if (info != null) {
           referencedFrom
-              .computeIfAbsent(info, ignore -> new LongLivedProgramMethodSetBuilder())
+              .computeIfAbsent(info, ignore -> LongLivedProgramMethodSetBuilder.create())
               .add(context);
           // If the candidate is still valid, ignore all usages in further analysis.
           Value value = instruction.outValue();
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 193e126..da9038d 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -1727,7 +1727,7 @@
     }
 
     @Override
-    public DexMethod getRenamedMethodSignature(DexMethod originalMethod) {
+    public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) {
       throw new Unreachable();
     }
 
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 78f044f..4079d9c 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -229,7 +229,7 @@
   public boolean enableInlining =
       !Version.isDevelopmentVersion()
           || System.getProperty("com.android.tools.r8.disableinlining") == null;
-  public boolean enableEnumUnboxing = false;
+  public boolean enableEnumUnboxing = true;
   // TODO(b/141451716): Evaluate the effect of allowing inlining in the inlinee.
   public boolean applyInliningToInlinee =
       System.getProperty("com.android.tools.r8.applyInliningToInlinee") != null;
diff --git a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java
index 79a104e..1c6d63a 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java
@@ -7,17 +7,29 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.GraphLense;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.google.common.collect.Sets;
 import java.util.Set;
 import java.util.function.IntFunction;
 
-public class LongLivedProgramMethodSetBuilder {
+public class LongLivedProgramMethodSetBuilder<T extends ProgramMethodSet> {
 
-  private Set<DexMethod> methods = Sets.newIdentityHashSet();
+  private final IntFunction<T> factory;
+  private final Set<DexMethod> methods = Sets.newIdentityHashSet();
 
-  public LongLivedProgramMethodSetBuilder() {}
+  private LongLivedProgramMethodSetBuilder(IntFunction<T> factory) {
+    this.factory = factory;
+  }
+
+  public static LongLivedProgramMethodSetBuilder<?> create() {
+    return new LongLivedProgramMethodSetBuilder<>(ProgramMethodSet::create);
+  }
+
+  public static LongLivedProgramMethodSetBuilder<SortedProgramMethodSet> createSorted() {
+    return new LongLivedProgramMethodSetBuilder<>(ignore -> SortedProgramMethodSet.create());
+  }
 
   public void add(ProgramMethod method) {
     methods.add(method.getReference());
@@ -27,25 +39,23 @@
     methods.forEach(this::add);
   }
 
-  public ProgramMethodSet build(AppView<AppInfoWithLiveness> appView) {
-    return build(appView, ProgramMethodSet::create);
+  public void rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense applied) {
+    Set<DexMethod> newMethods = Sets.newIdentityHashSet();
+    for (DexMethod method : methods) {
+      newMethods.add(appView.graphLense().getRenamedMethodSignature(method, applied));
+    }
+    methods.clear();
+    methods.addAll(newMethods);
   }
 
-  public <T extends ProgramMethodSet> T build(
-      AppView<AppInfoWithLiveness> appView, IntFunction<T> factory) {
+  public T build(AppView<AppInfoWithLiveness> appView) {
+    return build(appView, null);
+  }
+
+  public T build(AppView<AppInfoWithLiveness> appView, GraphLense applied) {
     T result = factory.apply(methods.size());
     for (DexMethod oldMethod : methods) {
-      DexMethod method = appView.graphLense().getRenamedMethodSignature(oldMethod);
-      DexProgramClass holder = appView.definitionForHolder(method).asProgramClass();
-      result.createAndAdd(holder, holder.lookupMethod(method));
-    }
-    return result;
-  }
-
-  @Deprecated
-  public ProgramMethodSet buildRaw(AppView<AppInfoWithLiveness> appView) {
-    ProgramMethodSet result = ProgramMethodSet.create();
-    for (DexMethod method : methods) {
+      DexMethod method = appView.graphLense().getRenamedMethodSignature(oldMethod, applied);
       DexProgramClass holder = appView.definitionForHolder(method).asProgramClass();
       result.createAndAdd(holder, holder.lookupMethod(method));
     }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 5863dd8..8ff71b8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -379,6 +379,6 @@
       }
     }
     assertEquals(1, instanceGetCount);
-    assertEquals(1, invokeCount);
+    assertEquals(BooleanUtils.intValue(parameters.isCfRuntime()), invokeCount);
   }
 }