Skip to content

Commit 03f619d

Browse files
authored
[StandardInstrumentations] Support -print-after-pass-number option (#87458)
There's already support for `-print-before-pass-number`, so it makes sense that we also have a `-print-after-pass-number`. This is especially useful if you want to print the IR after the very last pass without resorting to `-print-after-all` and combing through stderr or the IR file directory.
1 parent a417b9b commit 03f619d

File tree

3 files changed

+62
-19
lines changed

3 files changed

+62
-19
lines changed

llvm/include/llvm/Passes/StandardInstrumentations.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,11 @@ class PrintIRInstrumentation {
6767

6868
bool shouldPrintBeforePass(StringRef PassID);
6969
bool shouldPrintAfterPass(StringRef PassID);
70+
bool shouldPrintBeforeCurrentPassNumber();
71+
bool shouldPrintAfterCurrentPassNumber();
7072
bool shouldPrintPassNumbers();
71-
bool shouldPrintBeforePassNumber();
73+
bool shouldPrintBeforeSomePassNumber();
74+
bool shouldPrintAfterSomePassNumber();
7275

7376
void pushPassRunDescriptor(StringRef PassID, Any IR,
7477
std::string &DumpIRFilename);

llvm/lib/Passes/StandardInstrumentations.cpp

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ static cl::opt<unsigned> PrintBeforePassNumber(
125125
cl::desc("Print IR before the pass with this number as "
126126
"reported by print-pass-numbers"));
127127

128+
static cl::opt<unsigned>
129+
PrintAfterPassNumber("print-after-pass-number", cl::init(0), cl::Hidden,
130+
cl::desc("Print IR after the pass with this number as "
131+
"reported by print-pass-numbers"));
132+
128133
static cl::opt<std::string> IRDumpDirectory(
129134
"ir-dump-directory",
130135
cl::desc("If specified, IR printed using the "
@@ -854,7 +859,9 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, Any IR) {
854859

855860
std::string DumpIRFilename;
856861
if (!IRDumpDirectory.empty() &&
857-
(shouldPrintBeforePass(PassID) || shouldPrintAfterPass(PassID)))
862+
(shouldPrintBeforePass(PassID) || shouldPrintAfterPass(PassID) ||
863+
shouldPrintBeforeCurrentPassNumber() ||
864+
shouldPrintAfterCurrentPassNumber()))
858865
DumpIRFilename = fetchDumpFilename(PassID, IR);
859866

860867
// Saving Module for AfterPassInvalidated operations.
@@ -873,12 +880,15 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, Any IR) {
873880
dbgs() << " Running pass " << CurrentPassNumber << " " << PassID
874881
<< " on " << getIRName(IR) << "\n";
875882

876-
if (!shouldPrintBeforePass(PassID))
883+
if (shouldPrintAfterCurrentPassNumber())
884+
pushPassRunDescriptor(PassID, IR, DumpIRFilename);
885+
886+
if (!shouldPrintBeforePass(PassID) && !shouldPrintBeforeCurrentPassNumber())
877887
return;
878888

879889
auto WriteIRToStream = [&](raw_ostream &Stream) {
880890
Stream << "; *** IR Dump Before ";
881-
if (shouldPrintBeforePassNumber())
891+
if (shouldPrintBeforeSomePassNumber())
882892
Stream << CurrentPassNumber << "-";
883893
Stream << PassID << " on " << getIRName(IR) << " ***\n";
884894
unwrapAndPrint(Stream, IR);
@@ -898,18 +908,21 @@ void PrintIRInstrumentation::printAfterPass(StringRef PassID, Any IR) {
898908
if (isIgnored(PassID))
899909
return;
900910

901-
if (!shouldPrintAfterPass(PassID))
911+
if (!shouldPrintAfterPass(PassID) && !shouldPrintAfterCurrentPassNumber())
902912
return;
903913

904914
auto [M, DumpIRFilename, IRName, StoredPassID] = popPassRunDescriptor(PassID);
905915
assert(StoredPassID == PassID && "mismatched PassID");
906916

907-
if (!shouldPrintIR(IR) || !shouldPrintAfterPass(PassID))
917+
if (!shouldPrintIR(IR) ||
918+
(!shouldPrintAfterPass(PassID) && !shouldPrintAfterCurrentPassNumber()))
908919
return;
909920

910921
auto WriteIRToStream = [&](raw_ostream &Stream, const StringRef IRName) {
911-
Stream << "; *** IR Dump " << StringRef(formatv("After {0}", PassID))
912-
<< " on " << IRName << " ***\n";
922+
Stream << "; *** IR Dump After ";
923+
if (shouldPrintAfterSomePassNumber())
924+
Stream << CurrentPassNumber << "-";
925+
Stream << StringRef(formatv("{0}", PassID)) << " on " << IRName << " ***\n";
913926
unwrapAndPrint(Stream, IR);
914927
};
915928

@@ -931,14 +944,15 @@ void PrintIRInstrumentation::printAfterPassInvalidated(StringRef PassID) {
931944
if (isIgnored(PassID))
932945
return;
933946

934-
if (!shouldPrintAfterPass(PassID))
947+
if (!shouldPrintAfterPass(PassID) && !shouldPrintAfterCurrentPassNumber())
935948
return;
936949

937950
auto [M, DumpIRFilename, IRName, StoredPassID] = popPassRunDescriptor(PassID);
938951
assert(StoredPassID == PassID && "mismatched PassID");
939952
// Additional filtering (e.g. -filter-print-func) can lead to module
940953
// printing being skipped.
941-
if (!M || !shouldPrintAfterPass(PassID))
954+
if (!M ||
955+
(!shouldPrintAfterPass(PassID) && !shouldPrintAfterCurrentPassNumber()))
942956
return;
943957

944958
auto WriteIRToStream = [&](raw_ostream &Stream, const Module *M,
@@ -968,10 +982,6 @@ bool PrintIRInstrumentation::shouldPrintBeforePass(StringRef PassID) {
968982
if (shouldPrintBeforeAll())
969983
return true;
970984

971-
if (shouldPrintBeforePassNumber() &&
972-
CurrentPassNumber == PrintBeforePassNumber)
973-
return true;
974-
975985
StringRef PassName = PIC->getPassNameForClassName(PassID);
976986
return is_contained(printBeforePasses(), PassName);
977987
}
@@ -984,26 +994,42 @@ bool PrintIRInstrumentation::shouldPrintAfterPass(StringRef PassID) {
984994
return is_contained(printAfterPasses(), PassName);
985995
}
986996

997+
bool PrintIRInstrumentation::shouldPrintBeforeCurrentPassNumber() {
998+
return shouldPrintBeforeSomePassNumber() &&
999+
(CurrentPassNumber == PrintBeforePassNumber);
1000+
}
1001+
1002+
bool PrintIRInstrumentation::shouldPrintAfterCurrentPassNumber() {
1003+
return shouldPrintAfterSomePassNumber() &&
1004+
(CurrentPassNumber == PrintAfterPassNumber);
1005+
}
1006+
9871007
bool PrintIRInstrumentation::shouldPrintPassNumbers() {
9881008
return PrintPassNumbers;
9891009
}
9901010

991-
bool PrintIRInstrumentation::shouldPrintBeforePassNumber() {
1011+
bool PrintIRInstrumentation::shouldPrintBeforeSomePassNumber() {
9921012
return PrintBeforePassNumber > 0;
9931013
}
9941014

1015+
bool PrintIRInstrumentation::shouldPrintAfterSomePassNumber() {
1016+
return PrintAfterPassNumber > 0;
1017+
}
1018+
9951019
void PrintIRInstrumentation::registerCallbacks(
9961020
PassInstrumentationCallbacks &PIC) {
9971021
this->PIC = &PIC;
9981022

9991023
// BeforePass callback is not just for printing, it also saves a Module
1000-
// for later use in AfterPassInvalidated.
1001-
if (shouldPrintPassNumbers() || shouldPrintBeforePassNumber() ||
1002-
shouldPrintBeforeSomePass() || shouldPrintAfterSomePass())
1024+
// for later use in AfterPassInvalidated and keeps tracks of the
1025+
// CurrentPassNumber.
1026+
if (shouldPrintPassNumbers() || shouldPrintBeforeSomePassNumber() ||
1027+
shouldPrintAfterSomePassNumber() || shouldPrintBeforeSomePass() ||
1028+
shouldPrintAfterSomePass())
10031029
PIC.registerBeforeNonSkippedPassCallback(
10041030
[this](StringRef P, Any IR) { this->printBeforePass(P, IR); });
10051031

1006-
if (shouldPrintAfterSomePass()) {
1032+
if (shouldPrintAfterSomePass() || shouldPrintAfterSomePassNumber()) {
10071033
PIC.registerAfterPassCallback(
10081034
[this](StringRef P, Any IR, const PreservedAnalyses &) {
10091035
this->printAfterPass(P, IR);

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
; 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
2+
; RUN: opt -passes="loop(indvars,loop-deletion,loop-unroll-full)" -print-pass-numbers -filter-print-funcs=baz -S -o /dev/null %s 2>&1 | FileCheck %s --check-prefix=NUMBER-FILTERED
23
; RUN: opt -passes="loop(indvars,loop-deletion,loop-unroll-full)" -print-module-scope -print-before-pass-number=3 -S -o /dev/null %s 2>&1 | FileCheck %s --check-prefix=BEFORE
4+
; RUN: opt -passes="loop(indvars,loop-deletion,loop-unroll-full)" -print-module-scope -print-after-pass-number=2 -S -o /dev/null %s 2>&1 | FileCheck %s --check-prefix=AFTER
35

46
define i32 @bar(i32 %arg) {
57
; BEFORE: *** IR Dump Before 3-IndVarSimplifyPass on bb1 ***
68
; BEFORE: define i32 @bar(i32 %arg) {
9+
; AFTER: *** IR Dump After 2-LCSSAPass on bar ***
10+
; AFTER: define i32 @bar(i32 %arg) {
711

812
bb:
913
br label %bb1
@@ -20,8 +24,18 @@ bb4: ; preds = %bb1
2024
ret i32 %add3
2125
}
2226

27+
define i32 @baz(i32 %arg) {
28+
ret i32 0;
29+
}
30+
2331
; NUMBER: Running pass 1 LoopSimplifyPass on bar
2432
; NUMBER-NEXT: Running pass 2 LCSSAPass on bar
2533
; NUMBER-NEXT: Running pass 3 IndVarSimplifyPass on bb1
2634
; NUMBER-NEXT: Running pass 4 LoopDeletionPass on bb1
35+
; NUMBER-NEXT: Running pass 5 LoopSimplifyPass on baz
36+
; NUMBER-NEXT: Running pass 6 LCSSAPass on baz
2737
; NUMBER-NOT: Running pass
38+
39+
; NUMBER-FILTERED: Running pass 1 LoopSimplifyPass on baz
40+
; NUMBER-FILTERED-NEXT: Running pass 2 LCSSAPass on baz
41+

0 commit comments

Comments
 (0)