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!");
}
}