Flush optimization info after synthesizing methods and outlining.

Also assure that there are no more optimization info left at the end of
IR processing.

Bug: 141457484
Change-Id: I62336080baf07e7ef1ccce2c3af7a46dd25b1678
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 7989ddf..d068677 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -736,6 +736,9 @@
       builder.addSynthesizedClass(serviceLoaderRewriter.getSynthesizedClass(), true);
     }
 
+    // Update optimization info for all synthesized methods at once.
+    feedback.updateVisibleOptimizationInfo();
+
     if (outliner != null) {
       printPhase("Outlining");
       timing.begin("IR conversion phase 3");
@@ -756,6 +759,7 @@
               printMethod(code, "IR after outlining (SSA)", null);
               finalizeIR(method, code, OptimizationFeedbackIgnore.getInstance());
             });
+        feedback.updateVisibleOptimizationInfo();
         assert outliner.checkAllOutlineSitesFoundAgain();
         builder.addSynthesizedClass(outlineClass, true);
         clearDexMethodCompilationState(outlineClass);
@@ -790,6 +794,8 @@
       }
     }
 
+    assert feedback.noUpdatesLeft();
+
     // Check if what we've added to the application builder as synthesized classes are same as
     // what we've added and used through AppInfo.
     assert appView
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
index a994f5d..2a80ce4 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
 import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
 import com.android.tools.r8.utils.IteratorUtils;
+import com.android.tools.r8.utils.StringUtils;
 import java.util.BitSet;
 import java.util.IdentityHashMap;
 import java.util.Map;
@@ -82,6 +83,16 @@
     processed.clear();
   }
 
+  public boolean noUpdatesLeft() {
+    assert fieldOptimizationInfos.isEmpty()
+        : StringUtils.join(fieldOptimizationInfos.keySet(), ", ");
+    assert methodOptimizationInfos.isEmpty()
+        : StringUtils.join(methodOptimizationInfos.keySet(), ", ");
+    assert processed.isEmpty()
+        : StringUtils.join(processed.keySet(), ", ");
+    return true;
+  }
+
   // FIELD OPTIMIZATION INFO:
 
   @Override