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) {