forked from OSchip/llvm-project
[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:
parent
33e498b785
commit
90ede5f4bf
|
@ -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);
|
||||
|
|
|
@ -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(
|
Loading…
Reference in New Issue