Skip to content

Commit f4a65de

Browse files
committed
[AMDGPU] Serialize WWM_REG vreg flag
1 parent 8e7f366 commit f4a65de

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
@@ -1716,6 +1716,21 @@ bool GCNTargetMachine::parseMachineFunctionInfo(
17161716
MFI->reserveWWMRegister(ParsedReg);
17171717
}
17181718

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

llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h

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

697697
void setFlag(Register Reg, uint8_t Flag) {
698698
assert(Reg.isVirtual());
699-
if (VRegFlags.inBounds(Reg))
700-
VRegFlags[Reg] |= Flag;
699+
VRegFlags.grow(Reg);
700+
VRegFlags[Reg] |= Flag;
701701
}
702702

703703
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
@@ -3851,3 +3851,14 @@ SIRegisterInfo::getSubRegAlignmentNumBits(const TargetRegisterClass *RC,
38513851
}
38523852
return 0;
38533853
}
3854+
3855+
SmallVector<std::string>
3856+
SIRegisterInfo::getVRegFlagsOfReg(Register Reg,
3857+
const MachineFunction &MF) const {
3858+
SmallVector<std::string> RegFlags;
3859+
const SIMachineFunctionInfo *FuncInfo = MF.getInfo<SIMachineFunctionInfo>();
3860+
if (FuncInfo->checkFlag(Reg, AMDGPU::VirtRegFlag::WWM_REG)) {
3861+
RegFlags.push_back("WWM_REG");
3862+
}
3863+
return RegFlags;
3864+
}

llvm/lib/Target/AMDGPU/SIRegisterInfo.h

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

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