-
Notifications
You must be signed in to change notification settings - Fork 15.2k
Add option to print entire function instead of just the loops for loo… #123229
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add option to print entire function instead of just the loops for loo… #123229
Conversation
|
@llvm/pr-subscribers-llvm-analysis Author: Akshay Deodhar (akshayrdeodhar) Changesprint-after-all is useful for diffing IR between two passes. When one of the two is a function pass, and the other is a loop pass, the diff becomes useless. Add an option which prints the entire function for loop passes. Full diff: https://github.com/llvm/llvm-project/pull/123229.diff 3 Files Affected:
diff --git a/llvm/include/llvm/IR/PrintPasses.h b/llvm/include/llvm/IR/PrintPasses.h
index 95b97e76c867cb..0aa1b379c35cf2 100644
--- a/llvm/include/llvm/IR/PrintPasses.h
+++ b/llvm/include/llvm/IR/PrintPasses.h
@@ -51,6 +51,9 @@ std::vector<std::string> printAfterPasses();
// Returns true if we should always print the entire module.
bool forcePrintModuleIR();
+// Returns true if we should print the entire function for loop passes.
+bool forcePrintFuncIR();
+
// Return true if -filter-passes is empty or contains the pass name.
bool isPassInPrintList(StringRef PassName);
bool isFilterPassesEmpty();
diff --git a/llvm/lib/Analysis/LoopInfo.cpp b/llvm/lib/Analysis/LoopInfo.cpp
index 6bb5f001e9bd1d..7bd5e1e0cfac8f 100644
--- a/llvm/lib/Analysis/LoopInfo.cpp
+++ b/llvm/lib/Analysis/LoopInfo.cpp
@@ -999,6 +999,18 @@ void llvm::printLoop(Loop &L, raw_ostream &OS, const std::string &Banner) {
return;
}
+ if (forcePrintFuncIR()) {
+ // handling -print-loop-func-scope.
+ // -print-module-scope overrides this.
+ OS << Banner << " (loop: ";
+ L.getHeader()->printAsOperand(OS, false);
+ OS << ")\n";
+
+ // printing whole function.
+ OS << *L.getHeader()->getParent();
+ return;
+ }
+
OS << Banner;
auto *PreHeader = L.getLoopPreheader();
diff --git a/llvm/lib/IR/PrintPasses.cpp b/llvm/lib/IR/PrintPasses.cpp
index e2ef20bb81ba7d..466d16ccf32fca 100644
--- a/llvm/lib/IR/PrintPasses.cpp
+++ b/llvm/lib/IR/PrintPasses.cpp
@@ -88,6 +88,12 @@ static cl::opt<bool>
"always print a module IR"),
cl::init(false), cl::Hidden);
+static cl::opt<bool>
+ LoopPrintFuncScope("print-loop-func-scope",
+ cl::desc("When printing IR for print-[before|after]{-all} "
+ "for a loop pass, always print function IR"),
+ cl::init(false), cl::Hidden);
+
// See the description for -print-changed for an explanation of the use
// of this option.
static cl::list<std::string> FilterPasses(
@@ -141,6 +147,8 @@ std::vector<std::string> llvm::printAfterPasses() {
bool llvm::forcePrintModuleIR() { return PrintModuleScope; }
+bool llvm::forcePrintFuncIR() { return LoopPrintFuncScope; }
+
bool llvm::isPassInPrintList(StringRef PassName) {
static std::unordered_set<std::string> Set(FilterPasses.begin(),
FilterPasses.end());
|
|
@llvm/pr-subscribers-llvm-ir Author: Akshay Deodhar (akshayrdeodhar) Changesprint-after-all is useful for diffing IR between two passes. When one of the two is a function pass, and the other is a loop pass, the diff becomes useless. Add an option which prints the entire function for loop passes. Full diff: https://github.com/llvm/llvm-project/pull/123229.diff 3 Files Affected:
diff --git a/llvm/include/llvm/IR/PrintPasses.h b/llvm/include/llvm/IR/PrintPasses.h
index 95b97e76c867cb..0aa1b379c35cf2 100644
--- a/llvm/include/llvm/IR/PrintPasses.h
+++ b/llvm/include/llvm/IR/PrintPasses.h
@@ -51,6 +51,9 @@ std::vector<std::string> printAfterPasses();
// Returns true if we should always print the entire module.
bool forcePrintModuleIR();
+// Returns true if we should print the entire function for loop passes.
+bool forcePrintFuncIR();
+
// Return true if -filter-passes is empty or contains the pass name.
bool isPassInPrintList(StringRef PassName);
bool isFilterPassesEmpty();
diff --git a/llvm/lib/Analysis/LoopInfo.cpp b/llvm/lib/Analysis/LoopInfo.cpp
index 6bb5f001e9bd1d..7bd5e1e0cfac8f 100644
--- a/llvm/lib/Analysis/LoopInfo.cpp
+++ b/llvm/lib/Analysis/LoopInfo.cpp
@@ -999,6 +999,18 @@ void llvm::printLoop(Loop &L, raw_ostream &OS, const std::string &Banner) {
return;
}
+ if (forcePrintFuncIR()) {
+ // handling -print-loop-func-scope.
+ // -print-module-scope overrides this.
+ OS << Banner << " (loop: ";
+ L.getHeader()->printAsOperand(OS, false);
+ OS << ")\n";
+
+ // printing whole function.
+ OS << *L.getHeader()->getParent();
+ return;
+ }
+
OS << Banner;
auto *PreHeader = L.getLoopPreheader();
diff --git a/llvm/lib/IR/PrintPasses.cpp b/llvm/lib/IR/PrintPasses.cpp
index e2ef20bb81ba7d..466d16ccf32fca 100644
--- a/llvm/lib/IR/PrintPasses.cpp
+++ b/llvm/lib/IR/PrintPasses.cpp
@@ -88,6 +88,12 @@ static cl::opt<bool>
"always print a module IR"),
cl::init(false), cl::Hidden);
+static cl::opt<bool>
+ LoopPrintFuncScope("print-loop-func-scope",
+ cl::desc("When printing IR for print-[before|after]{-all} "
+ "for a loop pass, always print function IR"),
+ cl::init(false), cl::Hidden);
+
// See the description for -print-changed for an explanation of the use
// of this option.
static cl::list<std::string> FilterPasses(
@@ -141,6 +147,8 @@ std::vector<std::string> llvm::printAfterPasses() {
bool llvm::forcePrintModuleIR() { return PrintModuleScope; }
+bool llvm::forcePrintFuncIR() { return LoopPrintFuncScope; }
+
bool llvm::isPassInPrintList(StringRef PassName) {
static std::unordered_set<std::string> Set(FilterPasses.begin(),
FilterPasses.end());
|
|
Approximately added reviewers based on the git-blame- please point me to the right reviewer! |
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
aeubanks
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
makes sense to me, but needs a test (e.g. llvm/test/Other/print-module-scope.ll for a similar one)
Added test. |
justinfargnoli
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overall, this seems like a great idea!
justinfargnoli
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM :)
aeubanks
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm with ultra nits
|
Thanks! |
print-after-all is useful for diffing IR between two passes. When one of the two is a function pass, and the other is a loop pass, the diff becomes useless. Add an option which prints the entire function for loop passes.