summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Morse <jeremy.morse.llvm@gmail.com>2019-03-11 11:48:57 +0000
committerJeremy Morse <jeremy.morse.llvm@gmail.com>2019-03-11 11:48:57 +0000
commitb60aea41315c2a4a432483e57ea5065655bf4e95 (patch)
treefad5e44d400620e0c9a131ab37e94caa210f8932
parentd8a5c6cf19e7245f0c9d076831ebeabc29d6e174 (diff)
downloadbcm5719-llvm-b60aea41315c2a4a432483e57ea5065655bf4e95.tar.gz
bcm5719-llvm-b60aea41315c2a4a432483e57ea5065655bf4e95.zip
[JumpThreading] Retain debug info when replacing branch instructions
Fixes bug 37966: https://bugs.llvm.org/show_bug.cgi?id=37966 The Jump Threading pass will replace certain conditional branch instructions with unconditional branches when it can prove that only one branch can occur. Prior to this patch, it would not carry the debug info from the old instruction to the new one. This patch fixes the bug described by copying the debug info from the conditional branch instruction to the new unconditional branch instruction, and adds a regression test for the Jump Threading pass that covers this case. Patch by Stephen Tozer! Differential Revision: https://reviews.llvm.org/D58963 llvm-svn: 355822
-rw-r--r--llvm/lib/Transforms/Scalar/JumpThreading.cpp7
-rw-r--r--llvm/test/Transforms/JumpThreading/branch-debug-info.ll41
2 files changed, 46 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index 7d6ffa0e0e4..264ea3aa22a 100644
--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -1142,7 +1142,9 @@ bool JumpThreadingPass::ProcessBlock(BasicBlock *BB) {
unsigned ToKeep = Ret == LazyValueInfo::True ? 0 : 1;
BasicBlock *ToRemoveSucc = CondBr->getSuccessor(ToRemove);
ToRemoveSucc->removePredecessor(BB, true);
- BranchInst::Create(CondBr->getSuccessor(ToKeep), CondBr);
+ BranchInst *UncondBr =
+ BranchInst::Create(CondBr->getSuccessor(ToKeep), CondBr);
+ UncondBr->setDebugLoc(CondBr->getDebugLoc());
CondBr->eraseFromParent();
if (CondCmp->use_empty())
CondCmp->eraseFromParent();
@@ -1245,7 +1247,8 @@ bool JumpThreadingPass::ProcessImpliedCondition(BasicBlock *BB) {
BasicBlock *KeepSucc = BI->getSuccessor(*Implication ? 0 : 1);
BasicBlock *RemoveSucc = BI->getSuccessor(*Implication ? 1 : 0);
RemoveSucc->removePredecessor(BB);
- BranchInst::Create(KeepSucc, BI);
+ BranchInst *UncondBI = BranchInst::Create(KeepSucc, BI);
+ UncondBI->setDebugLoc(BI->getDebugLoc());
BI->eraseFromParent();
DTU->applyUpdatesPermissive({{DominatorTree::Delete, BB, RemoveSucc}});
return true;
diff --git a/llvm/test/Transforms/JumpThreading/branch-debug-info.ll b/llvm/test/Transforms/JumpThreading/branch-debug-info.ll
new file mode 100644
index 00000000000..773ed0f71de
--- /dev/null
+++ b/llvm/test/Transforms/JumpThreading/branch-debug-info.ll
@@ -0,0 +1,41 @@
+; RUN: opt %s -debugify -jump-threading -S | FileCheck %s
+; Tests Bug 37966
+
+define void @test0(i32 %i) {
+; CHECK-LABEL: @test0(
+; CHECK: left:
+; CHECK: br label %left, !dbg ![[DBG0:[0-9]+]]
+ entry:
+ %c0 = icmp ult i32 %i, 5
+ br i1 %c0, label %left, label %right
+
+ left:
+ br i1 %c0, label %left, label %right
+
+ right:
+ ret void
+}
+
+define void @test1(i32 %i, i32 %len) {
+; CHECK-LABEL: @test1(
+; CHECK: left:
+; CHECK: br label %right, !dbg ![[DBG1:[0-9]+]]
+ entry:
+ %i.inc = add nuw i32 %i, 1
+ %c0 = icmp ult i32 %i.inc, %len
+ br i1 %c0, label %left, label %right
+
+ left:
+ %c1 = icmp ult i32 %i, %len
+ br i1 %c1, label %right, label %left0
+
+ left0:
+ ret void
+
+ right:
+ ret void
+}
+
+; CHECK-DAG: ![[DBG0]] = !DILocation(
+; CHECK-DAG: ![[DBG1]] = !DILocation(
+
OpenPOWER on IntegriCloud