Reapply "Minor cleanup of inlining constraints from cf code"

This reverts commit 73a3eb2da79738f2932aa0ac59e6395e9f79d19e.

Change-Id: Icc2beeb70c1fe06aebde14b69c052e368fffce2b
diff --git a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
index ead08b8..542c1ab 100644
--- a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
+++ b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
@@ -7,7 +7,7 @@
 import com.android.tools.r8.FeatureSplit;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexEncodedMember;
+import com.android.tools.r8.graph.DexClassAndMember;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramDefinition;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -21,7 +21,7 @@
 
   public static ConstraintWithTarget getInliningConstraintForResolvedMember(
       ProgramMethod method,
-      DexEncodedMember<?, ?> resolvedMember,
+      DexClassAndMember<?, ?> resolvedMember,
       AppView<? extends AppInfoWithClassHierarchy> appView) {
     ClassToFeatureSplitMap classToFeatureSplitMap = appView.appInfo().getClassToFeatureSplitMap();
     // We never inline into the base from a feature (calls should never happen) and we never inline
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index e730dee..77398b6 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -850,40 +850,27 @@
 
   @SuppressWarnings("ReferenceEquality")
   public ConstraintWithTarget computeInliningConstraint(
-      ProgramMethod method,
       AppView<AppInfoWithLiveness> appView,
       GraphLens graphLens,
       ProgramMethod context) {
     InliningConstraints inliningConstraints = new InliningConstraints(appView, graphLens);
     if (appView.options().isInterfaceMethodDesugaringEnabled()) {
       // TODO(b/120130831): Conservatively need to say "no" at this point if there are invocations
-      // to static interface methods. This should be fixed by making sure that the desugared
-      // versions of default and static interface methods are present in the application during
-      // IR processing.
+      //  to static interface methods. This should be fixed by making sure that the desugared
+      //  versions of default and static interface methods are present in the application during
+      //  IR processing.
       inliningConstraints.disallowStaticInterfaceMethodCalls();
     }
-    // Model a synchronized method as having a monitor instruction.
-    ConstraintWithTarget constraint =
-        method.getDefinition().isSynchronized()
-            ? inliningConstraints.forMonitor()
-            : ConstraintWithTarget.ALWAYS;
-
-    if (constraint == ConstraintWithTarget.NEVER) {
-      return constraint;
-    }
+    ConstraintWithTarget constraint = ConstraintWithTarget.ALWAYS;
+    assert inliningConstraints.forMonitor().isAlways();
     for (CfInstruction insn : instructions) {
       constraint =
           ConstraintWithTarget.meet(
               constraint, insn.inliningConstraint(inliningConstraints, this, context), appView);
-      if (constraint == ConstraintWithTarget.NEVER) {
+      if (constraint.isNever()) {
         return constraint;
       }
     }
-    if (!tryCatchRanges.isEmpty()) {
-      // Model a try-catch as a move-exception instruction.
-      constraint =
-          ConstraintWithTarget.meet(constraint, inliningConstraints.forMoveException(), appView);
-    }
     return constraint;
   }
 
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIllegalInlining.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIllegalInlining.java
index 361fdeb..872bf09 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIllegalInlining.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIllegalInlining.java
@@ -42,8 +42,8 @@
     if (code.isCfCode()) {
       CfCode cfCode = code.asCfCode();
       ConstraintWithTarget constraint =
-          cfCode.computeInliningConstraint(method, appView, appView.graphLens(), method);
-      return constraint == ConstraintWithTarget.NEVER;
+          cfCode.computeInliningConstraint(appView, appView.graphLens(), method);
+      return constraint.isNever();
     } else if (code.isDefaultInstanceInitializerCode()) {
       return false;
     } else {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index 3117467..603bcc6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -184,13 +184,11 @@
 
     // Don't inline code with references beyond root main dex classes into a root main dex class.
     // If we do this it can increase the size of the main dex dependent classes.
-    if (mainDexInfo.disallowInliningIntoContext(
-        appView, method, singleTarget, appView.getSyntheticItems())) {
+    if (mainDexInfo.disallowInliningIntoContext(appView, method, singleTarget)) {
       whyAreYouNotInliningReporter.reportInlineeRefersToClassesNotInMainDex();
       return false;
     }
-    assert !mainDexInfo.disallowInliningIntoContext(
-        appView, method, singleTarget, appView.getSyntheticItems());
+    assert !mainDexInfo.disallowInliningIntoContext(appView, method, singleTarget);
     return true;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index fd3ec8c..9f25637 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -131,7 +131,7 @@
   private ConstraintWithTarget instructionAllowedForInlining(
       Instruction instruction, InliningConstraints inliningConstraints, ProgramMethod context) {
     ConstraintWithTarget result = instruction.inliningConstraint(inliningConstraints, context);
-    if (result == ConstraintWithTarget.NEVER && instruction.isDebugInstruction()) {
+    if (result.isNever() && instruction.isDebugInstruction()) {
       return ConstraintWithTarget.ALWAYS;
     }
     return result;
@@ -155,7 +155,7 @@
     for (Instruction instruction : code.instructions()) {
       ConstraintWithTarget state =
           instructionAllowedForInlining(instruction, inliningConstraints, context);
-      if (state == ConstraintWithTarget.NEVER) {
+      if (state.isNever()) {
         result = state;
         break;
       }
@@ -232,6 +232,10 @@
       return otherConstraint;
     }
 
+    public boolean isAlways() {
+      return this == ALWAYS;
+    }
+
     public boolean isNever() {
       return this == NEVER;
     }
@@ -279,6 +283,10 @@
       this.targetHolder = targetHolder;
     }
 
+    public boolean isAlways() {
+      return constraint.isAlways();
+    }
+
     public boolean isNever() {
       return constraint.isNever();
     }
@@ -358,7 +366,7 @@
         return meet(other, one, appView);
       }
       // From now on, one.constraint.ordinal() <= other.constraint.ordinal()
-      if (one == NEVER) {
+      if (one.isNever()) {
         return NEVER;
       }
       if (other == ALWAYS) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index 8d5d425..aa03ea2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -9,15 +9,16 @@
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexClassAndMember;
 import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.FieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult.SingleFieldResolutionResult;
 import com.android.tools.r8.graph.MethodResolutionResult;
+import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.lens.GraphLens;
 import com.android.tools.r8.ir.code.InvokeType;
@@ -181,8 +182,7 @@
         singleTargetWhileVerticalClassMerging(
             resolutionResult, context, MethodResolutionResult::lookupInvokeDirectTarget);
     if (target != null) {
-      return forResolvedMember(
-          resolutionResult.getInitialResolutionHolder(), context, target.getDefinition());
+      return forResolvedMember(resolutionResult.getInitialResolutionHolder(), context, target);
     }
     return ConstraintWithTarget.NEVER;
   }
@@ -224,8 +224,7 @@
       }
     }
     if (target != null) {
-      return forResolvedMember(
-          resolutionResult.getInitialResolutionHolder(), context, target.getDefinition());
+      return forResolvedMember(resolutionResult.getInitialResolutionHolder(), context, target);
     }
     return ConstraintWithTarget.NEVER;
   }
@@ -360,14 +359,15 @@
 
   private ConstraintWithTarget forFieldInstruction(DexField field, ProgramMethod context) {
     DexField lookup = graphLens.lookupField(field);
-    FieldResolutionResult fieldResolutionResult = appView.appInfo().resolveField(lookup);
-    if (fieldResolutionResult.isMultiFieldResolutionResult()) {
+    SingleFieldResolutionResult<?> fieldResolutionResult =
+        appView.appInfo().resolveField(lookup).asSingleFieldResolutionResult();
+    if (fieldResolutionResult == null) {
       return ConstraintWithTarget.NEVER;
     }
     return forResolvedMember(
         fieldResolutionResult.getInitialResolutionHolder(),
         context,
-        fieldResolutionResult.getResolvedField());
+        fieldResolutionResult.getResolutionPair());
   }
 
   private ConstraintWithTarget forVirtualInvoke(
@@ -378,21 +378,22 @@
 
     // Perform resolution and derive inlining constraints based on the accessibility of the
     // resolution result.
-    MethodResolutionResult resolutionResult =
-        appView.appInfo().resolveMethodLegacy(method, isInterface);
-    if (!resolutionResult.isVirtualTarget()) {
+    SingleResolutionResult<?> resolutionResult =
+        appView.appInfo().resolveMethodLegacy(method, isInterface).asSingleResolution();
+    if (resolutionResult == null || !resolutionResult.isVirtualTarget()) {
       return ConstraintWithTarget.NEVER;
     }
-
     return forResolvedMember(
-        resolutionResult.getInitialResolutionHolder(), context, resolutionResult.getSingleTarget());
+        resolutionResult.getInitialResolutionHolder(),
+        context,
+        resolutionResult.getResolutionPair());
   }
 
   @SuppressWarnings("ReferenceEquality")
   private ConstraintWithTarget forResolvedMember(
       DexClass initialResolutionHolder,
       ProgramMethod context,
-      DexEncodedMember<?, ?> resolvedMember) {
+      DexClassAndMember<?, ?> resolvedMember) {
     if (resolvedMember == null) {
       // This will fail at runtime.
       return ConstraintWithTarget.NEVER;
@@ -401,11 +402,11 @@
         FeatureSplitBoundaryOptimizationUtils.getInliningConstraintForResolvedMember(
             context, resolvedMember, appView);
     assert featureSplitInliningConstraint == ConstraintWithTarget.ALWAYS
-        || featureSplitInliningConstraint == ConstraintWithTarget.NEVER;
-    if (featureSplitInliningConstraint == ConstraintWithTarget.NEVER) {
+        || featureSplitInliningConstraint.isNever();
+    if (featureSplitInliningConstraint.isNever()) {
       return featureSplitInliningConstraint;
     }
-    DexType resolvedHolder = graphLens.lookupType(resolvedMember.getHolderType());
+    DexType resolvedHolder = resolvedMember.getHolderType();
     assert initialResolutionHolder != null;
     ConstraintWithTarget memberConstraintWithTarget =
         ConstraintWithTarget.deriveConstraint(
@@ -413,7 +414,10 @@
     // We also have to take the constraint of the initial resolution holder into account.
     ConstraintWithTarget classConstraintWithTarget =
         ConstraintWithTarget.deriveConstraint(
-            context, initialResolutionHolder.type, initialResolutionHolder.accessFlags, appView);
+            context,
+            initialResolutionHolder.getType(),
+            initialResolutionHolder.getAccessFlags(),
+            appView);
     return ConstraintWithTarget.meet(
         classConstraintWithTarget, memberConstraintWithTarget, appView);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
index 360d241..7ed32343 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
@@ -191,7 +191,7 @@
     // Make sure the target (base) type is visible.
     ConstraintWithTarget constraints =
         ConstraintWithTarget.classIsVisible(context, baseType, appView);
-    if (constraints == ConstraintWithTarget.NEVER) {
+    if (constraints.isNever()) {
       return;
     }
 
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index 388638c..b608f37 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -462,8 +462,7 @@
             context, holderType, method.getAccessFlags(), appView);
     // We may need bridge for visibility if the target class is not visible while the target method
     // is visible from the calling context.
-    return classVisibility == ConstraintWithTarget.NEVER
-        && methodVisibility != ConstraintWithTarget.NEVER;
+    return classVisibility.isNever() && !methodVisibility.isNever();
   }
 
   private DexMethod insertBridgeForVisibilityIfNeeded(
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java b/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java
index 4a5ffd6..aa6c1f1 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexInfo.java
@@ -202,11 +202,11 @@
   public boolean disallowInliningIntoContext(
       AppView<? extends AppInfoWithClassHierarchy> appView,
       ProgramDefinition context,
-      ProgramMethod method,
-      SyntheticItems synthetics) {
+      ProgramMethod method) {
     if (context.getContextType() == method.getContextType()) {
       return false;
     }
+    SyntheticItems synthetics = appView.getSyntheticItems();
     MainDexGroup mainDexGroupInternal = getMainDexGroupInternal(context, synthetics);
     if (mainDexGroupInternal == MainDexGroup.NOT_IN_MAIN_DEX
         || mainDexGroupInternal == MainDexGroup.MAIN_DEX_DEPENDENCY) {
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java
index 0ffde6c..a9132b3 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java
@@ -823,16 +823,13 @@
         SingleTypeMapperGraphLens lens =
             new SingleTypeMapperGraphLens(
                 appView, lensBuilder, mergedClasses, method.getHolder(), context);
-        ConstraintWithTarget constraint =
-            cfCode.computeInliningConstraint(
-                method, appView, lens, context.programInstanceInitializers().iterator().next());
+        ConstraintWithTarget constraint = cfCode.computeInliningConstraint(appView, lens, method);
         if (constraint.isNever()) {
           return true;
         }
         // Constructors can have references beyond the root main dex classes. This can increase the
         // size of the main dex dependent classes and we should bail out.
-        if (mainDexInfo.disallowInliningIntoContext(
-            appView, context, method, appView.getSyntheticItems())) {
+        if (mainDexInfo.disallowInliningIntoContext(appView, context, method)) {
           return true;
         }
         return false;