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