]> granicus.if.org Git - llvm/commitdiff
[SimplifyCFG] Retain debug info when threading jumps with critical edges
authorJeremy Morse <jeremy.morse.llvm@gmail.com>
Mon, 11 Mar 2019 16:23:59 +0000 (16:23 +0000)
committerJeremy Morse <jeremy.morse.llvm@gmail.com>
Mon, 11 Mar 2019 16:23:59 +0000 (16:23 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355833 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/SimplifyCFG.cpp
test/Transforms/SimplifyCFG/debug-info-thread-phi.ll [new file with mode: 0644]

index dbd8fb720e4f35e2cad9f125baee95a9b148ad61..c3e8203ef9e6c5833c6b72b46c1263c2075121a7 100644 (file)
@@ -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/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll b/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll
new file mode 100644 (file)
index 0000000..f7e91fe
--- /dev/null
@@ -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(