Index: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp =================================================================== --- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp +++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp @@ -2792,6 +2792,11 @@ PBI = New_PBI; } + // If BI was a loop latch, it may have had associated loop metadata. + // We need to copy it to the new latch, that is, PBI. + if (MDNode *LoopMD = BI->getMetadata(LLVMContext::MD_loop)) + PBI->setMetadata(LLVMContext::MD_loop, LoopMD); + // TODO: If BB is reachable from all paths through PredBlock, then we // could replace PBI's branch probabilities with BI's. Index: llvm/trunk/test/Transforms/LoopSimplify/preserve-llvm-loop-metadata.ll =================================================================== --- llvm/trunk/test/Transforms/LoopSimplify/preserve-llvm-loop-metadata.ll +++ llvm/trunk/test/Transforms/LoopSimplify/preserve-llvm-loop-metadata.ll @@ -1,5 +1,6 @@ ; RUN: opt -loop-simplify -S < %s | FileCheck %s +; CHECK-LABEL: @test1 define void @test1(i32 %n) { entry: br label %while.cond @@ -35,6 +36,33 @@ ; CHECK: if.else ; CHECK-NOT: br {{.*}}!llvm.loop{{.*}} +; CHECK-LABEL: @test2 +; CHECK: for.body: +; CHECK: br i1 %{{.*}}, label %for.body, label %cleanup.loopexit, !llvm.loop !0 +define void @test2(i32 %k) { +entry: + %cmp9 = icmp sgt i32 %k, 0 + br i1 %cmp9, label %for.body.preheader, label %cleanup + +for.body.preheader: ; preds = %entry + br label %for.body + +for.cond: ; preds = %for.body + %cmp = icmp slt i32 %inc, %k + br i1 %cmp, label %for.body, label %cleanup.loopexit, !llvm.loop !0 + +for.body: ; preds = %for.body.preheader, %for.cond + %i.010 = phi i32 [ %inc, %for.cond ], [ 0, %for.body.preheader ] + %cmp3 = icmp sgt i32 %i.010, 3 + %inc = add nsw i32 %i.010, 1 + br i1 %cmp3, label %cleanup.loopexit, label %for.cond + +cleanup.loopexit: ; preds = %for.body, %for.cond + br label %cleanup + +cleanup: ; preds = %cleanup.loopexit, %entry + ret void +} !0 = distinct !{!0, !1} !1 = !{!"llvm.loop.distribute.enable", i1 true}