Skip to content

Commit

Permalink
[TailDuplicator] Maintain DebugLoc for branch instructions
Browse files Browse the repository at this point in the history
Summary: Existing implementation of duplicateSimpleBB function drops DebugLoc metadata of branch instructions during the transformation. This patch addresses this issue by making newly created branch instructions to keep the metadata of replaced branch instructions.

Reviewers: qcolombet, craig.topper, aprantl, MatzeB, sanjoy, dblaikie

Reviewed By: dblaikie

Subscribers: dblaikie, llvm-commits

Differential Revision: https://reviews.llvm.org/D30026

llvm-svn: 296371
  • Loading branch information
taewookoh committed Feb 27, 2017
1 parent e2d1d3a commit a49eb85
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
3 changes: 2 additions & 1 deletion llvm/lib/CodeGen/TailDuplicator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,7 @@ bool TailDuplicator::duplicateSimpleBB(
if (PredTBB == NextBB && PredFBB == nullptr)
PredTBB = nullptr;

auto DL = PredBB->findBranchDebugLoc();
TII->removeBranch(*PredBB);

if (!PredBB->isSuccessor(NewTarget))
Expand All @@ -735,7 +736,7 @@ bool TailDuplicator::duplicateSimpleBB(
}

if (PredTBB)
TII->insertBranch(*PredBB, PredTBB, PredFBB, PredCond, DebugLoc());
TII->insertBranch(*PredBB, PredTBB, PredFBB, PredCond, DL);

TDBBs.push_back(PredBB);
}
Expand Down
56 changes: 56 additions & 0 deletions llvm/test/CodeGen/X86/tail-dup-debugloc.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
; RUN: llc -stop-after=tailduplication -march=x86-64 < %s | FileCheck %s
;
; Check that DebugLoc attached to the branch instruction of
; 'while.cond1.preheader.lr.ph' survives after tailduplication pass.
;
; CHECK: [[DLOC:![0-9]+]] = !DILocation(line: 9, column: 5, scope: !{{[0-9]+}})
; CHECK: [[VREG:%[^ ]+]] = COPY %rdi
; CHECK: TEST64rr [[VREG]], [[VREG]]
; CHECK-NEXT: JE_1 {{.+}}, debug-location [[DLOC]]
; CHECK-NEXT: JMP_1 {{.+}}, debug-location [[DLOC]]

target triple = "x86_64-unknown-linux-gnu"

%struct.Node = type { %struct.Node* }

define i32 @foo(%struct.Node* readonly %node, %struct.Node* readnone %root) !dbg !6 {
entry:
%cmp = icmp eq %struct.Node* %node, %root, !dbg !8
br i1 %cmp, label %while.end4, label %while.cond1.preheader.lr.ph, !dbg !10

while.cond1.preheader.lr.ph: ; preds = %entry
%tobool = icmp eq %struct.Node* %node, null
br i1 %tobool, label %while.cond1.preheader.us.preheader, label %while.body2.preheader, !dbg !11

while.body2.preheader: ; preds = %while.cond1.preheader.lr.ph
br label %while.body2, !dbg !11

while.cond1.preheader.us.preheader: ; preds = %while.cond1.preheader.lr.ph
br label %while.cond1.preheader.us, !dbg !10

while.cond1.preheader.us: ; preds = %while.cond1.preheader.us.preheader, %while.cond1.preheader.us
br label %while.cond1.preheader.us, !dbg !10

while.body2: ; preds = %while.body2.preheader, %while.body2
br label %while.body2, !dbg !11

while.end4: ; preds = %entry
ret i32 0, !dbg !12
}

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4}

!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, emissionKind: LineTablesOnly)
!1 = !DIFile(filename: "foo.c", directory: "b/")
!2 = !{}
!3 = !{i32 2, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{}
!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 5, type: !7, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2)
!7 = !DISubroutineType(types: !2)
!8 = !DILocation(line: 7, column: 15, scope: !9)
!9 = !DILexicalBlockFile(scope: !6, file: !1, discriminator: 2)
!10 = !DILocation(line: 7, column: 3, scope: !9)
!11 = !DILocation(line: 9, column: 5, scope: !9)
!12 = !DILocation(line: 14, column: 3, scope: !6)

0 comments on commit a49eb85

Please sign in to comment.