1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

[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
This commit is contained in:
Jeremy Morse 2019-03-11 11:48:57 +00:00
parent 3e5b9fe4cd
commit 99177e68e5
2 changed files with 46 additions and 2 deletions

View File

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

View File

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