[PATCH] D83869: [Loop Simplify] Resolve an issue where metadata is not applied to a loop latch.

Anh Tuyen Tran via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 17 07:02:41 PDT 2020


This revision was automatically updated to reflect the committed changes.
Closed by commit rG11e879d4f111: [Loop Simplify] Resolve an issue where metadata is not applied to a loop latch. (authored by sidbav, committed by anhtuyen).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D83869/new/

https://reviews.llvm.org/D83869

Files:
  llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
  llvm/test/Transforms/LoopSimplify/update_latch_md.ll


Index: llvm/test/Transforms/LoopSimplify/update_latch_md.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/LoopSimplify/update_latch_md.ll
@@ -0,0 +1,47 @@
+; RUN: opt -loop-simplify -S < %s | FileCheck %s
+
+; This will test whether or not the metadata from the current loop 1 latch
+; is removed, and applied to the new latch after running the loop-simplify
+; pass on this function. The loop simplify pass ensures that each loop has exit
+; blocks which only have predecessors that are inside of the loop. This
+; guarantees that the loop preheader/header will dominate the exit blocks. For
+; this function currently loop 2 does not have a dedicated exit block.
+
+; CHECK: loop_1_loopHeader.loopexit:
+; CHECK: br label %loop_1_loopHeader, !llvm.loop [[LOOP_1_LATCH_MD:![0-9]+]]
+; CHECK: loop_2_loopHeader
+; CHECK: br i1 %grt_B, label %loop_1_loopHeader.loopexit, label %loop_2_do
+; CHECK-NOT:  br i1 %grt_B, label %loop_1_loopHeader, label %loop_2_do, !llvm.loop{{.*}}
+
+define void @function(i32 %A) {
+entry:
+  %B = add i32 %A, 45
+  %C = add i32 %A, 22
+  br label %loop_1_loopHeader
+
+loop_1_loopHeader:                              ; preds = %loop_2_loopHeader, %entry
+  %loop_1_idx = phi i32 [ 1, %entry], [ %loop_1_update_idx, %loop_2_loopHeader ]
+  %grt_C = icmp slt i32 %loop_1_idx, %C
+  br i1 %grt_C, label %exit, label %loop_1_do
+
+loop_1_do:                                      ; preds = %loop_1_loopHeader
+  %loop_1_update_idx = add nuw nsw i32 %loop_1_idx, 1
+  br label %loop_2_loopHeader
+
+loop_2_loopHeader:                              ; preds = %loop_2_do, %_loop_1_do
+  %loop_2_idx = phi i32 [ 1, %loop_1_do ], [ %loop_2_update_idx, %loop_2_do ]
+  %grt_B = icmp slt i32 %loop_2_idx, %B
+  br i1 %grt_B, label %loop_1_loopHeader, label %loop_2_do, !llvm.loop !0
+
+loop_2_do:                                      ; preds = %loop_2_loopHeader
+  %loop_2_update_idx = add nuw nsw i32 %loop_2_idx, 1
+  br label %loop_2_loopHeader, !llvm.loop !2
+
+exit:                                       ; preds = %loop_1_loopHeader
+  ret void
+}
+
+!0 = distinct !{!0, !1}
+!1 = !{!"llvm.loop.unroll.disable"}
+!2 = distinct !{!2, !1}
+
Index: llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
===================================================================
--- llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
+++ llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -758,12 +758,22 @@
 
   // The new block unconditionally branches to the old block.
   BranchInst *BI = BranchInst::Create(BB, NewBB);
+
+  Loop *L = nullptr;
+  BasicBlock *OldLatch = nullptr;
   // Splitting the predecessors of a loop header creates a preheader block.
-  if (LI && LI->isLoopHeader(BB))
+  if (LI && LI->isLoopHeader(BB)) {
+    L = LI->getLoopFor(BB);
     // Using the loop start line number prevents debuggers stepping into the
     // loop body for this instruction.
-    BI->setDebugLoc(LI->getLoopFor(BB)->getStartLoc());
-  else
+    BI->setDebugLoc(L->getStartLoc());
+
+    // If BB is the header of the Loop, it is possible that the loop is
+    // modified, such that the current latch does not remain the latch of the
+    // loop. If that is the case, the loop metadata from the current latch needs
+    // to be applied to the new latch.
+    OldLatch = L->getLoopLatch();
+  } else
     BI->setDebugLoc(BB->getFirstNonPHIOrDbg()->getDebugLoc());
 
   // Move the edges from Preds to point to NewBB instead of BB.
@@ -798,6 +808,15 @@
     UpdatePHINodes(BB, NewBB, Preds, BI, HasLoopExit);
   }
 
+  if (OldLatch) {
+    BasicBlock *NewLatch = L->getLoopLatch();
+    if (NewLatch != OldLatch) {
+      MDNode *MD = OldLatch->getTerminator()->getMetadata("llvm.loop");
+      NewLatch->getTerminator()->setMetadata("llvm.loop", MD);
+      OldLatch->getTerminator()->setMetadata("llvm.loop", nullptr);
+    }
+  }
+
   return NewBB;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83869.278762.patch
Type: text/x-patch
Size: 3921 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200717/636c322d/attachment-0001.bin>


More information about the llvm-commits mailing list