Revert "Minor cleanup of inlining constraints from cf code"

This reverts commit b29bff7249a99b0998ac7379d120a11f5269e84b.

Reason for revert: Bot failures

Change-Id: I8da9979d6448cbcc174205fdae74179936e3b0d4
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 542c1ab..ead08b8 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.DexClassAndMember;
+import com.android.tools.r8.graph.DexEncodedMember;
 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,
-      DexClassAndMember<?, ?> resolvedMember,
+      DexEncodedMember<?, ?> 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 77398b6..e730dee 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -850,27 +850,40 @@
 
   @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();
     }
-    ConstraintWithTarget constraint = ConstraintWithTarget.ALWAYS;
-    assert inliningConstraints.forMonitor().isAlways();
+    // Model a synchronized method as having a monitor instruction.
+    ConstraintWithTarget constraint =
+        method.getDefinition().isSynchronized()
+            ? inliningConstraints.forMonitor()
+            : ConstraintWithTarget.ALWAYS;
+
+    if (constraint == ConstraintWithTarget.NEVER) {
+      return constraint;
+    }
     for (CfInstruction insn : instructions) {
       constraint =
           ConstraintWithTarget.meet(
               constraint, insn.inliningConstraint(inliningConstraints, this, context), appView);
-      if (constraint.isNever()) {
+      if (constraint == ConstraintWithTarget.NEVER) {
         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 872bf09..361fdeb 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(appView, appView.graphLens(), method);
-      return constraint.isNever();
+          cfCode.computeInliningConstraint(method, appView, appView.graphLens(), method);
+      return constraint == ConstraintWithTarget.NEVER;
     } 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 603bcc6..3117467 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,11 +184,13 @@
 
     // 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)) {
+    if (mainDexInfo.disallowInliningIntoContext(
+        appView, method, singleTarget, appView.getSyntheticItems())) {
       whyAreYouNotInliningReporter.reportInlineeRefersToClassesNotInMainDex();
       return false;
     }
-    assert !mainDexInfo.disallowInliningIntoContext(appView, method, singleTarget);
+    assert !mainDexInfo.disallowInliningIntoContext(
+        appView, method, singleTarget, appView.getSyntheticItems());
     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 9f25637..fd3ec8c 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.isNever() && instruction.isDebugInstruction()) {
+    if (result == ConstraintWithTarget.NEVER && instruction.isDebugInstruction()) {
       return ConstraintWithTarget.ALWAYS;
     }
     return result;
@@ -155,7 +155,7 @@
     for (Instruction instruction : code.instructions()) {
       ConstraintWithTarget state =
           instructionAllowedForInlining(instruction, inliningConstraints, context);
-      if (state.isNever()) {
+      if (state == ConstraintWithTarget.NEVER) {
         result = state;
         break;
       }
@@ -232,10 +232,6 @@
       return otherConstraint;
     }
 
-    public boolean isAlways() {
-      return this == ALWAYS;
-    }
-
     public boolean isNever() {
       return this == NEVER;
     }
@@ -283,10 +279,6 @@
       this.targetHolder = targetHolder;
     }
 
-    public boolean isAlways() {
-      return constraint.isAlways();
-    }
-
     public boolean isNever() {
       return constraint.isNever();
     }
@@ -366,7 +358,7 @@
         return meet(other, one, appView);
       }
       // From now on, one.constraint.ordinal() <= other.constraint.ordinal()
-      if (one.isNever()) {
+      if (one == NEVER) {
         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 aa03ea2..8d5d425 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,16 +9,15 @@
 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.SingleFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult;
 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;
@@ -182,7 +181,8 @@
         singleTargetWhileVerticalClassMerging(
             resolutionResult, context, MethodResolutionResult::lookupInvokeDirectTarget);
     if (target != null) {
-      return forResolvedMember(resolutionResult.getInitialResolutionHolder(), context, target);
+      return forResolvedMember(
+          resolutionResult.getInitialResolutionHolder(), context, target.getDefinition());
     }
     return ConstraintWithTarget.NEVER;
   }
@@ -224,7 +224,8 @@
       }
     }
     if (target != null) {
-      return forResolvedMember(resolutionResult.getInitialResolutionHolder(), context, target);
+      return forResolvedMember(
+          resolutionResult.getInitialResolutionHolder(), context, target.getDefinition());
     }
     return ConstraintWithTarget.NEVER;
   }
@@ -359,15 +360,14 @@
 
   private ConstraintWithTarget forFieldInstruction(DexField field, ProgramMethod context) {
     DexField lookup = graphLens.lookupField(field);
-    SingleFieldResolutionResult<?> fieldResolutionResult =
-        appView.appInfo().resolveField(lookup).asSingleFieldResolutionResult();
-    if (fieldResolutionResult == null) {
+    FieldResolutionResult fieldResolutionResult = appView.appInfo().resolveField(lookup);
+    if (fieldResolutionResult.isMultiFieldResolutionResult()) {
       return ConstraintWithTarget.NEVER;
     }
     return forResolvedMember(
         fieldResolutionResult.getInitialResolutionHolder(),
         context,
-        fieldResolutionResult.getResolutionPair());
+        fieldResolutionResult.getResolvedField());
   }
 
   private ConstraintWithTarget forVirtualInvoke(
@@ -378,22 +378,21 @@
 
     // Perform resolution and derive inlining constraints based on the accessibility of the
     // resolution result.
-    SingleResolutionResult<?> resolutionResult =
-        appView.appInfo().resolveMethodLegacy(method, isInterface).asSingleResolution();
-    if (resolutionResult == null || !resolutionResult.isVirtualTarget()) {
+    MethodResolutionResult resolutionResult =
+        appView.appInfo().resolveMethodLegacy(method, isInterface);
+    if (!resolutionResult.isVirtualTarget()) {
       return ConstraintWithTarget.NEVER;
     }
+
     return forResolvedMember(
-        resolutionResult.getInitialResolutionHolder(),
-        context,
-        resolutionResult.getResolutionPair());
+        resolutionResult.getInitialResolutionHolder(), context, resolutionResult.getSingleTarget());
   }
 
   @SuppressWarnings("ReferenceEquality")
   private ConstraintWithTarget forResolvedMember(
       DexClass initialResolutionHolder,
       ProgramMethod context,
-      DexClassAndMember<?, ?> resolvedMember) {
+      DexEncodedMember<?, ?> resolvedMember) {
     if (resolvedMember == null) {
       // This will fail at runtime.
       return ConstraintWithTarget.NEVER;
@@ -402,11 +401,11 @@
         FeatureSplitBoundaryOptimizationUtils.getInliningConstraintForResolvedMember(
             context, resolvedMember, appView);
     assert featureSplitInliningConstraint == ConstraintWithTarget.ALWAYS
-        || featureSplitInliningConstraint.isNever();
-    if (featureSplitInliningConstraint.isNever()) {
+        || featureSplitInliningConstraint == ConstraintWithTarget.NEVER;
+    if (featureSplitInliningConstraint == ConstraintWithTarget.NEVER) {
       return featureSplitInliningConstraint;
     }
-    DexType resolvedHolder = resolvedMember.getHolderType();
+    DexType resolvedHolder = graphLens.lookupType(resolvedMember.getHolderType());
     assert initialResolutionHolder != null;
     ConstraintWithTarget memberConstraintWithTarget =
         ConstraintWithTarget.deriveConstraint(
@@ -414,10 +413,7 @@
     // We also have to take the constraint of the initial resolution holder into account.
     ConstraintWithTarget classConstraintWithTarget =
         ConstraintWithTarget.deriveConstraint(
-            context,
-            initialResolutionHolder.getType(),
-            initialResolutionHolder.getAccessFlags(),
-            appView);
+            context, initialResolutionHolder.type, initialResolutionHolder.accessFlags, 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 7ed32343..360d241 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.isNever()) {
+    if (constraints == ConstraintWithTarget.NEVER) {
       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 b608f37..388638c 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -462,7 +462,8 @@
             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.isNever() && !methodVisibility.isNever();
+    return classVisibility == ConstraintWithTarget.NEVER
+        && methodVisibility != ConstraintWithTarget.NEVER;
   }
 
   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 aa6c1f1..4a5ffd6 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) {
+      ProgramMethod method,
+      SyntheticItems synthetics) {
     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 a9132b3..0ffde6c 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMerger.java
@@ -823,13 +823,16 @@
         SingleTypeMapperGraphLens lens =
             new SingleTypeMapperGraphLens(
                 appView, lensBuilder, mergedClasses, method.getHolder(), context);
-        ConstraintWithTarget constraint = cfCode.computeInliningConstraint(appView, lens, method);
+        ConstraintWithTarget constraint =
+            cfCode.computeInliningConstraint(
+                method, appView, lens, context.programInstanceInitializers().iterator().next());
         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)) {
+        if (mainDexInfo.disallowInliningIntoContext(
+            appView, context, method, appView.getSyntheticItems())) {
           return true;
         }
         return false;