[PATCH] D83869: [Loop Simplify] Resolve an issue where metadata is not applied to a loop latch.
Sidharth Baveja via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 16 08:19:12 PDT 2020
sidbav updated this revision to Diff 278487.
sidbav added a comment.
Address review comments
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.278487.patch
Type: text/x-patch
Size: 3921 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200716/ae60d29b/attachment.bin>
More information about the llvm-commits
mailing list