Split ThrowBlockOutlineMarkerRewriter#processMethod in two
This splits the processMethod() in two, so that there is one method for processing outline methods and one method for processing non-outline methods with outline markers.
Change-Id: Id15aedf175bca46cd384776d043467d5389f6a5f
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlineMarkerRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlineMarkerRewriter.java
index e6389ee..a6eb027 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlineMarkerRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlineMarkerRewriter.java
@@ -46,30 +46,22 @@
this.deadCodeRemover = new DeadCodeRemover(appView);
}
- public void processMethod(ProgramMethod method, ThrowBlockOutline outline) {
- assert method.getDefinition().hasCode();
- assert method.getDefinition().getCode().isLirCode();
- // Build IR.
- LirCode<Integer> lirCode = method.getDefinition().getCode().asLirCode();
- IRCode code = buildIR(lirCode, method, outline);
- assert code.getConversionOptions().isGeneratingDex();
-
- // Process IR.
- if (outline != null) {
- removeConstantArgumentsFromOutline(method, code, outline);
- } else {
- processOutlineMarkers(code);
- }
-
- // Convert to DEX.
- IRFinalizer<?> finalizer = code.getConversionOptions().getFinalizer(deadCodeRemover, appView);
- Code dexCode = finalizer.finalizeCode(code, BytecodeMetadataProvider.empty(), Timing.empty());
- method.setCode(dexCode, appView);
+ public void processOutlineMethod(
+ ProgramMethod method, LirCode<Integer> lirCode, ThrowBlockOutline outline) {
+ IRCode code = buildIRForOutlineMethod(lirCode, method, outline);
+ removeConstantArgumentsFromOutline(method, code, outline);
+ finalizeCode(method, code);
}
- private IRCode buildIR(
+ public void processMethodWithOutlineMarkers(ProgramMethod method, LirCode<Integer> lirCode) {
+ IRCode code = lirCode.buildIR(method, appView);
+ processOutlineMarkers(code);
+ finalizeCode(method, code);
+ }
+
+ private IRCode buildIRForOutlineMethod(
LirCode<Integer> lirCode, ProgramMethod method, ThrowBlockOutline outline) {
- if (outline == null || !outline.hasConstantArgument()) {
+ if (!outline.hasConstantArgument()) {
return lirCode.buildIR(method, appView);
}
// We need to inform IR construction to insert the arguments that have been removed from the
@@ -85,6 +77,14 @@
MethodConversionOptions.forD8(appView, method));
}
+ private void finalizeCode(ProgramMethod method, IRCode code) {
+ // Convert to DEX.
+ assert code.getConversionOptions().isGeneratingDex();
+ IRFinalizer<?> finalizer = code.getConversionOptions().getFinalizer(deadCodeRemover, appView);
+ Code dexCode = finalizer.finalizeCode(code, BytecodeMetadataProvider.empty(), Timing.empty());
+ method.setCode(dexCode, appView);
+ }
+
private void removeConstantArgumentsFromOutline(
ProgramMethod method, IRCode code, ThrowBlockOutline outline) {
if (!outline.hasConstantArgument()) {
@@ -150,7 +150,7 @@
// Run the dead code remover to ensure code that has been moved into the outline is removed
// (e.g., constants, the allocation of the exception).
- new DeadCodeRemover(appView).run(code, Timing.empty());
+ deadCodeRemover.run(code, Timing.empty());
}
private Value addReturnValue(IRCode code, BasicBlockInstructionListIterator instructionIterator) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutliner.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutliner.java
index d10d0e4..df8ce36 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutliner.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.IRCode;
+import com.android.tools.r8.lightir.LirCode;
import com.android.tools.r8.lightir.LirConstant;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.ThreadUtils;
@@ -127,7 +128,16 @@
ThrowBlockOutlineMarkerRewriter rewriter = new ThrowBlockOutlineMarkerRewriter(appView);
ThreadUtils.processMap(
methodsToReprocess,
- rewriter::processMethod,
+ (method, outline) -> {
+ assert method.getDefinition().hasCode();
+ assert method.getDefinition().getCode().isLirCode();
+ LirCode<Integer> lirCode = method.getDefinition().getCode().asLirCode();
+ if (outline != null) {
+ rewriter.processOutlineMethod(method, lirCode, outline);
+ } else {
+ rewriter.processMethodWithOutlineMarkers(method, lirCode);
+ }
+ },
appView.options().getThreadingModule(),
executorService);
}