[llvm] f97ea77 - [Utils] Added the ability to print the pass number and IR after it is triggered

via llvm-commits llvm-commits at lists.llvm.org
Fri May 26 03:36:41 PDT 2023


Author: dbakunevich
Date: 2023-05-26T17:34:48+07:00
New Revision: f97ea77506aaee42af856bfde4d4fb3cc4311c12

URL: https://github.com/llvm/llvm-project/commit/f97ea77506aaee42af856bfde4d4fb3cc4311c12
DIFF: https://github.com/llvm/llvm-project/commit/f97ea77506aaee42af856bfde4d4fb3cc4311c12.diff

LOG: [Utils] Added the ability to print the pass number and IR after it is triggered

As part of this patch, 2 options have been added:
print-pass-numbers and print-after-pass-number.

1) The print-pass-numbers option allows to print the pass names and their ordinals.
   The output of the option looks like this:
                Running pass ORDINAL PASS_NAME

2) The print-after-pass-number option allows to print IR after pass with the number
   which reported by print-passes-names.

Reviewed By: apilipenko, aeubanks

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

Added: 
    llvm/test/Other/print-at-pass-number.ll

Modified: 
    llvm/include/llvm/Passes/StandardInstrumentations.h
    llvm/lib/Passes/StandardInstrumentations.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index 759b79dc2b0ba..331130c6b22d9 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -52,6 +52,8 @@ class PrintIRInstrumentation {
 
   bool shouldPrintBeforePass(StringRef PassID);
   bool shouldPrintAfterPass(StringRef PassID);
+  bool shouldPrintPassNumbers();
+  bool shouldPrintAtPassNumber();
 
   using PrintModuleDesc = std::tuple<const Module *, std::string, StringRef>;
 
@@ -62,6 +64,9 @@ class PrintIRInstrumentation {
   /// Stack of Module description, enough to print the module after a given
   /// pass.
   SmallVector<PrintModuleDesc, 2> ModuleDescStack;
+
+  /// Used for print-at-pass-number
+  unsigned CurrentPassNumber = 0;
 };
 
 class OptNoneInstrumentation {

diff  --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index b47dd4118031d..7eef511928ec5 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -111,6 +111,15 @@ static cl::opt<std::string> OptBisectPrintIRPath(
     "opt-bisect-print-ir-path",
     cl::desc("Print IR to path when opt-bisect-limit is reached"), cl::Hidden);
 
+static cl::opt<bool> PrintPassNumbers(
+    "print-pass-numbers", cl::init(false), cl::Hidden,
+    cl::desc("Print pass names and their ordinals"));
+
+static cl::opt<unsigned>
+    PrintAtPassNumber("print-at-pass-number", cl::init(0), cl::Hidden,
+                cl::desc("Print IR at pass with this number as "
+                         "reported by print-passes-names"));
+
 namespace {
 
 // An option for specifying an executable that will be called with the IR
@@ -696,13 +705,19 @@ 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 (shouldPrintAfterPass(PassID))
+  if (shouldPrintPassNumbers() || shouldPrintAtPassNumber() ||
+      shouldPrintAfterPass(PassID))
     pushModuleDesc(PassID, IR);
 
-  if (!shouldPrintBeforePass(PassID))
+  if (!shouldPrintIR(IR))
     return;
 
-  if (!shouldPrintIR(IR))
+  ++CurrentPassNumber;
+
+  if (shouldPrintPassNumbers())
+    dbgs() << " Running pass " << CurrentPassNumber << " " << PassID << "\n";   
+
+  if (!shouldPrintBeforePass(PassID))
     return;
 
   dbgs() << "*** IR Dump Before " << PassID << " on " << getIRName(IR)
@@ -714,7 +729,8 @@ void PrintIRInstrumentation::printAfterPass(StringRef PassID, Any IR) {
   if (isIgnored(PassID))
     return;
 
-  if (!shouldPrintAfterPass(PassID))
+  if (!shouldPrintAfterPass(PassID) && !shouldPrintPassNumbers() &&
+      !shouldPrintAtPassNumber())
     return;
 
   const Module *M;
@@ -723,18 +739,23 @@ void PrintIRInstrumentation::printAfterPass(StringRef PassID, Any IR) {
   std::tie(M, IRName, StoredPassID) = popModuleDesc(PassID);
   assert(StoredPassID == PassID && "mismatched PassID");
 
-  if (!shouldPrintIR(IR))
+  if (!shouldPrintIR(IR) || !shouldPrintAfterPass(PassID))
     return;
 
-  dbgs() << "*** IR Dump After " << PassID << " on " << IRName << " ***\n";
+  dbgs() << "*** IR Dump "
+         << (shouldPrintAtPassNumber()
+                 ? StringRef(formatv("At {0}-{1}", CurrentPassNumber, PassID))
+                 : StringRef(formatv("After {0}", PassID)))
+         << " on " << IRName << " ***\n";
   unwrapAndPrint(dbgs(), IR);
 }
 
 void PrintIRInstrumentation::printAfterPassInvalidated(StringRef PassID) {
-  if (!shouldPrintAfterPass(PassID))
+  if (isIgnored(PassID))
     return;
 
-  if (isIgnored(PassID))
+  if (!shouldPrintAfterPass(PassID) && !shouldPrintPassNumbers() &&
+      !shouldPrintAtPassNumber())
     return;
 
   const Module *M;
@@ -744,11 +765,16 @@ void PrintIRInstrumentation::printAfterPassInvalidated(StringRef PassID) {
   assert(StoredPassID == PassID && "mismatched PassID");
   // Additional filtering (e.g. -filter-print-func) can lead to module
   // printing being skipped.
-  if (!M)
+  if (!M || !shouldPrintAfterPass(PassID))
     return;
 
-  SmallString<20> Banner =
-      formatv("*** IR Dump After {0} on {1} (invalidated) ***", PassID, IRName);
+  SmallString<20> Banner;
+  if (shouldPrintAtPassNumber())
+    Banner = formatv("*** IR Dump At {0}-{1} on {2} (invalidated) ***",
+                     CurrentPassNumber, PassID, IRName);
+  else 
+    Banner = formatv("*** IR Dump After {0} on {1} (invalidated) ***", 
+                     PassID, IRName);
   dbgs() << Banner << "\n";
   printIR(dbgs(), M);
 }
@@ -765,21 +791,34 @@ bool PrintIRInstrumentation::shouldPrintAfterPass(StringRef PassID) {
   if (shouldPrintAfterAll())
     return true;
 
+  if (shouldPrintAtPassNumber() && CurrentPassNumber == PrintAtPassNumber)
+    return true;
+
   StringRef PassName = PIC->getPassNameForClassName(PassID);
   return is_contained(printAfterPasses(), PassName);
 }
 
+bool PrintIRInstrumentation::shouldPrintPassNumbers() {
+  return PrintPassNumbers;
+}
+
+bool PrintIRInstrumentation::shouldPrintAtPassNumber() {
+  return PrintAtPassNumber > 0;
+}
+
 void PrintIRInstrumentation::registerCallbacks(
     PassInstrumentationCallbacks &PIC) {
   this->PIC = &PIC;
 
   // BeforePass callback is not just for printing, it also saves a Module
   // for later use in AfterPassInvalidated.
-  if (shouldPrintBeforeSomePass() || shouldPrintAfterSomePass())
+  if (shouldPrintPassNumbers() || shouldPrintAtPassNumber() ||
+      shouldPrintBeforeSomePass() || shouldPrintAfterSomePass())
     PIC.registerBeforeNonSkippedPassCallback(
         [this](StringRef P, Any IR) { this->printBeforePass(P, IR); });
 
-  if (shouldPrintAfterSomePass()) {
+  if (shouldPrintPassNumbers() || shouldPrintAtPassNumber() ||
+      shouldPrintAfterSomePass()) {
     PIC.registerAfterPassCallback(
         [this](StringRef P, Any IR, const PreservedAnalyses &) {
           this->printAfterPass(P, IR);

diff  --git a/llvm/test/Other/print-at-pass-number.ll b/llvm/test/Other/print-at-pass-number.ll
new file mode 100644
index 0000000000000..ace41fcc329b3
--- /dev/null
+++ b/llvm/test/Other/print-at-pass-number.ll
@@ -0,0 +1,32 @@
+; RUN: opt -passes="loop(indvars,loop-deletion,loop-unroll-full)" -print-pass-numbers -S -o /dev/null %s 2>&1 | FileCheck %s --check-prefix=NUMBER
+; RUN: opt -passes="loop(indvars,loop-deletion,loop-unroll-full)" -print-module-scope -print-at-pass-number=3 -S -o /dev/null %s 2>&1 | FileCheck %s --check-prefix=AT
+; RUN: opt -passes="loop(indvars,loop-deletion,loop-unroll-full)" -print-module-scope -print-at-pass-number=4 -S -o /dev/null %s 2>&1 | FileCheck %s --check-prefix=AT-INVALIDATE
+
+define i32 @bar(i32 %arg) {
+; AT: *** IR Dump At 3-IndVarSimplifyPass on bb1 ***
+; AT: define i32 @bar(i32 %arg) {
+
+; AT-INVALIDATE: *** IR Dump At 4-LoopDeletionPass on bb1 (invalidated) ***
+; AT-INVALIDATE: define i32 @bar(i32 %arg) {
+
+bb:
+  br label %bb1
+
+bb1:                                              ; preds = %bb1, %bb
+  %phi = phi i32 [ 0, %bb ], [ %add, %bb1 ]
+  %phi2 = phi i32 [ 0, %bb ], [ %add3, %bb1 ]
+  %add = add i32 %phi, 1
+  %add3 = add i32 %phi2, %add
+  %icmp = icmp slt i32 %phi, %arg
+  br i1 %icmp, label %bb1, label %bb4
+
+bb4:                                              ; preds = %bb1
+  ret i32 %add3
+}
+
+; NUMBER: Running pass 1 LoopSimplifyPass
+; NUMBER-NEXT: Running pass 2 LCSSAPass
+; NUMBER-NEXT: Running pass 3 IndVarSimplifyPass
+; NUMBER-NEXT: Running pass 4 LoopDeletionPass
+; NUMBER-NEXT: Running pass 5 VerifierPass
+; NUMBER-NEXT: Running pass 6 PrintModulePass


        


More information about the llvm-commits mailing list