From 763ae301ec727b4ad3443962dacfd9f3b5e73221 Mon Sep 17 00:00:00 2001 From: Jeremy Morse Date: Mon, 11 Mar 2019 16:23:59 +0000 Subject: [PATCH] [SimplifyCFG] Retain debug info when threading jumps with critical edges Fixes bug 38023: https://bugs.llvm.org/show_bug.cgi?id=38023 The SimplifyCFG pass will perform jump threading in some cases where doing so is trivial and would simplify the CFG. When folding a series of blocks with redundant conditional branches into an unconditional "critical edge" block, it does not keep the debug location associated with the previous conditional branch. This patch fixes the bug described by copying the debug info from the old conditional branch to the new unconditional branch instruction, and adds a regression test for the SimplifyCFG pass that covers this case. Patch by Stephen Tozer! Differential Revision: https://reviews.llvm.org/D59206 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355833 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/SimplifyCFG.cpp | 3 +- .../SimplifyCFG/debug-info-thread-phi.ll | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/SimplifyCFG/debug-info-thread-phi.ll diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index dbd8fb720e4..c3e8203ef9e 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -2209,7 +2209,8 @@ static bool FoldCondBranchOnPHI(BranchInst *BI, const DataLayout &DL, BasicBlock *EdgeBB = BasicBlock::Create(BB->getContext(), RealDest->getName() + ".critedge", RealDest->getParent(), RealDest); - BranchInst::Create(RealDest, EdgeBB); + BranchInst *CritEdgeBranch = BranchInst::Create(RealDest, EdgeBB); + CritEdgeBranch->setDebugLoc(BI->getDebugLoc()); // Update PHI nodes. AddPredecessorToBlock(RealDest, EdgeBB, BB); diff --git a/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll b/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll new file mode 100644 index 00000000000..f7e91feb434 --- /dev/null +++ b/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll @@ -0,0 +1,38 @@ +; RUN: opt %s -debugify -simplifycfg -S | FileCheck %s +; Tests Bug 37966 + +define void @bar(i32 %aa) { +; CHECK-LABEL: @bar( +; CHECK: if.end.1.critedge: +; CHECK: br label %if.end.1, !dbg ![[DBG:[0-9]+]] +entry: + %aa.addr = alloca i32, align 4 + %bb = alloca i32, align 4 + store i32 %aa, i32* %aa.addr, align 4 + store i32 0, i32* %bb, align 4 + %tobool = icmp ne i32 %aa, 0 + br i1 %tobool, label %if.then, label %if.end + +if.then: ; preds = %entry + call void @foo() + br label %if.end + +if.end: ; preds = %if.then, %entry + store i32 1, i32* %bb, align 4 + br i1 %tobool, label %if.then.1, label %if.end.1 + +if.then.1: ; preds = %if.end + call void @foo() + br label %if.end.1 + +if.end.1: ; preds = %if.then.1, %if.end + store i32 2, i32* %bb, align 4 + br label %for.end + +for.end: ; preds = %if.end.1 + ret void +} + +declare void @foo() + +; CHECK: ![[DBG]] = !DILocation( -- 2.50.1