Skip to content

Commit 80207b7

Browse files
committed
[AMDGPU] Serialize WWM_REG vreg flag
1 parent 336b9bc commit 80207b7

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
@@ -1712,6 +1712,21 @@ bool GCNTargetMachine::parseMachineFunctionInfo(
17121712
MFI->reserveWWMRegister(ParsedReg);
17131713
}
17141714

1715+
auto setRegisterFlags = [&](const VRegInfo &Info) {
1716+
for (const auto &Flag : Info.Flags) {
1717+
MFI->setFlag(Info.VReg, Flag);
1718+
}
1719+
};
1720+
1721+
for (const auto &P : PFS.VRegInfosNamed) {
1722+
const VRegInfo &Info = *P.second;
1723+
setRegisterFlags(Info);
1724+
}
1725+
for (const auto &P : PFS.VRegInfos) {
1726+
const VRegInfo &Info = *P.second;
1727+
setRegisterFlags(Info);
1728+
}
1729+
17151730
auto parseAndCheckArgument = [&](const std::optional<yaml::SIArgument> &A,
17161731
const TargetRegisterClass &RC,
17171732
ArgDescriptor &Arg, unsigned UserSGPRs,

llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h

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

694694
void setFlag(Register Reg, uint8_t Flag) {
695695
assert(Reg.isVirtual());
696-
if (VRegFlags.inBounds(Reg))
697-
VRegFlags[Reg] |= Flag;
696+
VRegFlags.grow(Reg);
697+
VRegFlags[Reg] |= Flag;
698698
}
699699

700700
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
@@ -3839,3 +3839,14 @@ SIRegisterInfo::getSubRegAlignmentNumBits(const TargetRegisterClass *RC,
38393839
}
38403840
return 0;
38413841
}
3842+
3843+
SmallVector<std::string>
3844+
SIRegisterInfo::getVRegFlagsOfReg(Register Reg,
3845+
const MachineFunction &MF) const {
3846+
SmallVector<std::string> RegFlags;
3847+
const SIMachineFunctionInfo *FuncInfo = MF.getInfo<SIMachineFunctionInfo>();
3848+
if (FuncInfo->checkFlag(Reg, AMDGPU::VirtRegFlag::WWM_REG)) {
3849+
RegFlags.push_back("WWM_REG");
3850+
}
3851+
return RegFlags;
3852+
}

llvm/lib/Target/AMDGPU/SIRegisterInfo.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,16 @@ class SIRegisterInfo final : public AMDGPUGenRegisterInfo {
454454
// No check if the subreg is supported by the current RC is made.
455455
unsigned getSubRegAlignmentNumBits(const TargetRegisterClass *RC,
456456
unsigned SubReg) const;
457+
458+
std::pair<bool, uint8_t> getVRegFlagValue(StringRef Name) const override {
459+
if (Name == "WWM_REG") {
460+
return {true, AMDGPU::VirtRegFlag::WWM_REG};
461+
}
462+
return {false, 0};
463+
}
464+
465+
SmallVector<std::string>
466+
getVRegFlagsOfReg(Register Reg, const MachineFunction &MF) const override;
457467
};
458468

459469
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)