Include vertical class merging bridges in profiles

Bug: b/265729283
Change-Id: I6146392735150a97fe8b14fa63f0be1abdcf5726
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileAdditions.java b/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileAdditions.java
index a9d01b4..b4e5881 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileAdditions.java
@@ -22,7 +22,7 @@
 import java.util.function.Consumer;
 
 /** Mutable extension of an existing ArtProfile. */
-class ArtProfileAdditions {
+public class ArtProfileAdditions {
 
   public interface ArtProfileAdditionsBuilder {
 
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileCollectionAdditions.java b/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileCollectionAdditions.java
index f4ea621..ebc3584 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileCollectionAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileCollectionAdditions.java
@@ -5,7 +5,10 @@
 package com.android.tools.r8.profile.art.rewriting;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.profile.art.ArtProfileCollection;
+import com.android.tools.r8.profile.art.rewriting.ArtProfileAdditions.ArtProfileAdditionsBuilder;
+import java.util.function.Consumer;
 
 /**
  * Interface for adding (synthetic) items to an existing ArtProfileCollection.
@@ -30,9 +33,12 @@
     return NopArtProfileCollectionAdditions.getInstance();
   }
 
+  public abstract void applyIfContextIsInProfile(
+      DexMethod context, Consumer<ArtProfileAdditionsBuilder> builderConsumer);
+
   public abstract void commit(AppView<?> appView);
 
-  boolean isNop() {
+  public boolean isNop() {
     return false;
   }
 
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ConcreteArtProfileCollectionAdditions.java b/src/main/java/com/android/tools/r8/profile/art/rewriting/ConcreteArtProfileCollectionAdditions.java
index a1e0e52..4868638 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ConcreteArtProfileCollectionAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/art/rewriting/ConcreteArtProfileCollectionAdditions.java
@@ -32,7 +32,8 @@
     applyIfContextIsInProfile(context.getReference(), builderConsumer);
   }
 
-  void applyIfContextIsInProfile(
+  @Override
+  public void applyIfContextIsInProfile(
       DexMethod context, Consumer<ArtProfileAdditionsBuilder> builderConsumer) {
     for (ArtProfileAdditions artProfileAdditions : additionsCollection) {
       artProfileAdditions.applyIfContextIsInProfile(context, builderConsumer);
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/NopArtProfileCollectionAdditions.java b/src/main/java/com/android/tools/r8/profile/art/rewriting/NopArtProfileCollectionAdditions.java
index c26a098..8d73389 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/NopArtProfileCollectionAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/art/rewriting/NopArtProfileCollectionAdditions.java
@@ -5,6 +5,9 @@
 package com.android.tools.r8.profile.art.rewriting;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.profile.art.rewriting.ArtProfileAdditions.ArtProfileAdditionsBuilder;
+import java.util.function.Consumer;
 
 public class NopArtProfileCollectionAdditions extends ArtProfileCollectionAdditions {
 
@@ -18,12 +21,18 @@
   }
 
   @Override
+  public void applyIfContextIsInProfile(
+      DexMethod context, Consumer<ArtProfileAdditionsBuilder> builderConsumer) {
+    // Intentionally empty.
+  }
+
+  @Override
   public void commit(AppView<?> appView) {
     // Intentionally empty.
   }
 
   @Override
-  boolean isNop() {
+  public boolean isNop() {
     return true;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 4819d4d..da2b320 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -74,6 +74,7 @@
 import com.android.tools.r8.ir.synthetic.AbstractSynthesizedCode;
 import com.android.tools.r8.ir.synthetic.ForwardMethodSourceCode;
 import com.android.tools.r8.logging.Log;
+import com.android.tools.r8.profile.art.rewriting.ArtProfileCollectionAdditions;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.CollectionUtils;
 import com.android.tools.r8.utils.FieldSignatureEquivalence;
@@ -732,6 +733,18 @@
     assert lens != null;
     assert verifyGraphLens(lens);
 
+    // Include bridges in art profiles.
+    ArtProfileCollectionAdditions artProfileCollectionAdditions =
+        ArtProfileCollectionAdditions.create(appView);
+    if (!artProfileCollectionAdditions.isNop()) {
+      for (SynthesizedBridgeCode synthesizedBridge : synthesizedBridges) {
+        artProfileCollectionAdditions.applyIfContextIsInProfile(
+            synthesizedBridge.originalMethod,
+            additionsBuilder -> additionsBuilder.addRule(synthesizedBridge.method));
+      }
+    }
+    artProfileCollectionAdditions.commit(appView);
+
     // Rewrite collections using the lens.
     appView.rewriteWithLens(lens);
 
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/VerticalClassMergingBridgeProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/VerticalClassMergingBridgeProfileRewritingTest.java
index 135a501..f7306e7 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/VerticalClassMergingBridgeProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/VerticalClassMergingBridgeProfileRewritingTest.java
@@ -43,7 +43,7 @@
         .addArtProfileForRewriting(getArtProfile())
         .addOptionsModification(InlinerOptions::setOnlyForceInlining)
         .addOptionsModification(
-            options -> options.callSiteOptimizationOptions().setEnableMethodStaticizing(false))
+            options -> options.callSiteOptimizationOptions().disableOptimization())
         .addVerticallyMergedClassesInspector(
             inspector -> inspector.assertMergedIntoSubtype(A.class))
         .setMinApi(parameters.getApiLevel())
@@ -55,7 +55,7 @@
 
   private ExternalArtProfile getArtProfile() throws Exception {
     return ExternalArtProfile.builder()
-        .addMethodRule(Reference.methodFromMethod(A.class.getDeclaredMethod("m")))
+        .addMethodRule(Reference.methodFromMethod(A.class.getDeclaredMethod("m", A.class)))
         .build();
   }
 
@@ -71,20 +71,21 @@
         bClassSubject.uniqueMethodThatMatches(FoundMethodSubject::isVirtual);
     assertThat(syntheticBridgeMethodSubject, isPresent());
 
-    // TODO(b/265729283): Should also contain the synthetic bridge method above.
-    profileInspector.assertContainsMethodRule(movedMethodSubject).assertContainsNoOtherRules();
+    profileInspector
+        .assertContainsMethodRules(movedMethodSubject, syntheticBridgeMethodSubject)
+        .assertContainsNoOtherRules();
   }
 
   static class Main {
 
     public static void main(String[] args) {
-      new B().m();
+      new B().m(null);
     }
   }
 
   static class A {
 
-    public void m() {
+    public void m(A a) {
       System.out.println("Hello, world!");
     }
   }