Remove applyDoubleInlining flag
This replaces uses of the applyDoubleInlining flag by checking if we have a PostMethodProcessor.
This also restricts the DUAL_CALLER inlining reason to the primary and the secondary optimization pass, such that we do not end up DUAL_CALLER inlining outside these two optimization passes.
Change-Id: I4633e6581dabb343e770a93ea31d01818f155fbf
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
index e8770c7..8c71936 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
import com.android.tools.r8.ir.optimize.inliner.InliningReasonStrategy;
@@ -34,7 +35,10 @@
@Override
public Reason computeInliningReason(
- InvokeMethod invoke, ProgramMethod target, ProgramMethod context) {
+ InvokeMethod invoke,
+ ProgramMethod target,
+ ProgramMethod context,
+ MethodProcessor methodProcessor) {
if (references.isAbstractGeneratedMessageLiteBuilder(context.getHolder())
&& invoke.isInvokeSuper()) {
// Aggressively inline invoke-super calls inside the GeneratedMessageLite builders. Such
@@ -44,7 +48,7 @@
}
return references.isDynamicMethod(target) || references.isDynamicMethodBridge(target)
? computeInliningReasonForDynamicMethod(invoke, target, context)
- : parent.computeInliningReason(invoke, target, context);
+ : parent.computeInliningReason(invoke, target, context, methodProcessor);
}
private Reason computeInliningReasonForDynamicMethod(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
index 9857098..d0b0349 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessor.java
@@ -12,6 +12,10 @@
return false;
}
+ public boolean isPostMethodProcessor() {
+ return false;
+ }
+
public abstract MethodProcessingContext createMethodProcessingContext(ProgramMethod method);
public abstract boolean isProcessedConcurrently(ProgramMethod method);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
index a25e9dc..a54b717 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
@@ -50,6 +50,11 @@
}
@Override
+ public boolean isPostMethodProcessor() {
+ return true;
+ }
+
+ @Override
public boolean shouldApplyCodeRewritings(ProgramMethod method) {
assert !wave.contains(method);
return !processed.contains(method);
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 c3649fb..4a91c4c 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
@@ -179,20 +179,22 @@
}
if (reason == Reason.DUAL_CALLER) {
+ assert methodProcessor.isPrimaryMethodProcessor() || methodProcessor.isPostMethodProcessor();
if (satisfiesRequirementsForSimpleInlining(invoke, singleTarget)) {
// When we have a method with two call sites, we simply inline the method as we normally do
// when the method is small. We still need to ensure that the other call site is also
// inlined, though. Therefore, we record here that we have seen one of the two call sites
// as we normally do.
- inliner.recordDoubleInliningCandidate(method, singleTarget);
- } else if (inliner.isDoubleInliningEnabled()) {
- if (!inliner.satisfiesRequirementsForDoubleInlining(method, singleTarget)) {
+ inliner.recordDoubleInliningCandidate(method, singleTarget, methodProcessor);
+ } else if (inliner.isDoubleInliningEnabled(methodProcessor)) {
+ if (!inliner.satisfiesRequirementsForDoubleInlining(
+ method, singleTarget, methodProcessor)) {
whyAreYouNotInliningReporter.reportInvalidDoubleInliningCandidate();
return false;
}
} else {
// TODO(b/142300882): Should in principle disallow inlining in this case.
- inliner.recordDoubleInliningCandidate(method, singleTarget);
+ inliner.recordDoubleInliningCandidate(method, singleTarget, methodProcessor);
}
} else if (reason == Reason.SIMPLE
&& !satisfiesRequirementsForSimpleInlining(invoke, singleTarget)) {
@@ -279,7 +281,8 @@
return null;
}
- Reason reason = reasonStrategy.computeInliningReason(invoke, singleTarget, context);
+ Reason reason =
+ reasonStrategy.computeInliningReason(invoke, singleTarget, context, methodProcessor);
if (reason == Reason.NEVER) {
return null;
}
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 7591f78..605896f 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
@@ -87,7 +87,6 @@
final MainDexInfo mainDexInfo;
// State for inlining methods which are known to be called twice.
- private boolean applyDoubleInlining = false;
private LongLivedProgramMethodSetBuilder<ProgramMethodSet> doubleInlineCallers;
private final ProgramMethodSet doubleInlineSelectedTargets = ProgramMethodSet.create();
private final Map<DexEncodedMethod, ProgramMethod> doubleInlineeCandidates =
@@ -149,8 +148,8 @@
return false;
}
- boolean isDoubleInliningEnabled() {
- return applyDoubleInlining;
+ boolean isDoubleInliningEnabled(MethodProcessor methodProcessor) {
+ return methodProcessor.isPostMethodProcessor();
}
private ConstraintWithTarget instructionAllowedForInlining(
@@ -210,19 +209,20 @@
}
synchronized boolean satisfiesRequirementsForDoubleInlining(
- ProgramMethod method, ProgramMethod target) {
- if (applyDoubleInlining) {
+ ProgramMethod method, ProgramMethod target, MethodProcessor methodProcessor) {
+ if (isDoubleInliningEnabled(methodProcessor)) {
// Don't perform the actual inlining if this was not selected.
return doubleInlineSelectedTargets.contains(target);
}
// Just preparing for double inlining.
- recordDoubleInliningCandidate(method, target);
+ recordDoubleInliningCandidate(method, target, methodProcessor);
return false;
}
- synchronized void recordDoubleInliningCandidate(ProgramMethod method, ProgramMethod target) {
- if (applyDoubleInlining) {
+ synchronized void recordDoubleInliningCandidate(
+ ProgramMethod method, ProgramMethod target, MethodProcessor methodProcessor) {
+ if (isDoubleInliningEnabled(methodProcessor)) {
return;
}
@@ -252,7 +252,6 @@
// rewritten with a newer graph lens).
postMethodProcessorBuilder.getMethodsToReprocessBuilder().merge(doubleInlineCallers);
doubleInlineCallers = null;
- applyDoubleInlining = true;
}
/**
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/DefaultInliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/DefaultInliningReasonStrategy.java
index c6b0aa4..43b302b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/DefaultInliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/DefaultInliningReasonStrategy.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.conversion.CallSiteInformation;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
import com.android.tools.r8.ir.optimize.Inliner;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -31,7 +32,10 @@
@Override
public Reason computeInliningReason(
- InvokeMethod invoke, ProgramMethod target, ProgramMethod context) {
+ InvokeMethod invoke,
+ ProgramMethod target,
+ ProgramMethod context,
+ MethodProcessor methodProcessor) {
DexEncodedMethod targetMethod = target.getDefinition();
DexMethod targetReference = target.getReference();
if (targetMethod.getOptimizationInfo().forceInline()) {
@@ -52,7 +56,7 @@
if (isSingleCallerInliningTarget(target)) {
return Reason.SINGLE_CALLER;
}
- if (isDoubleInliningTarget(target)) {
+ if (isDoubleInliningTarget(target, methodProcessor)) {
return Reason.DUAL_CALLER;
}
return Reason.SIMPLE;
@@ -72,11 +76,13 @@
return true;
}
- private boolean isDoubleInliningTarget(ProgramMethod candidate) {
- // 10 is found from measuring.
- if (callSiteInformation.hasDoubleCallSite(candidate)
- || inliner.isDoubleInlineSelectedTarget(candidate)) {
- return candidate.getDefinition().getCode().estimatedSizeForInliningAtMost(10);
+ private boolean isDoubleInliningTarget(ProgramMethod candidate, MethodProcessor methodProcessor) {
+ if (methodProcessor.isPrimaryMethodProcessor() || methodProcessor.isPostMethodProcessor()) {
+ if (callSiteInformation.hasDoubleCallSite(candidate)
+ || inliner.isDoubleInlineSelectedTarget(candidate)) {
+ // 10 is found from measuring.
+ return candidate.getDefinition().getCode().estimatedSizeForInliningAtMost(10);
+ }
}
return false;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/FixedInliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/FixedInliningReasonStrategy.java
index ae23a74..aed242b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/FixedInliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/FixedInliningReasonStrategy.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
public class FixedInliningReasonStrategy implements InliningReasonStrategy {
@@ -18,7 +19,10 @@
@Override
public Reason computeInliningReason(
- InvokeMethod invoke, ProgramMethod target, ProgramMethod context) {
+ InvokeMethod invoke,
+ ProgramMethod target,
+ ProgramMethod context,
+ MethodProcessor methodProcessor) {
return reason;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningReasonStrategy.java
index f2ae52a..00ff53c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningReasonStrategy.java
@@ -6,9 +6,14 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
public interface InliningReasonStrategy {
- Reason computeInliningReason(InvokeMethod invoke, ProgramMethod target, ProgramMethod context);
+ Reason computeInliningReason(
+ InvokeMethod invoke,
+ ProgramMethod target,
+ ProgramMethod context,
+ MethodProcessor methodProcessor);
}