[llvm] r319561 - IR printing improvement for function passes - introducing -print-module-scope

Fedor Sergeev via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 1 09:42:46 PST 2017


Author: fedor.sergeev
Date: Fri Dec  1 09:42:46 2017
New Revision: 319561

URL: http://llvm.org/viewvc/llvm-project?rev=319561&view=rev
Log:
IR printing improvement for function passes - introducing -print-module-scope

Summary:
When debugging function passes it happens to be rather useful to dump
the whole module before the transformation and then use this dump
to analyze this single transformation by running it separately
on that particular module state.

Introducing
    -print-module-scope
debugging option that forces all the function-level IR dumps
to become whole-module dumps.

This option builds on top of normal dumping controls like
   -print-before/after
   -filter-print-funcs

The plan is to eventually extend this option to cover other local passes
(at least loop passes) but that should go as a separate change.

Reviewers: sanjoy, weimingz, silvas, fedor.sergeev

Reviewed By: weimingz

Subscribers: apilipenko, skatkov, llvm-commits, mehdi_amini

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

Added:
    llvm/trunk/test/Other/print-module-scope.ll
Modified:
    llvm/trunk/include/llvm/Pass.h
    llvm/trunk/lib/IR/IRPrintingPasses.cpp
    llvm/trunk/lib/IR/LegacyPassManager.cpp

Modified: llvm/trunk/include/llvm/Pass.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Pass.h?rev=319561&r1=319560&r2=319561&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Pass.h (original)
+++ llvm/trunk/include/llvm/Pass.h Fri Dec  1 09:42:46 2017
@@ -361,6 +361,12 @@ extern bool TimePassesIsEnabled;
 //  @brief Tells if the function IR should be printed by PrinterPass.
 extern bool isFunctionInPrintList(StringRef FunctionName);
 
+/// forcePrintModuleIR - returns true if IR printing passes should
+//  be printing module IR (even for local-pass printers e.g. function-pass)
+//  to provide more context, as enabled by debugging option -print-module-scope
+//  @brief Tells if IR printer should be printing module IR
+extern bool forcePrintModuleIR();
+
 } // end namespace llvm
 
 // Include support files that contain important APIs commonly used by Passes,

Modified: llvm/trunk/lib/IR/IRPrintingPasses.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/IRPrintingPasses.cpp?rev=319561&r1=319560&r2=319561&view=diff
==============================================================================
--- llvm/trunk/lib/IR/IRPrintingPasses.cpp (original)
+++ llvm/trunk/lib/IR/IRPrintingPasses.cpp Fri Dec  1 09:42:46 2017
@@ -45,7 +45,10 @@ PrintFunctionPass::PrintFunctionPass(raw
 PreservedAnalyses PrintFunctionPass::run(Function &F,
                                          FunctionAnalysisManager &) {
   if (isFunctionInPrintList(F.getName()))
-    OS << Banner << static_cast<Value &>(F);
+    if (forcePrintModuleIR())
+      OS << Banner << " (function: " << F.getName() << ")\n" << *F.getParent();
+    else
+      OS << Banner << static_cast<Value &>(F);
   return PreservedAnalyses::all();
 }
 

Modified: llvm/trunk/lib/IR/LegacyPassManager.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LegacyPassManager.cpp?rev=319561&r1=319560&r2=319561&view=diff
==============================================================================
--- llvm/trunk/lib/IR/LegacyPassManager.cpp (original)
+++ llvm/trunk/lib/IR/LegacyPassManager.cpp Fri Dec  1 09:42:46 2017
@@ -82,6 +82,12 @@ static cl::opt<bool> PrintAfterAll("prin
                                    llvm::cl::desc("Print IR after each pass"),
                                    cl::init(false), cl::Hidden);
 
+static cl::opt<bool>
+    PrintModuleScope("print-module-scope",
+                     cl::desc("When printing IR for print-[before|after]{-all} "
+                              "always print a module IR"),
+                     cl::init(false));
+
 static cl::list<std::string>
     PrintFuncsList("filter-print-funcs", cl::value_desc("function names"),
                    cl::desc("Only print IR for functions whose name "
@@ -115,6 +121,8 @@ static bool ShouldPrintAfterPass(const P
   return PrintAfterAll || ShouldPrintBeforeOrAfterPass(PI, PrintAfter);
 }
 
+bool llvm::forcePrintModuleIR() { return PrintModuleScope; }
+
 bool llvm::isFunctionInPrintList(StringRef FunctionName) {
   static std::unordered_set<std::string> PrintFuncNames(PrintFuncsList.begin(),
                                                         PrintFuncsList.end());

Added: llvm/trunk/test/Other/print-module-scope.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/print-module-scope.ll?rev=319561&view=auto
==============================================================================
--- llvm/trunk/test/Other/print-module-scope.ll (added)
+++ llvm/trunk/test/Other/print-module-scope.ll Fri Dec  1 09:42:46 2017
@@ -0,0 +1,55 @@
+; This test is checking basic properties of -print-module-scope options:
+;   - dumps all the module IR at once
+;   - all the function attributes are shown, including those of declarations
+;   - works on top of -print-after and -filter-print-funcs
+;
+; RUN: opt < %s 2>&1 -disable-output \
+; RUN: 	   -simplifycfg -print-after=simplifycfg -print-module-scope \
+; RUN:	   | FileCheck %s -check-prefix=CFG
+; RUN: opt < %s 2>&1 -disable-output \
+; RUN: 	   -simplifycfg -print-after=simplifycfg -filter-print-funcs=foo -print-module-scope \
+; RUN:	   | FileCheck %s -check-prefix=FOO
+
+; CFG:      IR Dump After
+; CFG-SAME:   function: foo
+; CFG-NEXT: ModuleID =
+; CFG: define void @foo
+; CFG: define void @bar
+; CFG: declare void @baz
+; CFG: IR Dump After
+; CFG-SAME:   function: bar
+; CFG-NEXT: ModuleID =
+; CFG: define void @foo
+; CFG: define void @bar
+; CFG: declare void @baz
+
+; FOO:      IR Dump After
+; FOO-NOT:    function: bar
+; FOO-SAME:   function: foo
+; FOO-NEXT: ModuleID =
+; FOO:   Function Attrs: nounwind ssp
+; FOO: define void @foo
+; FOO:   Function Attrs: nounwind
+; FOO: define void @bar
+; FOO:   Function Attrs: nounwind readnone ssp
+; FOO: declare void @baz
+
+define void @foo() nounwind ssp {
+  call void @baz()
+  ret void
+}
+
+define void @bar() #0 {
+  ret void
+}
+
+declare void @baz() #1
+
+attributes #0 = { nounwind "no-frame-pointer-elim"="true" }
+
+attributes #1 = { nounwind readnone ssp "use-soft-float"="false" }
+; FOO: attributes #{{[0-9]}} = { nounwind "no-frame-pointer-elim"="true" }
+
+; FOO: attributes #{{[0-9]}} = { nounwind readnone ssp "use-soft-float"="false" }
+
+; FOO-NOT: IR Dump




More information about the llvm-commits mailing list