Revert "Introduce NestedGraphLensWithCustomCodeRewriting"

This reverts commit 1fb434fcb0d43f802bc10d0c7d4dc50a7cc20142.


Revert "Fix overload according to errorprone"

This reverts commit 25539ef86942d865d49a590bf1dd7bf341828ea9.


Revert "DuplicateCheckNull after lens is applied"

This reverts commit 05269aaf5e3c12db86de37690bba7d1d7720c9c8.

Change-Id: If8394360351333bd6c946c6f9f5e8135d645409f
diff --git a/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
index 8b5b5d3..b34bf05 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
@@ -23,7 +23,6 @@
 import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
 import com.android.tools.r8.ir.code.InvokeType;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.ir.optimize.CustomLensCodeRewriter;
 import com.android.tools.r8.ir.optimize.enums.EnumUnboxingLens;
 import com.android.tools.r8.optimize.MemberRebindingIdentityLens;
 import com.android.tools.r8.optimize.MemberRebindingLens;
@@ -389,11 +388,6 @@
     return false;
   }
 
-  public CustomLensCodeRewriter getCustomCodeRewriting() {
-    assert hasCustomCodeRewritings();
-    return null;
-  }
-
   public boolean isAppliedLens() {
     return false;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/lens/NestedGraphLensWithCustomCodeRewriting.java b/src/main/java/com/android/tools/r8/graph/lens/NestedGraphLensWithCustomCodeRewriting.java
deleted file mode 100644
index 60e8694..0000000
--- a/src/main/java/com/android/tools/r8/graph/lens/NestedGraphLensWithCustomCodeRewriting.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.graph.lens;
-
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.optimize.CustomLensCodeRewriter;
-import com.android.tools.r8.utils.collections.BidirectionalManyToManyRepresentativeMap;
-import com.android.tools.r8.utils.collections.BidirectionalManyToOneRepresentativeMap;
-import java.util.Map;
-
-public class NestedGraphLensWithCustomCodeRewriting extends NestedGraphLens {
-
-  private final CustomLensCodeRewriter customLensCodeRewriter;
-
-  public NestedGraphLensWithCustomCodeRewriting(
-      AppView<?> appView,
-      BidirectionalManyToOneRepresentativeMap<DexField, DexField> fieldMap,
-      BidirectionalManyToOneRepresentativeMap<DexMethod, DexMethod> methodMap,
-      BidirectionalManyToManyRepresentativeMap<DexType, DexType> typeMap,
-      CustomLensCodeRewriter customLensCodeRewriter) {
-    super(appView, fieldMap, methodMap, typeMap);
-    this.customLensCodeRewriter = customLensCodeRewriter;
-  }
-
-  public NestedGraphLensWithCustomCodeRewriting(
-      AppView<?> appView,
-      BidirectionalManyToOneRepresentativeMap<DexField, DexField> fieldMap,
-      Map<DexMethod, DexMethod> methodMap,
-      BidirectionalManyToManyRepresentativeMap<DexType, DexType> typeMap,
-      CustomLensCodeRewriter customLensCodeRewriter,
-      BidirectionalManyToManyRepresentativeMap<DexMethod, DexMethod> newMethodSignatures) {
-    super(appView, fieldMap, methodMap, typeMap, newMethodSignatures);
-    this.customLensCodeRewriter = customLensCodeRewriter;
-  }
-
-  @Override
-  public boolean hasCustomCodeRewritings() {
-    return true;
-  }
-
-  @Override
-  public CustomLensCodeRewriter getCustomCodeRewriting() {
-    return customLensCodeRewriter;
-  }
-}
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 2a10e4c..0e13017 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
@@ -259,7 +259,7 @@
               : null;
       this.enumUnboxer = EnumUnboxer.create(appViewWithLiveness);
       this.numberUnboxer = NumberUnboxer.create(appViewWithLiveness);
-      this.lensCodeRewriter = new LensCodeRewriter(appViewWithLiveness);
+      this.lensCodeRewriter = new LensCodeRewriter(appViewWithLiveness, enumUnboxer);
       this.inliner = new Inliner(appViewWithLiveness, this, lensCodeRewriter);
       this.outliner = Outliner.create(appViewWithLiveness);
       this.memberValuePropagation = new R8MemberValuePropagation(appViewWithLiveness);
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 bd23bfd..9cb88c3 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
@@ -107,7 +107,7 @@
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.passes.TrivialPhiSimplifier;
 import com.android.tools.r8.ir.optimize.AffectedValues;
-import com.android.tools.r8.ir.optimize.CustomLensCodeRewriter;
+import com.android.tools.r8.ir.optimize.enums.EnumUnboxer;
 import com.android.tools.r8.optimize.MemberRebindingAnalysis;
 import com.android.tools.r8.optimize.argumentpropagation.lenscoderewriter.NullCheckInserter;
 import com.android.tools.r8.utils.ArrayUtils;
@@ -159,11 +159,13 @@
 
   private final AppView<? extends AppInfoWithClassHierarchy> appView;
   private final DexItemFactory factory;
+  private final EnumUnboxer enumUnboxer;
   private final InternalOptions options;
 
-  LensCodeRewriter(AppView<? extends AppInfoWithClassHierarchy> appView) {
+  LensCodeRewriter(AppView<? extends AppInfoWithClassHierarchy> appView, EnumUnboxer enumUnboxer) {
     this.appView = appView;
     this.factory = appView.dexItemFactory();
+    this.enumUnboxer = enumUnboxer;
     this.options = appView.options();
   }
 
@@ -226,10 +228,9 @@
     rewriteArguments(
         code, originalMethodReference, prototypeChanges, affectedPhis, unusedArguments);
     if (graphLens.hasCustomCodeRewritings()) {
+      assert graphLens.isEnumUnboxerLens();
       assert graphLens.getPrevious() == codeLens;
-      CustomLensCodeRewriter customLensCodeRewriter = graphLens.getCustomCodeRewriting();
-      affectedPhis.addAll(
-          customLensCodeRewriter.rewriteCode(code, methodProcessor, prototypeChanges, graphLens));
+      affectedPhis.addAll(enumUnboxer.rewriteCode(code, methodProcessor, prototypeChanges));
     }
     if (!unusedArguments.isEmpty()) {
       for (UnusedArgument unusedArgument : unusedArguments) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
index 8b4cbce..6b6f2ad 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
@@ -212,6 +212,8 @@
 
     appView.clearMethodResolutionOptimizationInfoCollection();
 
+    enumUnboxer.unsetRewriter();
+
     // All the code that should be impacted by the lenses inserted between phase 1 and phase 2
     // have now been processed and rewritten, we clear code lens rewriting so that the class
     // staticizer and phase 3 does not perform again the rewriting.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CustomLensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CustomLensCodeRewriter.java
deleted file mode 100644
index 58827ef..0000000
--- a/src/main/java/com/android/tools/r8/ir/optimize/CustomLensCodeRewriter.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.ir.optimize;
-
-import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
-import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
-import com.android.tools.r8.ir.code.IRCode;
-import com.android.tools.r8.ir.code.Phi;
-import com.android.tools.r8.ir.conversion.MethodProcessor;
-import java.util.Set;
-
-public interface CustomLensCodeRewriter {
-
-  Set<Phi> rewriteCode(
-      IRCode code,
-      MethodProcessor methodProcessor,
-      RewrittenPrototypeDescription prototypeChanges,
-      NonIdentityGraphLens lens);
-}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EmptyEnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EmptyEnumUnboxer.java
index 4e07fba..cc90f9b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EmptyEnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EmptyEnumUnboxer.java
@@ -8,14 +8,18 @@
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
 import com.android.tools.r8.ir.analysis.fieldvalueanalysis.StaticFieldValues;
 import com.android.tools.r8.ir.code.IRCode;
+import com.android.tools.r8.ir.code.Phi;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.MethodProcessor;
 import com.android.tools.r8.ir.conversion.PostMethodProcessor.Builder;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.Timing;
+import java.util.Collections;
+import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
 public class EmptyEnumUnboxer extends EnumUnboxer {
@@ -54,6 +58,14 @@
   }
 
   @Override
+  public Set<Phi> rewriteCode(
+      IRCode code,
+      MethodProcessor methodProcessor,
+      RewrittenPrototypeDescription prototypeChanges) {
+    return Collections.emptySet();
+  }
+
+  @Override
   @SuppressWarnings("BadImport")
   public void rewriteWithLens() {
     // Intentionally empty.
@@ -72,6 +84,11 @@
   }
 
   @Override
+  public void unsetRewriter() {
+    // Intentionally empty.
+  }
+
+  @Override
   public void updateEnumUnboxingCandidatesInfo() {
     // Intentionally empty.
   }
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 081d608..48ae3b2 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
@@ -8,14 +8,17 @@
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.lens.GraphLens;
+import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
 import com.android.tools.r8.ir.analysis.fieldvalueanalysis.StaticFieldValues;
 import com.android.tools.r8.ir.code.IRCode;
+import com.android.tools.r8.ir.code.Phi;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.MethodProcessor;
 import com.android.tools.r8.ir.conversion.PostMethodProcessor.Builder;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.Timing;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 
@@ -41,6 +44,9 @@
 
   public abstract void recordEnumState(DexProgramClass clazz, StaticFieldValues staticFieldValues);
 
+  public abstract Set<Phi> rewriteCode(
+      IRCode code, MethodProcessor methodProcessor, RewrittenPrototypeDescription prototypeChanges);
+
   public abstract void rewriteWithLens();
 
   @SuppressWarnings("BadImport")
@@ -53,5 +59,7 @@
       Timing timing)
       throws ExecutionException;
 
+  public abstract void unsetRewriter();
+
   public abstract void updateEnumUnboxingCandidatesInfo();
 }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
index 7d66f95..5821b3a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
@@ -166,6 +166,9 @@
       checkNotNullMethodsBuilder;
 
   private final DexClassAndField ordinalField;
+
+  private EnumUnboxingRewriter enumUnboxerRewriter;
+
   private final boolean debugLogEnabled;
   private final Map<DexType, List<Reason>> debugLogs;
 
@@ -738,6 +741,7 @@
         new EnumUnboxingTreeFixer(
                 appView, checkNotNullMethods, enumDataMap, enumClassesToUnbox, utilityClasses)
             .fixupTypeReferences(converter, executorService, timing);
+    EnumUnboxingLens enumUnboxingLens = treeFixerResult.getLens();
 
     // Enqueue the (lens rewritten) methods that require reprocessing.
     //
@@ -760,6 +764,14 @@
 
     updateOptimizationInfos(executorService, feedback, treeFixerResult, previousLens);
 
+    enumUnboxerRewriter =
+        new EnumUnboxingRewriter(
+            appView,
+            treeFixerResult.getCheckNotNullToCheckNotZeroMapping(),
+            enumUnboxingLens,
+            enumDataMap,
+            utilityClasses);
+
     // Ensure determinism of method-to-reprocess set.
     appView.testing().checkDeterminism(postMethodProcessorBuilder::dump);
 
@@ -1773,4 +1785,22 @@
     enumUnboxingCandidatesInfo.addPrunedMethod(method);
     methodsDependingOnLibraryModelisation.remove(method.getReference(), appView.graphLens());
   }
+
+  @Override
+  public Set<Phi> rewriteCode(
+      IRCode code,
+      MethodProcessor methodProcessor,
+      RewrittenPrototypeDescription prototypeChanges) {
+    // This has no effect during primary processing since the enumUnboxerRewriter is set
+    // in between primary and post processing.
+    if (enumUnboxerRewriter != null) {
+      return enumUnboxerRewriter.rewriteCode(code, methodProcessor, prototypeChanges);
+    }
+    return Sets.newIdentityHashSet();
+  }
+
+  @Override
+  public void unsetRewriter() {
+    enumUnboxerRewriter = null;
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
index 40e749b..95e4ea6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
@@ -14,7 +14,7 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.lens.GraphLens;
 import com.android.tools.r8.graph.lens.MethodLookupResult;
-import com.android.tools.r8.graph.lens.NestedGraphLensWithCustomCodeRewriting;
+import com.android.tools.r8.graph.lens.NestedGraphLens;
 import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
 import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
 import com.android.tools.r8.graph.proto.RewrittenTypeInfo;
@@ -44,7 +44,7 @@
 import java.util.Map;
 import java.util.Set;
 
-public class EnumUnboxingLens extends NestedGraphLensWithCustomCodeRewriting {
+public class EnumUnboxingLens extends NestedGraphLens {
 
   private final AbstractValueFactory abstractValueFactory;
   private final Map<DexMethod, RewrittenPrototypeDescription> prototypeChangesPerMethod;
@@ -58,9 +58,8 @@
       BidirectionalManyToOneRepresentativeMap<DexType, DexType> typeMap,
       Map<DexMethod, DexMethod> methodMap,
       Map<DexMethod, RewrittenPrototypeDescription> prototypeChangesPerMethod,
-      Set<DexMethod> dispatchMethods,
-      EnumUnboxingRewriter enumUnboxingRewriter) {
-    super(appView, fieldMap, methodMap, typeMap, enumUnboxingRewriter, renamedSignatures);
+      Set<DexMethod> dispatchMethods) {
+    super(appView, fieldMap, methodMap, typeMap, renamedSignatures);
     assert !appView.unboxedEnums().isEmpty();
     this.abstractValueFactory = appView.abstractValueFactory();
     this.prototypeChangesPerMethod = prototypeChangesPerMethod;
@@ -69,6 +68,11 @@
   }
 
   @Override
+  public boolean hasCustomCodeRewritings() {
+    return true;
+  }
+
+  @Override
   public boolean isEnumUnboxerLens() {
     return true;
   }
@@ -78,10 +82,6 @@
     return this;
   }
 
-  public EnumDataMap getUnboxedEnums() {
-    return unboxedEnums;
-  }
-
   @Override
   public boolean isContextFreeForMethods(GraphLens codeLens) {
     if (codeLens == this) {
@@ -383,10 +383,7 @@
           originalCheckNotNullMethodSignature, checkNotNullMethod.getReference());
     }
 
-    public EnumUnboxingLens build(
-        AppView<AppInfoWithLiveness> appView,
-        Set<DexMethod> dispatchMethods,
-        EnumUnboxingRewriter enumUnboxingRewriter) {
+    public EnumUnboxingLens build(AppView<?> appView, Set<DexMethod> dispatchMethods) {
       assert !typeMap.isEmpty();
       return new EnumUnboxingLens(
           appView,
@@ -395,8 +392,7 @@
           typeMap,
           methodMap,
           ImmutableMap.copyOf(prototypeChangesPerMethod),
-          dispatchMethods,
-          enumUnboxingRewriter);
+          dispatchMethods);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
index 3125c3d..46184c4 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
 import com.android.tools.r8.graph.proto.ArgumentInfo;
 import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
 import com.android.tools.r8.graph.proto.RewrittenTypeInfo;
@@ -43,7 +42,6 @@
 import com.android.tools.r8.ir.code.StaticGet;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.conversion.MethodProcessor;
-import com.android.tools.r8.ir.optimize.CustomLensCodeRewriter;
 import com.android.tools.r8.ir.optimize.enums.EnumInstanceFieldData.EnumInstanceFieldKnownData;
 import com.android.tools.r8.ir.optimize.enums.classification.CheckNotNullEnumUnboxerMethodClassification;
 import com.android.tools.r8.ir.optimize.enums.classification.EnumUnboxerMethodClassification;
@@ -60,31 +58,31 @@
 import java.util.Map;
 import java.util.Set;
 
-public class EnumUnboxingRewriter implements CustomLensCodeRewriter {
+public class EnumUnboxingRewriter {
 
   private final AppView<AppInfoWithLiveness> appView;
-  private Map<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping;
+  private final Map<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping;
   private final DexItemFactory factory;
   private final InternalOptions options;
   private final EnumDataMap unboxedEnumsData;
+  private final EnumUnboxingLens enumUnboxingLens;
   private final EnumUnboxingUtilityClasses utilityClasses;
 
   EnumUnboxingRewriter(
       AppView<AppInfoWithLiveness> appView,
+      Map<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping,
+      EnumUnboxingLens enumUnboxingLens,
       EnumDataMap unboxedEnumsInstanceFieldData,
       EnumUnboxingUtilityClasses utilityClasses) {
     this.appView = appView;
+    this.checkNotNullToCheckNotZeroMapping = checkNotNullToCheckNotZeroMapping;
     this.factory = appView.dexItemFactory();
     this.options = appView.options();
+    this.enumUnboxingLens = enumUnboxingLens;
     this.unboxedEnumsData = unboxedEnumsInstanceFieldData;
     this.utilityClasses = utilityClasses;
   }
 
-  public void setCheckNotNullToCheckNotZeroMapping(
-      Map<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping) {
-    this.checkNotNullToCheckNotZeroMapping = checkNotNullToCheckNotZeroMapping;
-  }
-
   private LocalEnumUnboxingUtilityClass getLocalUtilityClass(DexType enumType) {
     return utilityClasses.getLocalUtilityClass(unboxedEnumsData.representativeType(enumType));
   }
@@ -148,19 +146,15 @@
     return convertedEnums;
   }
 
-  @Override
-  public Set<Phi> rewriteCode(
+  Set<Phi> rewriteCode(
       IRCode code,
       MethodProcessor methodProcessor,
-      RewrittenPrototypeDescription prototypeChanges,
-      NonIdentityGraphLens graphLens) {
+      RewrittenPrototypeDescription prototypeChanges) {
     // We should not process the enum methods, they will be removed and they may contain invalid
     // rewriting rules.
     if (unboxedEnumsData.isEmpty()) {
       return Sets.newIdentityHashSet();
     }
-    assert graphLens.isEnumUnboxerLens();
-    EnumUnboxingLens enumUnboxingLens = graphLens.asEnumUnboxerLens();
     assert code.isConsistentSSABeforeTypesAreCorrect(appView);
     EnumUnboxerMethodProcessorEventConsumer eventConsumer = methodProcessor.getEventConsumer();
     Set<Phi> affectedPhis = Sets.newIdentityHashSet();
@@ -198,8 +192,7 @@
               blocks,
               block,
               iterator,
-              instruction.asInvokeMethodWithReceiver(),
-              enumUnboxingLens);
+              instruction.asInvokeMethodWithReceiver());
         } else if (instruction.isNewArrayFilled()) {
           rewriteNewArrayFilled(instruction.asNewArrayFilled(), code, convertedEnums, iterator);
         } else if (instruction.isInvokeStatic()) {
@@ -386,8 +379,7 @@
       BasicBlockIterator blocks,
       BasicBlock block,
       InstructionListIterator iterator,
-      InvokeMethodWithReceiver invoke,
-      EnumUnboxingLens enumUnboxingLens) {
+      InvokeMethodWithReceiver invoke) {
     ProgramMethod context = code.context();
     // If the receiver is null, then the invoke is not rewritten even if the receiver is an
     // unboxed enum, but we end up with null.ordinal() or similar which has the correct behavior.
@@ -652,7 +644,6 @@
       return;
     }
 
-    assert checkNotNullToCheckNotZeroMapping != null;
     if (singleTarget.isProgramMethod()
         && checkNotNullToCheckNotZeroMapping.containsKey(singleTarget.getReference())) {
       DexMethod checkNotZeroMethodReference =
@@ -708,7 +699,7 @@
     }
   }
 
-  private void rewriteNullCheck(
+  public void rewriteNullCheck(
       InstructionListIterator iterator,
       InvokeMethod invoke,
       ProgramMethod context,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index c4d4254..59be01e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -157,10 +157,7 @@
     // Install the new graph lens before processing any checkNotZero() methods.
     Set<DexMethod> dispatchMethodReferences = Sets.newIdentityHashSet();
     dispatchMethods.forEach((method, code) -> dispatchMethodReferences.add(method.getReference()));
-    EnumUnboxingRewriter enumUnboxingRewriter =
-        new EnumUnboxingRewriter(appView, enumDataMap, utilityClasses);
-    EnumUnboxingLens lens =
-        lensBuilder.build(appView, dispatchMethodReferences, enumUnboxingRewriter);
+    EnumUnboxingLens lens = lensBuilder.build(appView, dispatchMethodReferences);
     appView.rewriteWithLens(lens, executorService, timing);
 
     // Rewrite outliner with lens.
@@ -169,7 +166,6 @@
     // Create mapping from checkNotNull() to checkNotZero() methods.
     BiMap<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping =
         duplicateCheckNotNullMethods(converter, executorService);
-    enumUnboxingRewriter.setCheckNotNullToCheckNotZeroMapping(checkNotNullToCheckNotZeroMapping);
 
     dispatchMethods.forEach((method, code) -> code.setCodeLens(lens));
     profileCollectionAdditions
@@ -177,7 +173,7 @@
         .commit(appView);
 
     return new Result(
-        checkNotNullToCheckNotZeroMapping, methodsToProcess, prunedItemsBuilder.build());
+        checkNotNullToCheckNotZeroMapping, methodsToProcess, lens, prunedItemsBuilder.build());
   }
 
   private void cleanUpOldClass(DexProgramClass clazz) {
@@ -1102,14 +1098,17 @@
 
     private final BiMap<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping;
     private final ProgramMethodSet methodsToProcess;
+    private final EnumUnboxingLens lens;
     private final PrunedItems prunedItems;
 
     Result(
         BiMap<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping,
         ProgramMethodSet methodsToProcess,
+        EnumUnboxingLens lens,
         PrunedItems prunedItems) {
       this.checkNotNullToCheckNotZeroMapping = checkNotNullToCheckNotZeroMapping;
       this.methodsToProcess = methodsToProcess;
+      this.lens = lens;
       this.prunedItems = prunedItems;
     }
 
@@ -1121,6 +1120,10 @@
       return methodsToProcess;
     }
 
+    EnumUnboxingLens getLens() {
+      return lens;
+    }
+
     PrunedItems getPrunedItems() {
       return prunedItems;
     }