[DebugInfo] Assign best possible debugloc to bundle (#164573)

The debug info attached to the BUNDLE is the first instruction in the
BUNDLE, even if a better debug info (line:column) is present in the
later instructions of the bundle. The patch tries to get a better debug
info first. If not, then a worse debug info without line number is
chosen.

---------

Co-authored-by: Vladislav Dzhidzhoev <dzhidzhoev@gmail.com>
Co-authored-by: Orlando Cazalet-Hyams <orlandoch.och@gmail.com>
This commit is contained in:
Santanu Das 2025-11-05 20:26:00 +05:30 committed by GitHub
parent 3426f9c481
commit 63d6e3eb46
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 63 additions and 7 deletions

View File

@ -83,15 +83,21 @@ llvm::createUnpackMachineBundles(
return new UnpackMachineBundles(std::move(Ftor));
}
/// Return the first found DebugLoc that has a DILocation, given a range of
/// instructions. The search range is from FirstMI to LastMI (exclusive). If no
/// DILocation is found, then an empty location is returned.
/// Return the first DebugLoc that has line number information, given a
/// range of instructions. The search range is from FirstMI to LastMI
/// (exclusive). Otherwise return the first DILocation or an empty location if
/// there are none.
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI,
MachineBasicBlock::instr_iterator LastMI) {
for (auto MII = FirstMI; MII != LastMI; ++MII)
if (MII->getDebugLoc())
return MII->getDebugLoc();
return DebugLoc();
DebugLoc DL;
for (auto MII = FirstMI; MII != LastMI; ++MII) {
if (DebugLoc MIIDL = MII->getDebugLoc()) {
if (MIIDL.getLine() != 0)
return MIIDL;
DL = MIIDL.get();
}
}
return DL;
}
/// Check if target reg is contained in given lists, which are:

View File

@ -0,0 +1,2 @@
if not "Hexagon" in config.root.targets:
config.unsupported = True

View File

@ -0,0 +1,48 @@
# RUN: llc -mtriple=hexagon -run-pass hexagon-packetizer %s -o - | FileCheck %s
# CHECK-LABEL: name: factorial
# The first bundle in bb.0 should have debug-location !19 (line 9),
# not !18 (line 0) from the DBG_VALUE instructions.
# CHECK: bb.0:
# CHECK: BUNDLE {{.*}}line: 9
--- |
define void @factorial() { ret void }
!llvm.dbg.cu = !{!2}
!llvm.module.flags = !{!6, !7}
!2 = distinct !DICompileUnit(language: DW_LANG_C11, file: !3, producer: "test", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
!3 = !DIFile(filename: "fact.c", directory: "/test")
!5 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!6 = !{i32 2, !"Debug Info Version", i32 3}
!7 = !{i32 1, !"wchar_size", i32 4}
!12 = distinct !DISubprogram(name: "factorial", scope: !3, file: !3, line: 6, type: !13, scopeLine: 7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2)
!13 = !DISubroutineType(types: !14)
!14 = !{!5, !5}
!16 = !DILocalVariable(name: "i", arg: 1, scope: !12, file: !3, line: 6, type: !5)
!18 = !DILocation(line: 0, scope: !12)
!19 = !DILocation(line: 9, column: 9, scope: !12)
!21 = !DILocation(line: 9, column: 7, scope: !12)
...
---
name: factorial
alignment: 16
tracksRegLiveness: true
body: |
bb.0:
liveins: $r0
DBG_VALUE $r0, $noreg, !16, !DIExpression(), debug-location !18
$r2 = A2_tfr $r0
DBG_VALUE $r2, $noreg, !16, !DIExpression(), debug-location !18
renamable $p0 = C2_cmpeqi killed $r0, 1, debug-location !19
renamable $r0 = A2_tfrsi 1
J2_jumpt killed $p0, %bb.1, implicit-def $pc, debug-location !21
bb.1:
PS_jmpret $r31, implicit-def dead $pc
...