[llvm] r318878 - IR printing improvement for loop passes

Fedor Sergeev via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 22 12:59:53 PST 2017


Author: fedor.sergeev
Date: Wed Nov 22 12:59:53 2017
New Revision: 318878

URL: http://llvm.org/viewvc/llvm-project?rev=318878&view=rev
Log:
IR printing improvement for loop passes

Summary:
Loop-pass printing is somewhat deficient since it does not provide the
context around the loop (e.g. preheader). This context information becomes
pretty essential when analyzing transformations that move stuff out of the loop.

Extending printLoop to cover preheader and exit blocks (if any).

Reviewers: sanjoy, silvas, weimingz

Reviewed By: sanjoy

Subscribers: apilipenko, skatkov, llvm-commits

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

Added:
    llvm/trunk/test/Other/loop-pass-printer.ll
Modified:
    llvm/trunk/lib/Analysis/LoopInfo.cpp

Modified: llvm/trunk/lib/Analysis/LoopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=318878&r1=318877&r2=318878&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/LoopInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/LoopInfo.cpp Wed Nov 22 12:59:53 2017
@@ -732,11 +732,30 @@ PreservedAnalyses LoopPrinterPass::run(F
 
 void llvm::printLoop(Loop &L, raw_ostream &OS, const std::string &Banner) {
   OS << Banner;
+
+  auto *PreHeader = L.getLoopPreheader();
+  if (PreHeader) {
+    OS << "\n; Preheader:";
+    PreHeader->print(OS);
+    OS << "\n; Loop:";
+  }
+
   for (auto *Block : L.blocks())
     if (Block)
       Block->print(OS);
     else
       OS << "Printing <null> block";
+
+  SmallVector<BasicBlock *, 8> ExitBlocks;
+  L.getExitBlocks(ExitBlocks);
+  if (!ExitBlocks.empty()) {
+    OS << "\n; Exit blocks";
+    for (auto *Block : ExitBlocks)
+      if (Block)
+        Block->print(OS);
+      else
+        OS << "Printing <null> block";
+  }
 }
 
 //===----------------------------------------------------------------------===//

Added: llvm/trunk/test/Other/loop-pass-printer.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/loop-pass-printer.ll?rev=318878&view=auto
==============================================================================
--- llvm/trunk/test/Other/loop-pass-printer.ll (added)
+++ llvm/trunk/test/Other/loop-pass-printer.ll Wed Nov 22 12:59:53 2017
@@ -0,0 +1,67 @@
+; This test checks -print-after/before on loop passes
+; Besides of the loop itself it should be dumping loop pre-header and exits.
+;
+; RUN: opt < %s 2>&1 -disable-output \
+; RUN: 	   -loop-deletion -print-before=loop-deletion \
+; RUN:	   | FileCheck %s -check-prefix=DEL
+; RUN: opt < %s 2>&1 -disable-output \
+; RUN: 	   -loop-unroll -print-after=loop-unroll -filter-print-funcs=bar \
+; RUN:	   | FileCheck %s -check-prefix=BAR
+;
+
+; DEL:	    IR Dump Before
+; DEL-SAME: dead loops
+; DEL: 	    ; Preheader:
+; DEL-NEXT:  %idx = alloca i32, align 4
+; DEL:      ; Loop:
+; DEL-NEXT:  loop:
+; DEL:	     cont:
+; DEL:	    ; Exit blocks
+; DEL:	     done:
+; DEL:	    IR Dump Before
+; DEL-SAME: dead loops
+; DEL: 	    ; Preheader:
+; DEL-NEXT:  br label %loop
+; DEL:      ; Loop:
+; DEL-NEXT:  loop:
+; DEL:	    ; Exit blocks
+; DEL:	     end:
+
+; BAR:	    IR Dump After
+; BAR-SAME: Unroll
+; BAR: 	    ; Preheader:
+; BAR-NEXT:  br label %loop
+; BAR:      ; Loop:
+; BAR-NEXT:  loop:
+; BAR:	    ; Exit blocks
+; BAR:	     end:
+; BAR-NOT: IR Dump Before
+; BAR-NOT:  ; Loop
+
+define void @foo(){
+  %idx = alloca i32, align 4
+  store i32 0, i32* %idx, align 4
+  br label %loop
+
+loop:
+  %1 = load i32, i32* %idx, align 4
+  %2 = icmp slt i32 %1, 10
+  br i1 %2, label %cont, label %done
+
+cont:
+  %3 = load i32, i32* %idx, align 4
+  %4 = add nsw i32 %3, 1
+  store i32 %4, i32* %idx, align 4
+  br label %loop
+
+done:
+  ret void
+}
+
+define void @bar(){
+  br label %loop
+loop:
+  br i1 1, label %loop, label %end
+end:
+  ret void
+}




More information about the llvm-commits mailing list