Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3605,6 +3605,9 @@ foldCondBranchOnValueKnownInPredecessorImpl(BranchInst *BI, DomTreeUpdater *DTU,
EdgeBB->setName(RealDest->getName() + ".critedge");
EdgeBB->moveBefore(RealDest);

if (MDNode *LoopMD = BI->getMetadata(LLVMContext::MD_loop))
EdgeBB->getTerminator()->setMetadata(LLVMContext::MD_loop, LoopMD);

// Update PHI nodes.
addPredecessorToBlock(RealDest, EdgeBB, BB);

Expand Down
49 changes: 49 additions & 0 deletions llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -passes='simplifycfg' -S < %s | FileCheck %s

; CHECK: br i1 %2, label %loop2, label %loop1
; CHECK-SAME: llvm.loop

define void @test(i32 %1 ) {
; CHECK-LABEL: define void @test(
; CHECK-SAME: i32 [[TMP0:%.*]]) {
; CHECK-NEXT: [[_CRITEDGE:.*:]]
; CHECK-NEXT: br label %[[LOOP1:.*]]
; CHECK: [[LOOP1]]:
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 0
; CHECK-NEXT: br i1 [[TMP1]], label %[[LOOP2:.*]], label %[[BB3:.*]]
; CHECK: [[LOOP2]]:
; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ true, %[[LOOP1]] ], [ false, %[[LOOP2]] ]
; CHECK-NEXT: br i1 [[TMP2]], label %[[LOOP2]], label %[[LOOP1]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: [[BB3]]:
; CHECK-NEXT: ret void
;
.critedge:
br label %loop1

loop1: ; preds = %loop2, .critedge
%111 = icmp eq i32 %1, 0
br i1 %111, label %112, label %156

112: ; preds = %loop1
br label %loop2

loop2: ; preds = %149, %112
%148 = phi i1 [ false, %149 ], [ true, %112 ]
br i1 %148, label %149, label %loop1, !llvm.loop !32

149: ; preds = %loop2
br label %loop2

156: ; preds = loop1
ret void
}

!32 = distinct !{!32, !33, !34}
!33 = !{!"llvm.loop.unroll.enable"}
!34 = !{!"llvm.loop.unroll.full"}
;.
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
; CHECK: [[META1]] = !{!"llvm.loop.unroll.enable"}
; CHECK: [[META2]] = !{!"llvm.loop.unroll.full"}
;.
Loading