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;
}