Skip to content

Commit 845edee

Browse files
authored
[HeterogeneousDwarf] Thread-focus vector registers in AsmPrinter (llvm#765)
2 parents 7d4d3ca + e945943 commit 845edee

File tree

7 files changed

+56
-14
lines changed

7 files changed

+56
-14
lines changed

llvm/include/llvm/CodeGen/TargetRegisterInfo.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,6 +1111,14 @@ class TargetRegisterInfo : public MCRegisterInfo {
11111111
prependOffsetExpression(const DIExpression *Expr, unsigned PrependFlags,
11121112
const StackOffset &Offset) const;
11131113

1114+
/// If the register corresponding to DwarfReg is a vector register that holds
1115+
/// a per-thread value in each lane, return the size in bytes of the lane.
1116+
/// Otherwise return nullopt.
1117+
virtual std::optional<unsigned> getDwarfRegLaneSize(int64_t DwarfReg,
1118+
bool isEH) const {
1119+
return std::nullopt;
1120+
}
1121+
11141122
/// Spill the register so it can be used by the register scavenger.
11151123
/// Return true if the register was spilled, false otherwise.
11161124
/// If this function does not spill the register, the scavenger

llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,7 @@ std::optional<NewOpResult> DwarfExpression::traverse(DIOp::Arg Arg,
951951

952952
if (Entry.isLocation()) {
953953
assert(DwarfRegs.empty() && "unconsumed registers?");
954-
if (!addMachineReg(*TRI, Entry.getLoc().getReg())) {
954+
if (!TRI || !addMachineReg(*TRI, Entry.getLoc().getReg())) {
955955
DwarfRegs.clear();
956956
return std::nullopt;
957957
}
@@ -968,8 +968,19 @@ std::optional<NewOpResult> DwarfExpression::traverse(DIOp::Arg Arg,
968968
SubRegOffset /= 8;
969969
SubRegSize /= 8;
970970

971+
auto focusThreadIfRequired = [this](int64_t DwarfRegNo) {
972+
// FIXME: This should be represented in the DIExpression.
973+
if (auto LaneSize = TRI->getDwarfRegLaneSize(DwarfRegNo, false)) {
974+
emitUserOp(dwarf::DW_OP_LLVM_USER_push_lane);
975+
emitConstu(*LaneSize);
976+
emitOp(dwarf::DW_OP_mul);
977+
emitUserOp(dwarf::DW_OP_LLVM_USER_offset);
978+
}
979+
};
980+
971981
if (Regs.size() == 1) {
972982
addReg(Regs[0].DwarfRegNo, Regs[0].Comment);
983+
focusThreadIfRequired(Regs[0].DwarfRegNo);
973984

974985
if (SubRegOffset) {
975986
emitUserOp(dwarf::DW_OP_LLVM_USER_offset_uconst);
@@ -994,8 +1005,10 @@ std::optional<NewOpResult> DwarfExpression::traverse(DIOp::Arg Arg,
9941005
for (auto &Reg : Regs) {
9951006
if (Reg.SubRegSize % 8)
9961007
return std::nullopt;
997-
if (Reg.DwarfRegNo >= 0)
1008+
if (Reg.DwarfRegNo >= 0) {
9981009
addReg(Reg.DwarfRegNo, Reg.Comment);
1010+
focusThreadIfRequired(Regs[0].DwarfRegNo);
1011+
}
9991012
emitOp(dwarf::DW_OP_piece);
10001013
emitUnsigned(Reg.SubRegSize / 8);
10011014
}

llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,6 +1139,16 @@ bool SIRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
11391139
SIInstrFlags::FlatScratch);
11401140
}
11411141

1142+
std::optional<unsigned> SIRegisterInfo::getDwarfRegLaneSize(int64_t DwarfReg,
1143+
bool IsEH) const {
1144+
if (std::optional<MCRegister> Reg = getLLVMRegNum(DwarfReg, IsEH)) {
1145+
const TargetRegisterClass *RC = getPhysRegBaseClass(*Reg);
1146+
if (RC == &AMDGPU::VGPR_32RegClass || RC == &AMDGPU::AGPR_32RegClass)
1147+
return 4;
1148+
}
1149+
return std::nullopt;
1150+
}
1151+
11421152
const TargetRegisterClass *SIRegisterInfo::getPointerRegClass(
11431153
const MachineFunction &MF, unsigned Kind) const {
11441154
// This is inaccurate. It depends on the instruction and address space. The

llvm/lib/Target/AMDGPU/SIRegisterInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ class SIRegisterInfo final : public AMDGPUGenRegisterInfo {
143143
bool isFrameOffsetLegal(const MachineInstr *MI, Register BaseReg,
144144
int64_t Offset) const override;
145145

146+
std::optional<unsigned> getDwarfRegLaneSize(int64_t DwarfReg,
147+
bool isEH) const override;
148+
146149
const TargetRegisterClass *getPointerRegClass(
147150
const MachineFunction &MF, unsigned Kind = 0) const override;
148151

llvm/test/DebugInfo/AMDGPU/heterogeneous-dwarf-diop-diexpression-args.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ define amdgpu_kernel void @int64_k(i64 %a) !dbg !31 {
2525
; CHECK-LABEL: DW_AT_name ("as1_ptr")
2626
define void @as1_ptr(ptr addrspace(1) %ptr) !dbg !16 {
2727
; CHECK: DW_AT_location
28-
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_piece 0x4, DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_piece 0x4)
28+
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4)
2929
tail call void @llvm.dbg.value(metadata ptr addrspace(1) %ptr, metadata !17, metadata !DIExpression(DIOpArg(0, ptr addrspace(1)))), !dbg !20
3030
store ptr addrspace(1) %ptr, ptr @glob_ptr, align 8, !dbg !20
3131
ret void, !dbg !20
@@ -34,15 +34,15 @@ define void @as1_ptr(ptr addrspace(1) %ptr) !dbg !16 {
3434
; CHECK-LABEL: DW_AT_name ("int64")
3535
define void @int64(i64 %a) !dbg !21 {
3636
; CHECK: DW_AT_location
37-
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_piece 0x4, DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_piece 0x4)
37+
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4)
3838
tail call void @llvm.dbg.value(metadata i64 %a, metadata !22, metadata !DIExpression(DIOpArg(0, i64))), !dbg !23
3939
store i64 %a, ptr @glob_ptr, align 8, !dbg !23
4040
ret void, !dbg !24
4141
}
4242

4343
; CHECK-LABEL: DW_AT_name ("int32")
4444
define void @int32(i32 %a) !dbg !25 {
45-
; CHECK: DW_AT_location (DW_OP_regx 0x{{[0-9a-z]+}})
45+
; CHECK: DW_AT_location (DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset)
4646
tail call void @llvm.dbg.value(metadata i32 %a, metadata !26, metadata !DIExpression(DIOpArg(0, i32))), !dbg !27
4747
store i32 %a, ptr @glob_ptr, align 4, !dbg !27
4848
ret void, !dbg !27
@@ -51,7 +51,7 @@ define void @int32(i32 %a) !dbg !25 {
5151
; CHECK-LABEL: DW_AT_name ("gen_ptr")
5252
define void @gen_ptr(ptr %ptr) !dbg !28 {
5353
; CHECK: DW_AT_location
54-
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_piece 0x4, DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_piece 0x4)
54+
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_regx 0x{{[0-9a-z]+}}, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4)
5555
tail call void @llvm.dbg.value(metadata ptr %ptr, metadata !29, metadata !DIExpression(DIOpArg(0, ptr))), !dbg !30
5656
store ptr %ptr, ptr @glob_ptr, align 8, !dbg !30
5757
ret void, !dbg !30

llvm/test/DebugInfo/AMDGPU/heterogeneous-dwarf-diop-diexpression-subregs.mir

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
define void @kern() #0 !dbg !9 {
88
ret void, !dbg !16
99
}
10-
attributes #0 = { convergent mustprogress noinline nounwind optnone "amdgpu-stack-objects" "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="gfx900" "target-features"="+16-bit-insts,+ci-insts,+dpp,+flat-address-space,+gfx8-insts,+gfx9-insts,+s-memrealtime,+s-memtime-inst" "uniform-work-group-size"="false" }
10+
attributes #0 = { noinline optnone }
1111

1212
!llvm.dbg.cu = !{!0}
1313
!llvm.module.flags = !{!2, !3, !4, !5, !6, !7}
@@ -39,6 +39,7 @@
3939
!23 = !DILocalVariable(name: "with_frags", scope: !9, file: !1, line: 1, type: !15)
4040
!24 = !DILocalVariable(name: "sgpr", scope: !9, file: !1, line: 1, type: !14)
4141
!25 = !DILocalVariable(name: "vgpr", scope: !9, file: !1, line: 1, type: !14)
42+
!26 = !DILocalVariable(name: "vgpr_frags", scope: !9, file: !1, line: 1, type: !15)
4243

4344
...
4445
---
@@ -58,15 +59,15 @@ body: |
5859
; CHECK-NEXT: DW_AT_name ("s_s")
5960
DBG_VALUE renamable $sgpr42_sgpr43, $noreg, !19, !DIExpression(DIOpArg(0, i64)), debug-location !16
6061
61-
; CHECK: DW_AT_location (DW_OP_regx VGPR42)
62+
; CHECK: DW_AT_location (DW_OP_regx VGPR42, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset)
6263
; CHECK-NEXT: DW_AT_name ("v_lo16")
6364
DBG_VALUE renamable $vgpr42_lo16, $noreg, !20, !DIExpression(DIOpArg(0, i16)), debug-location !16
6465
65-
; CHECK: DW_AT_location (DW_OP_regx VGPR42, DW_OP_LLVM_user DW_OP_LLVM_offset_uconst 0x2)
66+
; CHECK: DW_AT_location (DW_OP_regx VGPR42, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_LLVM_user DW_OP_LLVM_offset_uconst 0x2)
6667
; CHECK-NEXT: DW_AT_name ("v_hi16")
6768
DBG_VALUE renamable $vgpr42_hi16, $noreg, !21, !DIExpression(DIOpArg(0, i16)), debug-location !16
6869
69-
; CHECK: DW_AT_location (DW_OP_regx VGPR42, DW_OP_piece 0x4, DW_OP_regx VGPR43, DW_OP_piece 0x4, DW_OP_LLVM_user DW_OP_LLVM_piece_end)
70+
; CHECK: DW_AT_location (DW_OP_regx VGPR42, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_regx VGPR43, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_LLVM_user DW_OP_LLVM_piece_end)
7071
; CHECK-NEXT: DW_AT_name ("v_v")
7172
DBG_VALUE renamable $vgpr42_vgpr43, $noreg, !22, !DIExpression(DIOpArg(0, i64)), debug-location !16
7273
@@ -81,10 +82,17 @@ body: |
8182
; CHECK-NEXT: DW_AT_name ("sgpr")
8283
DBG_VALUE $sgpr100, $noreg, !24, !DIExpression(DIOpArg(0, i32)), debug-location !16
8384
84-
; CHECK: DW_AT_location (DW_OP_regx VGPR100)
85+
; CHECK: DW_AT_location (DW_OP_regx VGPR100, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset)
8586
; CHECK-NEXT: ("vgpr")
8687
DBG_VALUE $vgpr100, $noreg, !25, !DIExpression(DIOpArg(0, i32)), debug-location !16
8788
89+
; CHECK: DW_TAG_variable
90+
; CHECK-NEXT: DW_AT_location (indexed ({{.*}}) loclist = {{.*}}:
91+
; CHECK-NEXT: [{{.*}}): DW_OP_lit0, DW_OP_regx VGPR42, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_regx VGPR43, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_LLVM_user DW_OP_LLVM_piece_end, DW_OP_swap, DW_OP_drop, DW_OP_piece 0x4, DW_OP_lit0, DW_OP_regx VGPR44, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_regx VGPR45, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_LLVM_user DW_OP_LLVM_piece_end, DW_OP_swap, DW_OP_drop, DW_OP_piece 0x4)
92+
; CHECK-NEXT: DW_AT_name ("vgpr_frags")
93+
DBG_VALUE renamable $vgpr42_vgpr43, $noreg, !26, !DIExpression(DIOpArg(0, i64), DIOpFragment(0, 32)), debug-location !16
94+
DBG_VALUE renamable $vgpr44_vgpr45, $noreg, !26, !DIExpression(DIOpArg(0, i64), DIOpFragment(32, 32)), debug-location !16
95+
8896
S_ENDPGM 0, debug-location !16
8997
9098
...

llvm/test/DebugInfo/AMDGPU/heterogeneous-dwarf-diop-frags.mir

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,18 @@ body: |
5555
5656
5757
; CHECK: DW_AT_location
58-
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_piece 0x2, DW_OP_regx VGPR44, DW_OP_piece 0x4, DW_OP_regx VGPR45, DW_OP_piece 0x2
58+
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_piece 0x2, DW_OP_regx VGPR44, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x4, DW_OP_regx VGPR45, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x2
5959
DBG_VALUE renamable $vgpr43, $noreg, !18, !DIExpression(DW_OP_LLVM_poisoned, DW_OP_LLVM_fragment, 0, 32), debug-location !14
6060
DBG_VALUE renamable $vgpr44, $noreg, !18, !DIExpression(DIOpArg(0, i32), DIOpFragment(16, 32)), debug-location !14
6161
DBG_VALUE renamable $vgpr45, $noreg, !18, !DIExpression(DIOpArg(0, i32), DIOpFragment(48, 16)), debug-location !14
6262
S_NOP 0, debug-location !14
6363
64-
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx VGPR46, DW_OP_piece 0x1, DW_OP_piece 0x1, DW_OP_LLVM_user DW_OP_LLVM_undefined, DW_OP_piece 0x2, DW_OP_piece 0x2, DW_OP_regx VGPR45, DW_OP_piece 0x2
64+
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx VGPR46, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x1, DW_OP_piece 0x1, DW_OP_LLVM_user DW_OP_LLVM_undefined, DW_OP_piece 0x2, DW_OP_piece 0x2, DW_OP_regx VGPR45, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x2
6565
DBG_VALUE renamable $vgpr46, $noreg, !18, !DIExpression(DIOpArg(0, i32), DIOpFragment(0, 8)), debug-location !15
6666
DBG_VALUE renamable $vgpr47, $noreg, !18, !DIExpression(DW_OP_LLVM_poisoned, DW_OP_LLVM_fragment, 16, 16), debug-location !15
6767
S_NOP 0, debug-location !15
6868
69-
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx VGPR46, DW_OP_piece 0x1, DW_OP_LLVM_user DW_OP_LLVM_undefined, DW_OP_piece 0x7
69+
; CHECK-NEXT: [0x{{[0-9a-z]+}}, 0x{{[0-9a-z]+}}): DW_OP_regx VGPR46, DW_OP_LLVM_user DW_OP_LLVM_push_lane, DW_OP_lit4, DW_OP_mul, DW_OP_LLVM_user DW_OP_LLVM_offset, DW_OP_piece 0x1, DW_OP_LLVM_user DW_OP_LLVM_undefined, DW_OP_piece 0x7
7070
; CHECK-NEXT: DW_AT_name ("overlaps")
7171
DBG_VALUE renamable $vgpr48, $noreg, !18, !DIExpression(DW_OP_LLVM_poisoned, DW_OP_LLVM_fragment, 8, 56), debug-location !16
7272

0 commit comments

Comments
 (0)