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;