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) {