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;