[llvm] r355822 - [JumpThreading] Retain debug info when replacing branch instructions

Jeremy Morse via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 11 04:48:57 PDT 2019


Author: jmorse
Date: Mon Mar 11 04:48:57 2019
New Revision: 355822

URL: http://llvm.org/viewvc/llvm-project?rev=355822&view=rev
Log:
[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

Added:
    llvm/trunk/test/Transforms/JumpThreading/branch-debug-info.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=355822&r1=355821&r2=355822&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp Mon Mar 11 04:48:57 2019
@@ -1142,7 +1142,9 @@ bool JumpThreadingPass::ProcessBlock(Bas
         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::ProcessImpliedCo
       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;

Added: llvm/trunk/test/Transforms/JumpThreading/branch-debug-info.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/branch-debug-info.ll?rev=355822&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/JumpThreading/branch-debug-info.ll (added)
+++ llvm/trunk/test/Transforms/JumpThreading/branch-debug-info.ll Mon Mar 11 04:48:57 2019
@@ -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(
+




More information about the llvm-commits mailing list