diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -148,7 +148,12 @@ Dest1->removePredecessor(BI->getParent()); // Replace the conditional branch with an unconditional one. - Builder.CreateBr(Dest1); + BranchInst *NewBI = Builder.CreateBr(Dest1); + + // Transfer the metadata to the new branch instruction. + NewBI->copyMetadata(*BI, {LLVMContext::MD_loop, LLVMContext::MD_dbg, + LLVMContext::MD_annotation}); + Value *Cond = BI->getCondition(); BI->eraseFromParent(); if (DeleteDeadConditions) diff --git a/llvm/test/Transforms/SimplifyCFG/commondest-loopid.ll b/llvm/test/Transforms/SimplifyCFG/commondest-loopid.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/SimplifyCFG/commondest-loopid.ll @@ -0,0 +1,19 @@ +; RUN: opt < %s -simplifycfg -S | FileCheck %s +; +; Ensure that the loop metadata is preserved when converting the +; conditional branch to an unconditional. + +define void @commondest_loopid(i1 %T) { +; CHECK-LABEL: @commondest_loopid( +; CHECK: !llvm.loop !0 +; CHECK: !0 = distinct !{!0, !1} +; CHECK: !1 = !{!"loopprop"} +entry: + br label %loop + +loop: + br i1 %T, label %loop, label %loop, !llvm.loop !0 +} + +!0 = distinct !{!0, !1} +!1 = !{!"loopprop"}