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 fd3ec8c..f9dc4e2 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;
@@ -897,19 +896,13 @@
       ProgramMethod method,
       IRCode code,
       Map<? extends InvokeMethod, InliningInfo> invokesToInline,
+      OptimizationFeedback feedback,
       InliningIRProvider inliningIRProvider,
       MethodProcessor methodProcessor,
       Timing timing) {
     ForcedInliningOracle oracle = new ForcedInliningOracle(appView, 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 08ff606..b192f8a 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
@@ -209,7 +209,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 7935419..9456799 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
@@ -63,6 +63,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;
@@ -361,13 +362,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);
@@ -379,13 +384,20 @@
 
   @SuppressWarnings("ReferenceEquality")
   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
@@ -432,7 +444,13 @@
         }
         if (!directMethodCalls.isEmpty()) {
           inliner.performForcedInlining(
-              method, code, directMethodCalls, inliningIRProvider, methodProcessor, Timing.empty());
+              method,
+              code,
+              directMethodCalls,
+              feedback,
+              inliningIRProvider,
+              methodProcessor,
+              Timing.empty());
         }
       } while (!directMethodCalls.isEmpty());
     }
@@ -442,7 +460,8 @@
 
   @SuppressWarnings("ReferenceEquality")
   private boolean forceInlineIndirectMethodInvocations(
-      IRCode code, InliningIRProvider inliningIRProvider) throws IllegalClassInlinerStateException {
+      IRCode code, OptimizationFeedback feedback, InliningIRProvider inliningIRProvider)
+      throws IllegalClassInlinerStateException {
     if (indirectMethodCallsOnInstance.isEmpty()) {
       return false;
     }
@@ -513,7 +532,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())