summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Morse <jeremy.morse.llvm@gmail.com>2019-03-11 16:23:59 +0000
committerJeremy Morse <jeremy.morse.llvm@gmail.com>2019-03-11 16:23:59 +0000
commit90ede5f4bfe66a0c1b3f4616bb0cc50a6629c4ac (patch)
tree6fcc6dd6cce035bd9141c59891296d162ded08d6
parent33e498b785cf41f9617c813486c2dfe44cf4eca0 (diff)
downloadbcm5719-llvm-90ede5f4bfe66a0c1b3f4616bb0cc50a6629c4ac.tar.gz
bcm5719-llvm-90ede5f4bfe66a0c1b3f4616bb0cc50a6629c4ac.zip
[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
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyCFG.cpp3
-rw-r--r--llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll38
2 files changed, 40 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index dbd8fb720e4..c3e8203ef9e 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/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/llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll b/llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll
new file mode 100644
index 00000000000..f7e91feb434
--- /dev/null
+++ b/llvm/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(
OpenPOWER on IntegriCloud