diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 8bba634521e3e..a396c5c0e1f44 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -3589,6 +3589,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); diff --git a/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll new file mode 100644 index 0000000000000..e11ba39a1424d --- /dev/null +++ b/llvm/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata-2.ll @@ -0,0 +1,47 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -passes='simplifycfg' -S < %s | FileCheck %s + + +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 +; +entry: + br label %loop1 + +loop1: ; preds = %loop2, %entry + %111 = icmp eq i32 %1, 0 + br i1 %111, label %trampoline, label %retlabel + +trampoline: ; preds = %loop1 + br label %loop2 + +loop2: ; preds = %loop2latch, %trampoline + %148 = phi i1 [ false, %loop2latch ], [ true, %trampoline ] + br i1 %148, label %loop2latch, label %loop1, !llvm.loop !32 + +loop2latch: ; preds = %loop2 + br label %loop2 + +retlabel: ; 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"} +;.