Extend profile rewriting to AssertionError rewriter
Bug: b/265729283
Change-Id: I136817014c7ae28c5959cc084b9108d798a620b7
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 64734f8..b008176 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
@@ -765,7 +765,8 @@
timing.end();
if (assertionErrorTwoArgsConstructorRewriter != null) {
timing.begin("Rewrite AssertionError");
- assertionErrorTwoArgsConstructorRewriter.rewrite(code, methodProcessingContext);
+ assertionErrorTwoArgsConstructorRewriter.rewrite(
+ code, methodProcessor, methodProcessingContext);
timing.end();
}
timing.begin("Run CSE");
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessorEventConsumer.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessorEventConsumer.java
index 16c6ce0..e360a95 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessorEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodProcessorEventConsumer.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.ir.optimize.AssertionErrorTwoArgsConstructorRewriterEventConsumer;
import com.android.tools.r8.ir.optimize.ServiceLoaderRewriterEventConsumer;
import com.android.tools.r8.ir.optimize.UtilityMethodsForCodeOptimizationsEventConsumer;
import com.android.tools.r8.ir.optimize.api.InstanceInitializerOutlinerEventConsumer;
@@ -16,7 +17,8 @@
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public abstract class MethodProcessorEventConsumer
- implements EnumUnboxerMethodProcessorEventConsumer,
+ implements AssertionErrorTwoArgsConstructorRewriterEventConsumer,
+ EnumUnboxerMethodProcessorEventConsumer,
InstanceInitializerOutlinerEventConsumer,
ServiceLoaderRewriterEventConsumer,
UtilityMethodsForCodeOptimizationsEventConsumer {
@@ -50,6 +52,11 @@
}
@Override
+ public void acceptAssertionErrorCreateMethod(ProgramMethod method, ProgramMethod context) {
+ // Intentionally empty.
+ }
+
+ @Override
public void acceptEnumUnboxerCheckNotZeroContext(ProgramMethod method, ProgramMethod context) {
// Intentionally empty.
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java
index 6d5083c..e464f9c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriter.java
@@ -21,6 +21,7 @@
import com.android.tools.r8.ir.code.InvokeStatic;
import com.android.tools.r8.ir.code.NewInstance;
import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
import com.android.tools.r8.ir.desugar.backports.BackportedMethods;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.utils.InternalOptions;
@@ -42,7 +43,10 @@
this.dexItemFactory = appView.dexItemFactory();
}
- public void rewrite(IRCode code, MethodProcessingContext methodProcessingContext) {
+ public void rewrite(
+ IRCode code,
+ MethodProcessor methodProcessor,
+ MethodProcessingContext methodProcessingContext) {
if (options.canUseAssertionErrorTwoArgumentConstructor()) {
return;
}
@@ -66,7 +70,8 @@
}
InvokeStatic invoke =
InvokeStatic.builder()
- .setMethod(createSynthetic(methodProcessingContext).getReference())
+ .setMethod(
+ createSynthetic(methodProcessor, methodProcessingContext).getReference())
.setFreshOutValue(
code, dexItemFactory.assertionErrorType.toTypeElement(appView))
.setPosition(current)
@@ -94,7 +99,8 @@
return synthesizedMethods;
}
- private ProgramMethod createSynthetic(MethodProcessingContext methodProcessingContext) {
+ private ProgramMethod createSynthetic(
+ MethodProcessor methodProcessor, MethodProcessingContext methodProcessingContext) {
DexItemFactory factory = appView.dexItemFactory();
DexProto proto =
factory.createProto(factory.assertionErrorType, factory.stringType, factory.throwableType);
@@ -126,6 +132,9 @@
.toTypeElement(appView, Nullability.definitelyNotNull())
.asClassType()));
}
+ methodProcessor
+ .getEventConsumer()
+ .acceptAssertionErrorCreateMethod(method, methodProcessingContext.getMethodContext());
return method;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriterEventConsumer.java b/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriterEventConsumer.java
new file mode 100644
index 0000000..8b15685
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssertionErrorTwoArgsConstructorRewriterEventConsumer.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.optimize;
+
+import com.android.tools.r8.graph.ProgramMethod;
+
+public interface AssertionErrorTwoArgsConstructorRewriterEventConsumer {
+
+ void acceptAssertionErrorCreateMethod(ProgramMethod method, ProgramMethod context);
+}
diff --git a/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileRewritingMethodProcessorEventConsumer.java b/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileRewritingMethodProcessorEventConsumer.java
index 4835091..8363e62 100644
--- a/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileRewritingMethodProcessorEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/art/rewriting/ArtProfileRewritingMethodProcessorEventConsumer.java
@@ -43,6 +43,12 @@
}
@Override
+ public void acceptAssertionErrorCreateMethod(ProgramMethod method, ProgramMethod context) {
+ additionsCollection.addMethodAndHolderIfContextIsInProfile(method, context);
+ parent.acceptAssertionErrorCreateMethod(method, context);
+ }
+
+ @Override
public void acceptEnumUnboxerCheckNotZeroContext(ProgramMethod method, ProgramMethod context) {
additionsCollection.applyIfContextIsInProfile(
context, additionsBuilder -> additionsBuilder.addRule(method));