Remove workarounds for out-of-order lens code rewriting

Bug: 199864962
Change-Id: Iabaf43c20f3b4fa03ace0938bc6b243212b0e421
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 17c2e32..b1292dc 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
@@ -1019,15 +1019,6 @@
         iterator.insertNullCheckInstruction(
             appView, code, blocks, invoke.getFirstArgument(), nullCheckPosition);
 
-    // TODO(b/199864962): Lens code rewriting should follow the order of graph lenses, i.e., enum
-    //  unboxing rewriting should happen after method staticizing.
-    if (receiverType.isClassType()
-        && appView.unboxedEnums().isUnboxedEnum(receiverType.asClassType().getClassType())) {
-      iterator.previousUntil(instruction -> instruction == nullCheck);
-      iterator.next();
-      enumUnboxer.rewriteNullCheck(iterator, nullCheck);
-    }
-
     // Reset the block iterator.
     if (invoke.getBlock().hasCatchHandlers()) {
       BasicBlock splitBlock = invoke.getBlock();
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 f436603..1583873 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
@@ -11,8 +11,6 @@
 import com.android.tools.r8.graph.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.InstructionListIterator;
-import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.Phi;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
@@ -68,11 +66,6 @@
   }
 
   @Override
-  public void rewriteNullCheck(InstructionListIterator iterator, InvokeMethod invoke) {
-    // Intentionally empty.
-  }
-
-  @Override
   public void unboxEnums(
       AppView<AppInfoWithLiveness> appView,
       IRConverter converter,
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 a1212bf..8ff6293 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
@@ -11,8 +11,6 @@
 import com.android.tools.r8.graph.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.InstructionListIterator;
-import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.Phi;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
@@ -48,7 +46,6 @@
   public abstract Set<Phi> rewriteCode(
       IRCode code, MethodProcessor methodProcessor, RewrittenPrototypeDescription prototypeChanges);
 
-  public abstract void rewriteNullCheck(InstructionListIterator iterator, InvokeMethod invoke);
 
   public abstract void unboxEnums(
       AppView<AppInfoWithLiveness> appView,
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 8a357cb..e9ffe62 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
@@ -63,7 +63,6 @@
 import com.android.tools.r8.ir.code.If;
 import com.android.tools.r8.ir.code.InstanceGet;
 import com.android.tools.r8.ir.code.Instruction;
-import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.InvokeCustom;
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.InvokeStatic;
@@ -653,9 +652,6 @@
             .fixupTypeReferences(converter, executorService);
     EnumUnboxingLens enumUnboxingLens = treeFixerResult.getLens();
 
-    // Update the graph lens.
-    appView.rewriteWithLens(enumUnboxingLens);
-
     // Enqueue the (lens rewritten) methods that require reprocessing.
     //
     // Note that the reprocessing set must be rewritten to the new enum unboxing lens before pruning
@@ -681,7 +677,6 @@
         new EnumUnboxingRewriter(
             appView,
             treeFixerResult.getCheckNotNullToCheckNotZeroMapping(),
-            converter,
             enumUnboxingLens,
             enumDataMap,
             utilityClasses);
@@ -1462,13 +1457,6 @@
   }
 
   @Override
-  public void rewriteNullCheck(InstructionListIterator iterator, InvokeMethod invoke) {
-    if (enumUnboxerRewriter != null) {
-      enumUnboxerRewriter.rewriteNullCheck(iterator, invoke);
-    }
-  }
-
-  @Override
   public void unsetRewriter() {
     enumUnboxerRewriter = null;
   }
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 f4360d3..d7b13ab 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
@@ -34,7 +34,6 @@
 import com.android.tools.r8.ir.code.Phi;
 import com.android.tools.r8.ir.code.StaticGet;
 import com.android.tools.r8.ir.code.Value;
-import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.MethodProcessor;
 import com.android.tools.r8.ir.optimize.enums.EnumInstanceFieldData.EnumInstanceFieldKnownData;
 import com.android.tools.r8.ir.optimize.enums.classification.CheckNotNullEnumUnboxerMethodClassification;
@@ -55,7 +54,6 @@
 
   private final AppView<AppInfoWithLiveness> appView;
   private final Map<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping;
-  private final IRConverter converter;
   private final DexItemFactory factory;
   private final InternalOptions options;
   private final EnumDataMap unboxedEnumsData;
@@ -65,13 +63,11 @@
   EnumUnboxingRewriter(
       AppView<AppInfoWithLiveness> appView,
       Map<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping,
-      IRConverter converter,
       EnumUnboxingLens enumUnboxingLens,
       EnumDataMap unboxedEnumsInstanceFieldData,
       EnumUnboxingUtilityClasses utilityClasses) {
     this.appView = appView;
     this.checkNotNullToCheckNotZeroMapping = checkNotNullToCheckNotZeroMapping;
-    this.converter = converter;
     this.factory = appView.dexItemFactory();
     this.options = appView.options();
     this.enumUnboxingLens = enumUnboxingLens;
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 862840b..773dadf 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
@@ -132,12 +132,18 @@
       }
     }
 
+    // Install the new graph lens before processing any checkNotZero() methods.
+    EnumUnboxingLens lens = lensBuilder.build(appView);
+    appView.rewriteWithLens(lens);
+
+    // Rewrite outliner with lens.
+    converter.outliner.rewriteWithLens();
+
     // Create mapping from checkNotNull() to checkNotZero() methods.
     BiMap<DexMethod, DexMethod> checkNotNullToCheckNotZeroMapping =
         duplicateCheckNotNullMethods(converter, executorService);
 
-    return new Result(
-        checkNotNullToCheckNotZeroMapping, lensBuilder.build(appView), prunedItemsBuilder.build());
+    return new Result(checkNotNullToCheckNotZeroMapping, lens, prunedItemsBuilder.build());
   }
 
   private BiMap<DexMethod, DexMethod> duplicateCheckNotNullMethods(
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
index 6069b81..d5af406 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
@@ -725,13 +725,6 @@
       if (!isPrototypeChangesAllowed(method, interfaceDispatchOutsideProgram)) {
         return RewrittenPrototypeDescription.none();
       }
-      // TODO(b/199864962): Allow parameter removal from check-not-null classified methods.
-      if (method
-          .getOptimizationInfo()
-          .getEnumUnboxerMethodClassification()
-          .isCheckNotNullClassification()) {
-        return RewrittenPrototypeDescription.none();
-      }
       RewrittenPrototypeDescription prototypeChanges = computePrototypeChangesForMethod(method);
       if (prototypeChanges.isEmpty()) {
         return prototypeChanges;
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CheckNotZeroMethodWithArgumentRemovalTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CheckNotZeroMethodWithArgumentRemovalTest.java
index be25553..3685b5c 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CheckNotZeroMethodWithArgumentRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CheckNotZeroMethodWithArgumentRemovalTest.java
@@ -50,8 +50,7 @@
               MethodSubject checkNotNullSubject =
                   mainClassSubject.uniqueMethodWithName("checkNotNull");
               assertThat(checkNotNullSubject, isPresent());
-              // TODO(b/199864962): Allow parameter removal from check-not-null classified methods.
-              assertEquals(2, checkNotNullSubject.getProgramMethod().getReference().getArity());
+              assertEquals(1, checkNotNullSubject.getProgramMethod().getReference().getArity());
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithEmptyOutput();