[NewPM] Print pre-transformation IR name in --print-after-all
authorArthur Eubanks <aeubanks@google.com>
Mon, 19 Jul 2021 17:32:12 +0000 (10:32 -0700)
committerArthur Eubanks <aeubanks@google.com>
Tue, 20 Jul 2021 17:20:10 +0000 (10:20 -0700)
Sometimes a transformation can change the name of some IR (e.g. an SCC
with functions added/removed). This can be confusing when debug logging
doesn't match the post-transformation name. The specific example I came
across was that --print-after-all said the inliner was working on an SCC
that only contained one function, but calls in multiple functions were
getting inlined. After all inlining, the current SCC only contained one
function.

Piggyback off of the existing logic to handle invalidated IR +
--print-module-scope. Simply always store the IR description and use
that.

Reviewed By: jamieschmeiser

Differential Revision: https://reviews.llvm.org/D106290

llvm/include/llvm/Passes/StandardInstrumentations.h
llvm/lib/Passes/StandardInstrumentations.cpp
llvm/test/Other/loop-deletion-printer.ll
llvm/test/Other/scc-deleted-printer.ll

index 9011c52f20c1f356e2bb42f94465aa0d640f24d1..2f573585e766de56220ed205999d44d0f93efaff 100644 (file)
@@ -61,7 +61,6 @@ private:
   /// Stack of Module description, enough to print the module after a given
   /// pass.
   SmallVector<PrintModuleDesc, 2> ModuleDescStack;
-  bool StoreModuleDesc = false;
 };
 
 class OptNoneInstrumentation {
index a03e0d4b597eb8fb0542899a2cad9655a9230810..5a48923bce8ab3e97bd2273b0c2d744ab30e9116 100644 (file)
@@ -709,7 +709,6 @@ PrintIRInstrumentation::~PrintIRInstrumentation() {
 }
 
 void PrintIRInstrumentation::pushModuleDesc(StringRef PassID, Any IR) {
-  assert(StoreModuleDesc);
   const Module *M = unwrapModule(IR);
   ModuleDescStack.emplace_back(M, getIRName(IR), PassID);
 }
@@ -730,7 +729,7 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, Any IR) {
   // Note: here we rely on a fact that we do not change modules while
   // traversing the pipeline, so the latest captured module is good
   // for all print operations that has not happen yet.
-  if (StoreModuleDesc && shouldPrintAfterPass(PassID))
+  if (shouldPrintAfterPass(PassID))
     pushModuleDesc(PassID, IR);
 
   if (!shouldPrintBeforePass(PassID))
@@ -751,25 +750,22 @@ void PrintIRInstrumentation::printAfterPass(StringRef PassID, Any IR) {
   if (!shouldPrintAfterPass(PassID))
     return;
 
-  if (StoreModuleDesc) {
-    const Module *M;
-    std::string IRName;
-    StringRef StoredPassID;
-    std::tie(M, IRName, StoredPassID) = popModuleDesc(PassID);
-    assert(StoredPassID == PassID && "mismatched PassID");
-  }
+  const Module *M;
+  std::string IRName;
+  StringRef StoredPassID;
+  std::tie(M, IRName, StoredPassID) = popModuleDesc(PassID);
+  assert(StoredPassID == PassID && "mismatched PassID");
 
   if (!shouldPrintIR(IR))
     return;
 
-  dbgs() << "*** IR Dump After " << PassID << " on " << getIRName(IR)
-         << " ***\n";
+  dbgs() << "*** IR Dump After " << PassID << " on " << IRName << " ***\n";
   unwrapAndPrint(dbgs(), IR);
 }
 
 void PrintIRInstrumentation::printAfterPassInvalidated(StringRef PassID) {
   StringRef PassName = PIC->getPassNameForClassName(PassID);
-  if (!StoreModuleDesc || !shouldPrintAfterPass(PassName))
+  if (!shouldPrintAfterPass(PassName))
     return;
 
   if (isIgnored(PassID))
@@ -813,8 +809,7 @@ void PrintIRInstrumentation::registerCallbacks(
 
   // BeforePass callback is not just for printing, it also saves a Module
   // for later use in AfterPassInvalidated.
-  StoreModuleDesc = forcePrintModuleIR() && shouldPrintAfterSomePass();
-  if (shouldPrintBeforeSomePass() || StoreModuleDesc)
+  if (shouldPrintBeforeSomePass() || shouldPrintAfterSomePass())
     PIC.registerBeforeNonSkippedPassCallback(
         [this](StringRef P, Any IR) { this->printBeforePass(P, IR); });
 
index 53971b8c0df6de0904bb17dfad909cf68937d027..bce32dbeb52bd810a60874d6a1bbea38f82d01a9 100644 (file)
@@ -6,13 +6,11 @@
 ; RUN: opt < %s -disable-output \
 ; RUN:     -passes=loop-deletion,loop-instsimplify -print-after-all  2>&1 | FileCheck %s -check-prefix=DELETED
 ; RUN: opt < %s -disable-output \
-; RUN:     -passes=loop-deletion,loop-instsimplify -print-after-all -print-module-scope  2>&1 | FileCheck %s -check-prefix=DELETED-BUT-PRINTED
+; RUN:     -passes=loop-deletion,loop-instsimplify -print-after-all -print-module-scope  2>&1 | FileCheck %s -check-prefix=DELETED
 ;
 ; SIMPLIFY: IR Dump {{.*}} LoopInstSimplifyPass
+; DELETED: IR Dump {{.*}}LoopDeletionPass {{.*}}(invalidated)
 ; DELETED-NOT: IR Dump {{.*}}LoopInstSimplifyPass
-; DELETED-NOT: IR Dump {{.*}}LoopDeletionPass
-; DELETED-BUT-PRINTED: IR Dump {{.*}}LoopDeletionPass {{.*}}(invalidated)
-; DELETED-BUT-PRINTED-NOT: IR Dump {{.*}}LoopInstSimplifyPass
 
 define void @deleteme() {
 entry:
index 05b2f4569ed0a4b523cca289f0a51c2322d887e5..86171d914c19e75fda81dcfd4c71e1881264eeec 100644 (file)
@@ -1,17 +1,12 @@
 ; RUN: opt < %s 2>&1 -disable-output \
-; RUN:            -passes=inline -print-before-all -print-after-all | FileCheck %s -check-prefix=INL
+; RUN:            -passes=inline -print-before-all -print-after-all | FileCheck %s
 ; RUN: opt < %s 2>&1 -disable-output \
-; RUN:            -passes=inline -print-before-all -print-after-all -print-module-scope | FileCheck %s -check-prefix=INL-MOD
+; RUN:            -passes=inline -print-before-all -print-after-all -print-module-scope | FileCheck %s
 
-; INL: IR Dump Before InlinerPass on (tester, foo)
-; INL-NOT: IR Dump After {{InlinerPass}}
-; INL: IR Dump Before InlinerPass on (tester)
-; INL: IR Dump After InlinerPass on (tester)
-
-; INL-MOD: IR Dump Before InlinerPass on (tester, foo)
-; INL-MOD: IR Dump After InlinerPass on (tester, foo) (invalidated)
-; INL-MOD: IR Dump Before InlinerPass on (tester)
-; INL-MOD: IR Dump After InlinerPass on (tester)
+; CHECK: IR Dump Before InlinerPass on (tester, foo)
+; CHECK: IR Dump After InlinerPass on (tester, foo) (invalidated)
+; CHECK: IR Dump Before InlinerPass on (tester)
+; CHECK: IR Dump After InlinerPass on (tester)
 
 
 define void @tester() noinline {