Index: lib/Transforms/Utils/BreakCriticalEdges.cpp =================================================================== --- lib/Transforms/Utils/BreakCriticalEdges.cpp +++ lib/Transforms/Utils/BreakCriticalEdges.cpp @@ -160,6 +160,12 @@ BranchInst *NewBI = BranchInst::Create(DestBB, NewBB); NewBI->setDebugLoc(TI->getDebugLoc()); + // Move llvm.loop metadata (present if the old branch was the loop backedge) + if (MDNode *MD = TI->getMetadata("llvm.loop")) { + TI->setMetadata("llvm.loop", nullptr); + NewBI->setMetadata("llvm.loop", MD); + } + // Branch to the new block, breaking the edge. TI->setSuccessor(SuccNum, NewBB); Index: test/Bitcode/break-critical-edges-loop-metadata.ll =================================================================== --- /dev/null +++ test/Bitcode/break-critical-edges-loop-metadata.ll @@ -0,0 +1,41 @@ +; RUN: opt < %s -break-crit-edges -S | FileCheck %s + +; Check that the new loop backedges (after we split critical edges) +; will carry the same llvm.loop annotation as the old (critical) backedges. + +define void @jd(i32* nocapture %A) { +entry: + br label %outer.loop.header + +outer.loop.header: ; preds = %loop_exit3, %entry + %indvar = phi i64 [ 0, %entry ], [ %indvar_next, %loop_exit3 ] + %p_tmp7 = shl i64 %indvar, 9 + br label %inner.loop.header + +inner.loop.header: ; preds = %inner.loop.header, %outer.loop.header + %indvar4 = phi i64 [ 0, %outer.loop.header ], [ %indvar_next5, %inner.loop.header ] + %p_tmp = add nsw i64 %indvar4, %indvar + %p_tmp8 = add nsw i64 %indvar4, %p_tmp7 + %p_arrayidx = getelementptr inbounds i32* %A, i64 %p_tmp8 + %p_tmp9 = trunc i64 %p_tmp to i32 + store i32 %p_tmp9, i32* %p_arrayidx, align 4 + %indvar_next5 = add nsw i64 %indvar4, 1 + %exitcond = icmp eq i64 %indvar_next5, 512 +; This is a critical edge. + br i1 %exitcond, label %loop_exit3, label %inner.loop.header, !llvm.loop !0 +; CHECK: br label %inner.loop.header, !llvm.loop !0 + +loop_exit3: ; preds = %inner.loop.header + %indvar_next = add nsw i64 %indvar, 1 + %exitcond1 = icmp eq i64 %indvar_next, 1024 +; This is a critical edge. + br i1 %exitcond1, label %loop_exit, label %outer.loop.header, !llvm.loop !1 +; CHECK: br label %outer.loop.header, !llvm.loop !1 + +loop_exit: ; preds = %loop_exit3 + ret void + +} + +!0 = metadata !{metadata !0} +!1 = metadata !{metadata !1}