Forward OptimizationFeedbackDelayed to class inliner
Fixes: b/317266145
Change-Id: I6fb94eaf5fbbe1399224af7e03029ab74adaeb18
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 95f43b9..ad28f74 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
@@ -51,7 +51,6 @@
import com.android.tools.r8.ir.conversion.PostMethodProcessor;
import com.android.tools.r8.ir.optimize.SimpleDominatingEffectAnalysis.SimpleEffectAnalysisResult;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
-import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
import com.android.tools.r8.ir.optimize.inliner.DefaultInliningReasonStrategy;
import com.android.tools.r8.ir.optimize.inliner.InliningIRProvider;
import com.android.tools.r8.ir.optimize.inliner.InliningReasonStrategy;
@@ -844,19 +843,13 @@
ProgramMethod method,
IRCode code,
Map<? extends InvokeMethod, InliningInfo> invokesToInline,
+ OptimizationFeedback feedback,
InliningIRProvider inliningIRProvider,
MethodProcessor methodProcessor,
Timing timing) {
ForcedInliningOracle oracle = new ForcedInliningOracle(appView, method, invokesToInline);
performInliningImpl(
- oracle,
- oracle,
- method,
- code,
- OptimizationFeedbackIgnore.getInstance(),
- inliningIRProvider,
- methodProcessor,
- timing);
+ oracle, oracle, method, code, feedback, inliningIRProvider, methodProcessor, timing);
}
public void performInlining(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
index 112697a..03f70c6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
@@ -206,7 +206,8 @@
// Inline the class instance.
AffectedValues affectedValues = new AffectedValues();
try {
- anyInlinedMethods |= processor.processInlining(code, affectedValues, inliningIRProvider);
+ anyInlinedMethods |=
+ processor.processInlining(code, affectedValues, feedback, inliningIRProvider);
} catch (IllegalClassInlinerStateException e) {
// We introduced a user that we cannot handle in the class inliner as a result of force
// inlining. Abort gracefully from class inlining without removing the instance.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 7cd562a..5818642 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -62,6 +62,7 @@
import com.android.tools.r8.ir.optimize.classinliner.constraint.ClassInlinerMethodConstraint;
import com.android.tools.r8.ir.optimize.info.FieldOptimizationInfo;
import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
import com.android.tools.r8.ir.optimize.inliner.InliningIRProvider;
import com.android.tools.r8.ir.optimize.inliner.NopWhyAreYouNotInliningReporter;
@@ -378,13 +379,17 @@
//
// Returns `true` if at least one method was inlined.
boolean processInlining(
- IRCode code, AffectedValues affectedValues, InliningIRProvider inliningIRProvider)
+ IRCode code,
+ AffectedValues affectedValues,
+ OptimizationFeedback feedback,
+ InliningIRProvider inliningIRProvider)
throws IllegalClassInlinerStateException {
// Verify that `eligibleInstance` is not aliased.
assert eligibleInstance == eligibleInstance.getAliasedValue();
- boolean anyInlinedMethods = forceInlineDirectMethodInvocations(code, inliningIRProvider);
- anyInlinedMethods |= forceInlineIndirectMethodInvocations(code, inliningIRProvider);
+ boolean anyInlinedMethods =
+ forceInlineDirectMethodInvocations(code, feedback, inliningIRProvider);
+ anyInlinedMethods |= forceInlineIndirectMethodInvocations(code, feedback, inliningIRProvider);
rebindIndirectEligibleInstanceUsersFromPhis();
removeMiscUsages(code, affectedValues);
@@ -395,13 +400,20 @@
}
private boolean forceInlineDirectMethodInvocations(
- IRCode code, InliningIRProvider inliningIRProvider) throws IllegalClassInlinerStateException {
+ IRCode code, OptimizationFeedback feedback, InliningIRProvider inliningIRProvider)
+ throws IllegalClassInlinerStateException {
if (directMethodCalls.isEmpty()) {
return false;
}
inliner.performForcedInlining(
- method, code, directMethodCalls, inliningIRProvider, methodProcessor, Timing.empty());
+ method,
+ code,
+ directMethodCalls,
+ feedback,
+ inliningIRProvider,
+ methodProcessor,
+ Timing.empty());
// In case we are class inlining an object allocation that does not inherit directly from
// java.lang.Object, we need keep force inlining the constructor until we reach
@@ -450,7 +462,13 @@
}
if (!directMethodCalls.isEmpty()) {
inliner.performForcedInlining(
- method, code, directMethodCalls, inliningIRProvider, methodProcessor, Timing.empty());
+ method,
+ code,
+ directMethodCalls,
+ feedback,
+ inliningIRProvider,
+ methodProcessor,
+ Timing.empty());
}
} while (!directMethodCalls.isEmpty());
}
@@ -459,7 +477,8 @@
}
private boolean forceInlineIndirectMethodInvocations(
- IRCode code, InliningIRProvider inliningIRProvider) throws IllegalClassInlinerStateException {
+ IRCode code, OptimizationFeedback feedback, InliningIRProvider inliningIRProvider)
+ throws IllegalClassInlinerStateException {
if (indirectMethodCallsOnInstance.isEmpty()) {
return false;
}
@@ -505,7 +524,13 @@
if (!methodCallsOnInstance.isEmpty()) {
inliner.performForcedInlining(
- method, code, methodCallsOnInstance, inliningIRProvider, methodProcessor, Timing.empty());
+ method,
+ code,
+ methodCallsOnInstance,
+ feedback,
+ inliningIRProvider,
+ methodProcessor,
+ Timing.empty());
} else {
assert indirectMethodCallsOnInstance.stream()
.filter(method -> method.getDefinition().getOptimizationInfo().mayHaveSideEffects())