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 0d20bc3..11cf90a 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
@@ -52,7 +52,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;
@@ -846,19 +845,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 7607596..2d61e60 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
@@ -212,7 +212,8 @@
AssumeRemover assumeRemover = new AssumeRemover(appView, code, affectedValues);
try {
anyInlinedMethods |=
- processor.processInlining(code, affectedValues, assumeRemover, inliningIRProvider);
+ processor.processInlining(
+ code, affectedValues, assumeRemover, 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 355d9b9..903cb1c 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;
@@ -380,13 +381,15 @@
IRCode code,
Set<Value> affectedValues,
AssumeRemover assumeRemover,
+ 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);
@@ -397,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
@@ -452,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());
}
@@ -461,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;
}
@@ -507,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())