Remove redundant field eligibleClass in InlineCandidateProcessor
Change-Id: Ie0ee16e25702cadf987bf0c2bd2b9d0e8e849eec
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 016e600..530af5d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -85,8 +85,7 @@
private final Instruction root;
private Value eligibleInstance;
- private DexType eligibleClass;
- private DexProgramClass eligibleClassDefinition;
+ private DexProgramClass eligibleClass;
private final Map<InvokeMethodWithReceiver, InliningInfo> methodCallsOnInstance =
new IdentityHashMap<>();
@@ -119,7 +118,7 @@
}
DexProgramClass getEligibleClass() {
- return eligibleClassDefinition;
+ return eligibleClass;
}
Map<InvokeMethod, DexEncodedMethod> getDirectInlinees() {
@@ -141,34 +140,40 @@
if (eligibleInstance == null) {
return EligibilityStatus.UNUSED_INSTANCE;
}
+
if (root.isNewInstance()) {
- eligibleClass = root.asNewInstance().clazz;
- } else {
- assert root.isStaticGet();
- StaticGet staticGet = root.asStaticGet();
- if (staticGet.instructionMayHaveSideEffects(appView, method.method.holder)) {
- return EligibilityStatus.RETRIEVAL_MAY_HAVE_SIDE_EFFECTS;
+ eligibleClass = asProgramClassOrNull(appView.definitionFor(root.asNewInstance().clazz));
+ if (eligibleClass == null) {
+ return EligibilityStatus.UNKNOWN_TYPE;
}
- DexEncodedField field = appView.appInfo().resolveField(staticGet.getField());
- FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
- ClassTypeLatticeElement dynamicLowerBoundType = optimizationInfo.getDynamicLowerBoundType();
- if (dynamicLowerBoundType == null
- || !dynamicLowerBoundType.equals(optimizationInfo.getDynamicUpperBoundType())) {
- return EligibilityStatus.NOT_A_SINGLETON_FIELD;
+ if (eligibleClass.classInitializationMayHaveSideEffects(
+ appView,
+ // Types that are a super type of the current context are guaranteed to be initialized.
+ type -> appView.isSubtype(method.method.holder, type).isTrue())) {
+ return EligibilityStatus.HAS_CLINIT;
}
- eligibleClass = dynamicLowerBoundType.getClassType();
- }
- if (!eligibleClass.isClassType()) {
- return EligibilityStatus.NON_CLASS_TYPE;
- }
- if (eligibleClassDefinition == null) {
- eligibleClassDefinition = asProgramClassOrNull(appView.definitionFor(eligibleClass));
- }
- if (eligibleClassDefinition != null) {
return EligibilityStatus.ELIGIBLE;
- } else {
+ }
+
+ assert root.isStaticGet();
+
+ StaticGet staticGet = root.asStaticGet();
+ if (staticGet.instructionMayHaveSideEffects(appView, method.method.holder)) {
+ return EligibilityStatus.RETRIEVAL_MAY_HAVE_SIDE_EFFECTS;
+ }
+ DexEncodedField field = appView.appInfo().resolveField(staticGet.getField());
+ FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
+ ClassTypeLatticeElement dynamicLowerBoundType = optimizationInfo.getDynamicLowerBoundType();
+ if (dynamicLowerBoundType == null
+ || !dynamicLowerBoundType.equals(optimizationInfo.getDynamicUpperBoundType())) {
+ return EligibilityStatus.NOT_A_SINGLETON_FIELD;
+ }
+ eligibleClass =
+ asProgramClassOrNull(appView.definitionFor(dynamicLowerBoundType.getClassType()));
+ if (eligibleClass == null) {
return EligibilityStatus.UNKNOWN_TYPE;
}
+ return EligibilityStatus.ELIGIBLE;
}
// Checks if the class is eligible and is properly used. Regarding general class
@@ -183,28 +188,7 @@
// * class has class initializer marked as TrivialClassInitializer, and
// class initializer initializes the field we are reading here.
EligibilityStatus isClassAndUsageEligible() {
- EligibilityStatus status = isClassEligible.apply(eligibleClassDefinition);
- if (status != EligibilityStatus.ELIGIBLE) {
- return status;
- }
-
- if (root.isNewInstance()) {
- // NOTE: if the eligible class does not directly extend java.lang.Object,
- // we also have to guarantee that it is initialized with initializer classified as
- // TrivialInstanceInitializer. This will be checked in areInstanceUsersEligible(...).
-
- // There must be no static initializer on the class itself.
- if (eligibleClassDefinition.classInitializationMayHaveSideEffects(
- appView,
- // Types that are a super type of the current context are guaranteed to be initialized.
- type -> appView.isSubtype(method.method.holder, type).isTrue())) {
- return EligibilityStatus.HAS_CLINIT;
- }
- return EligibilityStatus.ELIGIBLE;
- }
-
- assert root.isStaticGet();
- return EligibilityStatus.ELIGIBLE;
+ return isClassEligible.apply(eligibleClass);
}
/**
@@ -608,7 +592,7 @@
}
InstancePut instancePut = user.asInstancePut();
DexEncodedField field =
- appView.appInfo().resolveFieldOn(eligibleClassDefinition, instancePut.getField());
+ appView.appInfo().resolveFieldOn(eligibleClass, instancePut.getField());
if (field == null) {
throw new Unreachable(
"Unexpected field write left in method `"
@@ -640,7 +624,7 @@
// Must be a constructor of the exact same class.
DexMethod init = invoke.getInvokedMethod();
- if (init.holder != eligibleClass) {
+ if (init.holder != eligibleClass.type) {
// Calling a constructor on a class that is different from the type of the instance.
// Gracefully abort class inlining (see the test B116282409).
return null;
@@ -674,7 +658,7 @@
parent = encodedParent.getOptimizationInfo().getInstanceInitializerInfo().getParent();
}
- return new InliningInfo(singleTarget, eligibleClass);
+ return new InliningInfo(singleTarget, eligibleClass.type);
}
// An invoke is eligible for inlining in the following cases:
@@ -782,7 +766,7 @@
private InliningInfo isEligibleIndirectVirtualMethodCall(DexMethod callee) {
DexEncodedMethod singleTarget =
- appView.appInfo().resolveMethod(eligibleClassDefinition, callee).getSingleTarget();
+ appView.appInfo().resolveMethod(eligibleClass, callee).getSingleTarget();
if (isEligibleSingleTarget(singleTarget)) {
return isEligibleVirtualMethodCall(
null, callee, singleTarget, eligibility -> eligibility.returnsReceiver.isFalse());
@@ -839,7 +823,7 @@
}
markSizeForInlining(invoke, singleTarget);
- return new InliningInfo(singleTarget, eligibleClass);
+ return new InliningInfo(singleTarget, eligibleClass.type);
}
private boolean isExtraMethodCall(InvokeMethod invoke) {