Skip to content

Commit 35536a8

Browse files
committed
[AMDGPU] Serialize WWM_REG vreg flag
1 parent f494d56 commit 35536a8

File tree

5 files changed

+54
-2
lines changed

5 files changed

+54
-2
lines changed

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,6 +1628,21 @@ bool GCNTargetMachine::parseMachineFunctionInfo(
16281628
MFI->reserveWWMRegister(ParsedReg);
16291629
}
16301630

1631+
auto setRegisterFlags = [&](const VRegInfo &Info) {
1632+
for (const auto &Flag : Info.Flags) {
1633+
MFI->setFlag(Info.VReg, Flag);
1634+
}
1635+
};
1636+
1637+
for (const auto &P : PFS.VRegInfosNamed) {
1638+
const VRegInfo &Info = *P.second;
1639+
setRegisterFlags(Info);
1640+
}
1641+
for (const auto &P : PFS.VRegInfos) {
1642+
const VRegInfo &Info = *P.second;
1643+
setRegisterFlags(Info);
1644+
}
1645+
16311646
auto parseAndCheckArgument = [&](const std::optional<yaml::SIArgument> &A,
16321647
const TargetRegisterClass &RC,
16331648
ArgDescriptor &Arg, unsigned UserSGPRs,

llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -684,8 +684,8 @@ class SIMachineFunctionInfo final : public AMDGPUMachineFunction,
684684

685685
void setFlag(Register Reg, uint8_t Flag) {
686686
assert(Reg.isVirtual());
687-
if (VRegFlags.inBounds(Reg))
688-
VRegFlags[Reg] |= Flag;
687+
VRegFlags.grow(Reg);
688+
VRegFlags[Reg] |= Flag;
689689
}
690690

691691
bool checkFlag(Register Reg, uint8_t Flag) const {

llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3614,3 +3614,14 @@ SIRegisterInfo::getSubRegAlignmentNumBits(const TargetRegisterClass *RC,
36143614
}
36153615
return 0;
36163616
}
3617+
3618+
SmallVector<std::string>
3619+
SIRegisterInfo::getVRegFlagsOfReg(Register Reg,
3620+
const MachineFunction &MF) const {
3621+
SmallVector<std::string> RegFlags;
3622+
const SIMachineFunctionInfo *FuncInfo = MF.getInfo<SIMachineFunctionInfo>();
3623+
if (FuncInfo->checkFlag(Reg, AMDGPU::VirtRegFlag::WWM_REG)) {
3624+
RegFlags.push_back("WWM_REG");
3625+
}
3626+
return RegFlags;
3627+
}

llvm/lib/Target/AMDGPU/SIRegisterInfo.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,16 @@ class SIRegisterInfo final : public AMDGPUGenRegisterInfo {
449449
// No check if the subreg is supported by the current RC is made.
450450
unsigned getSubRegAlignmentNumBits(const TargetRegisterClass *RC,
451451
unsigned SubReg) const;
452+
453+
std::pair<bool, uint8_t> getVRegFlagValue(StringRef Name) const override {
454+
if (Name == "WWM_REG") {
455+
return {true, AMDGPU::VirtRegFlag::WWM_REG};
456+
}
457+
return {false, 0};
458+
}
459+
460+
SmallVector<std::string>
461+
getVRegFlagsOfReg(Register Reg, const MachineFunction &MF) const override;
452462
};
453463

454464
namespace AMDGPU {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# RUN: llc -mtriple=amdgcn -run-pass=none -o - %s | FileCheck %s
2+
# This test ensures that the MIR parser parses virtual register flags correctly
3+
4+
---
5+
name: vregs
6+
# CHECK: registers:
7+
# CHECK-NEXT: - { id: 0, class: vgpr_32, preferred-register: '$vgpr1', flags: [ WWM_REG ] }
8+
# CHECK-NEXT: - { id: 1, class: sgpr_64, preferred-register: '$sgpr0_sgpr1', flags: [ ] }
9+
# CHECK-NEXT: - { id: 2, class: sgpr_64, preferred-register: '', flags: [ ] }
10+
registers:
11+
- { id: 0, class: vgpr_32, preferred-register: $vgpr1, flags: [ WWM_REG ]}
12+
- { id: 1, class: sgpr_64, preferred-register: $sgpr0_sgpr1 }
13+
body: |
14+
bb.0:
15+
%2:sgpr_64 = COPY %1
16+
%1:sgpr_64 = COPY %0

0 commit comments

Comments
 (0)