Skip to content

Commit c7107ca

Browse files
authored
[AMDGPU][NFCI] Mark AGPRs and VGPRs with different flags in HWEncoding. (#102650)
Simplifies checks for AGPRs and VGPRs and makes them more explicit and less fragile.
1 parent 7fe486a commit c7107ca

File tree

3 files changed

+25
-33
lines changed

3 files changed

+25
-33
lines changed

llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -533,27 +533,13 @@ void AMDGPUMCCodeEmitter::getAVOperandEncoding(
533533
unsigned Reg = MI.getOperand(OpNo).getReg();
534534
unsigned Enc = MRI.getEncodingValue(Reg);
535535
unsigned Idx = Enc & AMDGPU::HWEncoding::REG_IDX_MASK;
536-
bool IsVGPROrAGPR = Enc & AMDGPU::HWEncoding::IS_VGPR_OR_AGPR;
536+
bool IsVGPROrAGPR =
537+
Enc & (AMDGPU::HWEncoding::IS_VGPR | AMDGPU::HWEncoding::IS_AGPR);
537538

538539
// VGPR and AGPR have the same encoding, but SrcA and SrcB operands of mfma
539540
// instructions use acc[0:1] modifier bits to distinguish. These bits are
540541
// encoded as a virtual 9th bit of the register for these operands.
541-
bool IsAGPR = false;
542-
if (MRI.getRegClass(AMDGPU::AGPR_32RegClassID).contains(Reg) ||
543-
MRI.getRegClass(AMDGPU::AReg_64RegClassID).contains(Reg) ||
544-
MRI.getRegClass(AMDGPU::AReg_96RegClassID).contains(Reg) ||
545-
MRI.getRegClass(AMDGPU::AReg_128RegClassID).contains(Reg) ||
546-
MRI.getRegClass(AMDGPU::AReg_160RegClassID).contains(Reg) ||
547-
MRI.getRegClass(AMDGPU::AReg_192RegClassID).contains(Reg) ||
548-
MRI.getRegClass(AMDGPU::AReg_224RegClassID).contains(Reg) ||
549-
MRI.getRegClass(AMDGPU::AReg_256RegClassID).contains(Reg) ||
550-
MRI.getRegClass(AMDGPU::AReg_288RegClassID).contains(Reg) ||
551-
MRI.getRegClass(AMDGPU::AReg_320RegClassID).contains(Reg) ||
552-
MRI.getRegClass(AMDGPU::AReg_352RegClassID).contains(Reg) ||
553-
MRI.getRegClass(AMDGPU::AReg_384RegClassID).contains(Reg) ||
554-
MRI.getRegClass(AMDGPU::AReg_512RegClassID).contains(Reg) ||
555-
MRI.getRegClass(AMDGPU::AGPR_LO16RegClassID).contains(Reg))
556-
IsAGPR = true;
542+
bool IsAGPR = Enc & AMDGPU::HWEncoding::IS_AGPR;
557543

558544
Op = Idx | (IsVGPROrAGPR << 8) | (IsAGPR << 9);
559545
}
@@ -588,8 +574,9 @@ void AMDGPUMCCodeEmitter::getMachineOpValue(const MCInst &MI,
588574
if (MO.isReg()){
589575
unsigned Enc = MRI.getEncodingValue(MO.getReg());
590576
unsigned Idx = Enc & AMDGPU::HWEncoding::REG_IDX_MASK;
591-
bool IsVGPR = Enc & AMDGPU::HWEncoding::IS_VGPR_OR_AGPR;
592-
Op = Idx | (IsVGPR << 8);
577+
bool IsVGPROrAGPR =
578+
Enc & (AMDGPU::HWEncoding::IS_VGPR | AMDGPU::HWEncoding::IS_AGPR);
579+
Op = Idx | (IsVGPROrAGPR << 8);
593580
return;
594581
}
595582
unsigned OpNo = &MO - MI.begin();
@@ -603,7 +590,7 @@ void AMDGPUMCCodeEmitter::getMachineOpValueT16(
603590
if (MO.isReg()) {
604591
unsigned Enc = MRI.getEncodingValue(MO.getReg());
605592
unsigned Idx = Enc & AMDGPU::HWEncoding::REG_IDX_MASK;
606-
bool IsVGPR = Enc & AMDGPU::HWEncoding::IS_VGPR_OR_AGPR;
593+
bool IsVGPR = Enc & AMDGPU::HWEncoding::IS_VGPR;
607594
Op = Idx | (IsVGPR << 8);
608595
return;
609596
}
@@ -651,7 +638,7 @@ void AMDGPUMCCodeEmitter::getMachineOpValueT16Lo128(
651638
uint16_t Encoding = MRI.getEncodingValue(MO.getReg());
652639
unsigned RegIdx = Encoding & AMDGPU::HWEncoding::REG_IDX_MASK;
653640
bool IsHi = Encoding & AMDGPU::HWEncoding::IS_HI;
654-
bool IsVGPR = Encoding & AMDGPU::HWEncoding::IS_VGPR_OR_AGPR;
641+
bool IsVGPR = Encoding & AMDGPU::HWEncoding::IS_VGPR;
655642
assert((!IsVGPR || isUInt<7>(RegIdx)) && "VGPR0-VGPR127 expected!");
656643
Op = (IsVGPR ? 0x100 : 0) | (IsHi ? 0x80 : 0) | RegIdx;
657644
return;

llvm/lib/Target/AMDGPU/SIDefines.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,9 @@ enum : unsigned {
369369
namespace HWEncoding {
370370
enum : unsigned {
371371
REG_IDX_MASK = 0xff,
372-
IS_VGPR_OR_AGPR = 1 << 8,
373-
IS_HI = 1 << 9, // High 16-bit register.
372+
IS_VGPR = 1 << 8,
373+
IS_AGPR = 1 << 9,
374+
IS_HI = 1 << 10, // High 16-bit register.
374375
};
375376
} // namespace HWEncoding
376377

llvm/lib/Target/AMDGPU/SIRegisterInfo.td

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,17 @@ class SIRegisterTuples<list<SubRegIndex> Indices, RegisterClass RC,
122122
//===----------------------------------------------------------------------===//
123123
// Declarations that describe the SI registers
124124
//===----------------------------------------------------------------------===//
125-
class SIReg <string n, bits<8> regIdx = 0, bit isAGPROrVGPR = 0,
126-
bit isHi = 0> : Register<n> {
125+
class SIReg <string n, bits<8> regIdx = 0, bit isVGPR = 0,
126+
bit isAGPR = 0, bit isHi = 0> : Register<n> {
127127
let Namespace = "AMDGPU";
128128

129129
// These are generic helper values we use to form actual register
130130
// codes. They should not be assumed to match any particular register
131131
// encodings on any particular subtargets.
132132
let HWEncoding{7-0} = regIdx;
133-
let HWEncoding{8} = isAGPROrVGPR;
134-
let HWEncoding{9} = isHi;
133+
let HWEncoding{8} = isVGPR;
134+
let HWEncoding{9} = isAGPR;
135+
let HWEncoding{10} = isHi;
135136

136137
int Index = !cast<int>(regIdx);
137138
}
@@ -157,9 +158,9 @@ class SIRegisterClass <string n, list<ValueType> rTypes, int Align, dag rList>
157158
}
158159

159160
multiclass SIRegLoHi16 <string n, bits<8> regIdx, bit ArtificialHigh = 1,
160-
bit isAGPROrVGPR = 0> {
161-
def _LO16 : SIReg<n#".l", regIdx, isAGPROrVGPR>;
162-
def _HI16 : SIReg<!if(ArtificialHigh, "", n#".h"), regIdx, isAGPROrVGPR,
161+
bit isVGPR = 0, bit isAGPR = 0> {
162+
def _LO16 : SIReg<n#".l", regIdx, isVGPR, isAGPR>;
163+
def _HI16 : SIReg<!if(ArtificialHigh, "", n#".h"), regIdx, isVGPR, isAGPR,
163164
/* isHi */ 1> {
164165
let isArtificial = ArtificialHigh;
165166
}
@@ -169,7 +170,8 @@ multiclass SIRegLoHi16 <string n, bits<8> regIdx, bit ArtificialHigh = 1,
169170
let SubRegIndices = [lo16, hi16];
170171
let CoveredBySubRegs = !not(ArtificialHigh);
171172
let HWEncoding{7-0} = regIdx;
172-
let HWEncoding{8} = isAGPROrVGPR;
173+
let HWEncoding{8} = isVGPR;
174+
let HWEncoding{9} = isAGPR;
173175

174176
int Index = !cast<int>(regIdx);
175177
}
@@ -348,14 +350,16 @@ foreach Index = 0...105 in {
348350
// VGPR registers
349351
foreach Index = 0...255 in {
350352
defm VGPR#Index :
351-
SIRegLoHi16 <"v"#Index, Index, 0, 1>,
353+
SIRegLoHi16 <"v"#Index, Index, /* ArtificialHigh= */ 0,
354+
/* isVGPR= */ 1, /* isAGPR= */ 0>,
352355
DwarfRegNum<[!add(Index, 2560), !add(Index, 1536)]>;
353356
}
354357

355358
// AccVGPR registers
356359
foreach Index = 0...255 in {
357360
defm AGPR#Index :
358-
SIRegLoHi16 <"a"#Index, Index, 1, 1>,
361+
SIRegLoHi16 <"a"#Index, Index, /* ArtificialHigh= */ 1,
362+
/* isVGPR= */ 0, /* isAGPR= */ 1>,
359363
DwarfRegNum<[!add(Index, 3072), !add(Index, 2048)]>;
360364
}
361365

0 commit comments

Comments
 (0)