[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

llvm-svn: 355833
This commit is contained in:
Jeremy Morse 2019-03-11 16:23:59 +00:00
parent 33e498b785
commit 90ede5f4bf
2 changed files with 40 additions and 1 deletions

View File

@ -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);

View File

@ -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(