Add method print logging to finalization steps
Change-Id: I261b1367f632e8724c4493197748556f8a441f96
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
index 5368a41..9ab29f3 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
@@ -146,7 +146,7 @@
this.bytecodeMetadataBuilder = BytecodeMetadata.builder(bytecodeMetadataProvider);
}
- public CfCode build(DeadCodeRemover deadCodeRemover, Timing timing) {
+ public CfCode build(DeadCodeRemover deadCodeRemover, Timing timing, String previousPrintString) {
timing.time("Trace blocks", code::traceBlocks);
timing.time("Compute Initializers", () -> computeInitializers());
timing.begin("Compute verification types");
@@ -159,6 +159,9 @@
LoadStoreHelper loadStoreHelper = new LoadStoreHelper(appView, code, typeVerificationHelper);
loadStoreHelper.insertLoadsAndStores();
timing.end();
+ previousPrintString =
+ IRConverter.printMethodIR(
+ code, "After load/store insertion", previousPrintString, appView.options());
// Run optimizations on phis and basic blocks in a fixpoint.
if (appView.options().enableLoadStoreOptimization) {
timing.begin("Load store optimizations (BasicBlockMunching)");
@@ -173,6 +176,9 @@
}
code.removeRedundantBlocks();
assert code.isConsistentGraph(appView, false);
+ previousPrintString =
+ IRConverter.printMethodIR(
+ code, "After load/store optimization", previousPrintString, appView.options());
// Insert reads for uninitialized read blocks to ensure correct stack maps.
timing.begin("Insert uninitialized local reads");
Set<UninitializedThisLocalRead> uninitializedThisLocalReads =
@@ -214,6 +220,7 @@
timing.begin("Remove redundant debug positions");
DexBuilder.removeRedundantDebugPositions(appView, code);
timing.end();
+ IRConverter.printMethodIR(code, "Before CF building", previousPrintString, appView.options());
timing.begin("Build CF Code");
CfCode code = buildCfCode();
timing.end();
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 1bcdd1f..ad479bd 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
@@ -563,7 +563,7 @@
if (methodConversionOptions.shouldFinalizeAfterLensCodeRewriter()) {
deadCodeRemover.run(code, timing);
timing.begin("Finalize IR");
- finalizeIR(code, feedback, BytecodeMetadataProvider.empty(), timing);
+ finalizeIR(code, feedback, BytecodeMetadataProvider.empty(), timing, previous);
timing.end();
return timing;
}
@@ -834,13 +834,9 @@
previous =
printMethod(code, "IR after computation of optimization info summary (SSA)", previous);
- printMethod(code, "Optimized IR (SSA)", previous);
+ previous = printMethod(code, "Optimized IR (SSA)", previous);
timing.begin("Finalize IR");
- finalizeIR(
- code,
- feedback,
- bytecodeMetadataProviderBuilder.build(),
- timing);
+ finalizeIR(code, feedback, bytecodeMetadataProviderBuilder.build(), timing, previous);
timing.end();
return timing;
}
@@ -950,24 +946,22 @@
}
code.removeRedundantBlocks();
deadCodeRemover.run(code, timing);
- finalizeIR(
- code,
- feedback,
- BytecodeMetadataProvider.empty(),
- timing);
+ finalizeIR(code, feedback, BytecodeMetadataProvider.empty(), timing, "");
}
public void finalizeIR(
IRCode code,
OptimizationFeedback feedback,
BytecodeMetadataProvider bytecodeMetadataProvider,
- Timing timing) {
+ Timing timing,
+ String printString) {
if (options.testing.roundtripThroughLir) {
code = roundtripThroughLir(code, bytecodeMetadataProvider, timing);
}
ProgramMethod method = code.context();
IRFinalizer<?> finalizer = code.getConversionOptions().getFinalizer(deadCodeRemover, appView);
- method.setCode(finalizer.finalizeCode(code, bytecodeMetadataProvider, timing), appView);
+ method.setCode(
+ finalizer.finalizeCode(code, bytecodeMetadataProvider, timing, printString), appView);
markProcessed(code, feedback);
printMethod(code.context(), "After finalization");
}
@@ -1035,6 +1029,11 @@
}
public String printMethod(IRCode code, String title, String previous) {
+ return printMethodIR(code, title, previous, options);
+ }
+
+ public static String printMethodIR(
+ IRCode code, String title, String previous, InternalOptions options) {
if (options.extensiveLoggingFilter.isEmpty()) {
return previous;
}
@@ -1057,6 +1056,10 @@
}
public void printMethod(ProgramMethod method, String title) {
+ printMethod(method, title, options);
+ }
+
+ public static void printMethod(ProgramMethod method, String title, InternalOptions options) {
if (options.extensiveLoggingFilter.size() > 0
&& options.extensiveLoggingFilter.contains(method.getReference().toSourceString())) {
String current = method.getDefinition().codeToString();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRFinalizer.java b/src/main/java/com/android/tools/r8/ir/conversion/IRFinalizer.java
index cc7fabb..e3e4d03 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRFinalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRFinalizer.java
@@ -18,6 +18,14 @@
this.appView = appView;
}
+ public C finalizeCode(
+ IRCode code, BytecodeMetadataProvider bytecodeMetadataProvider, Timing timing) {
+ return finalizeCode(code, bytecodeMetadataProvider, timing, "");
+ }
+
public abstract C finalizeCode(
- IRCode code, BytecodeMetadataProvider bytecodeMetadataProvider, Timing timing);
+ IRCode code,
+ BytecodeMetadataProvider bytecodeMetadataProvider,
+ Timing timing,
+ String previousPrintString);
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRToCfFinalizer.java b/src/main/java/com/android/tools/r8/ir/conversion/IRToCfFinalizer.java
index cdb1be7..7776812 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRToCfFinalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRToCfFinalizer.java
@@ -23,12 +23,15 @@
@Override
public CfCode finalizeCode(
- IRCode code, BytecodeMetadataProvider bytecodeMetadataProvider, Timing timing) {
+ IRCode code,
+ BytecodeMetadataProvider bytecodeMetadataProvider,
+ Timing timing,
+ String previousPrintString) {
ProgramMethod method = code.context();
timing.begin("Finalize CF code");
CfCode build =
new CfBuilder(appView, method, code, bytecodeMetadataProvider)
- .build(deadCodeRemover, timing);
+ .build(deadCodeRemover, timing, previousPrintString);
timing.end();
return build;
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java b/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
index 45be60d..205d2bc 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
@@ -35,7 +35,10 @@
@Override
public DexCode finalizeCode(
- IRCode code, BytecodeMetadataProvider bytecodeMetadataProvider, Timing timing) {
+ IRCode code,
+ BytecodeMetadataProvider bytecodeMetadataProvider,
+ Timing timing,
+ String previousPrintString) {
if (options.canUseNestBasedAccess()) {
D8NestBasedAccessDesugaring.checkAndFailOnIncompleteNests(appView);
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRToLirFinalizer.java b/src/main/java/com/android/tools/r8/ir/conversion/IRToLirFinalizer.java
index 899bc3a..7979df0 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRToLirFinalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRToLirFinalizer.java
@@ -20,7 +20,10 @@
@Override
public LirCode<Integer> finalizeCode(
- IRCode code, BytecodeMetadataProvider bytecodeMetadataProvider, Timing timing) {
+ IRCode code,
+ BytecodeMetadataProvider bytecodeMetadataProvider,
+ Timing timing,
+ String previousPrintString) {
timing.begin("Finalize LIR code");
LirCode<Integer> lirCode =
IR2LirConverter.translate(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
index 1f92cc0..dacdd2f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
@@ -181,9 +181,11 @@
if (!(code instanceof LirCode)) {
return;
}
+ IRConverter.printMethod(method, "LIR before output format", appView.options());
Timing onThreadTiming = Timing.empty();
IRCode irCode = method.buildIR(appView, MethodConversionOptions.forPostLirPhase(appView));
assert irCode.verifyInvokeInterface(appView);
+ String previous = IRConverter.printMethodIR(irCode, "IR from LIR", "", appView.options());
boolean changed = codeRewriterPassCollection.run(irCode, null, null, onThreadTiming);
if (appView.options().isGeneratingDex() && changed) {
ConstantCanonicalizer constantCanonicalizer =
@@ -196,10 +198,12 @@
// E.g., we may now have knowledge that an invoke does not have side effects.
// Thus, we re-run the dead-code remover now as it is assumed complete by CF/DEX finalization.
deadCodeRemover.run(irCode, onThreadTiming);
+ previous = IRConverter.printMethodIR(irCode, "IR before finalize", previous, appView.options());
MethodConversionOptions conversionOptions = irCode.getConversionOptions();
assert !conversionOptions.isGeneratingLir();
IRFinalizer<?> finalizer = conversionOptions.getFinalizer(deadCodeRemover, appView);
- method.setCode(finalizer.finalizeCode(irCode, noMetadata, onThreadTiming), appView);
+ method.setCode(finalizer.finalizeCode(irCode, noMetadata, onThreadTiming, previous), appView);
+ IRConverter.printMethod(method, "Finalized output format", appView.options());
}
public static boolean verifyLirOnly(AppView<? extends AppInfoWithClassHierarchy> appView) {