From 569cd219c717dbcd16586d8ff5e4aaac6b737939 Mon Sep 17 00:00:00 2001 From: Michael Kuperstein Date: Fri, 16 Dec 2016 21:23:59 +0000 Subject: [PATCH] Preserve loop metadata when folding branches to a common destination. Differential Revision: https://reviews.llvm.org/D27830 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289992 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/SimplifyCFG.cpp | 5 ++++ .../preserve-llvm-loop-metadata.ll | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index a47d0774fa7..668e22f46f4 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -2792,6 +2792,11 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, unsigned BonusInstThreshold) { 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. diff --git a/test/Transforms/LoopSimplify/preserve-llvm-loop-metadata.ll b/test/Transforms/LoopSimplify/preserve-llvm-loop-metadata.ll index bd27794d193..c1397606487 100644 --- a/test/Transforms/LoopSimplify/preserve-llvm-loop-metadata.ll +++ b/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 @@ while.end: ; preds = %while.cond ; 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} -- 2.50.1