Skip to content

Commit 67fb474

Browse files
committed
AMDGPU: Use RegClassByHwMode to manage operand VGPR operand constraints
This removes special case processing in TargetInstrInfo::getRegClass to fixup register operands which depending on the subtarget support AGPRs, or require even aligned registers. This regresses assembler diagnostics, which currently work by hackily accepting invalid cases and then post-rejecting a validly parsed instruction. On the plus side this now emits a comment when disassembling unaligned registers for targets with the alignment requirement.
1 parent 480926a commit 67fb474

30 files changed

+2769
-2605
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.td

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2735,6 +2735,9 @@ def HasGetWaveIdInst : Predicate<"Subtarget->hasGetWaveIdInst()">,
27352735
def HasMAIInsts : Predicate<"Subtarget->hasMAIInsts()">,
27362736
AssemblerPredicate<(all_of FeatureMAIInsts)>;
27372737

2738+
def NotHasMAIInsts : Predicate<"!Subtarget->hasMAIInsts()">,
2739+
AssemblerPredicate<(all_of (not FeatureMAIInsts))>;
2740+
27382741
def HasSMemRealTime : Predicate<"Subtarget->hasSMemRealTime()">,
27392742
AssemblerPredicate<(all_of FeatureSMemRealTime)>;
27402743

@@ -2909,6 +2912,23 @@ def HasLdsBarrierArriveAtomic : Predicate<"Subtarget->hasLdsBarrierArriveAtomic(
29092912
def HasSetPrioIncWgInst : Predicate<"Subtarget->hasSetPrioIncWgInst()">,
29102913
AssemblerPredicate<(all_of FeatureSetPrioIncWgInst)>;
29112914

2915+
def NeedsAlignedVGPRs : Predicate<"Subtarget->needsAlignedVGPRs()">,
2916+
AssemblerPredicate<(all_of FeatureRequiresAlignedVGPRs)>;
2917+
2918+
def HasAVAlign2AndAVLoadStore : Predicate<"Subtarget->needsAlignedVGPRs() && Subtarget->hasMAIInsts()">;
2919+
def HasVGPRAlign2NoAGPR : Predicate<"Subtarget->needsAlignedVGPRs() && !Subtarget->hasMAIInsts()">;
2920+
2921+
//===----------------------------------------------------------------------===//
2922+
// HwModes
2923+
//===----------------------------------------------------------------------===//
2924+
2925+
// gfx90a-gfx950. Has AGPRs, and also the align2 VGPR/AGPR requirement
2926+
def AVAlign2LoadStoreMode : HwMode<[HasMAIInsts, NeedsAlignedVGPRs]>;
2927+
2928+
// gfx1250, has alignment requirement but no AGPRs.
2929+
def AlignedVGPRNoAGPRMode : HwMode<[NotHasMAIInsts, NeedsAlignedVGPRs]>;
2930+
2931+
29122932
// Include AMDGPU TD files
29132933
include "SISchedule.td"
29142934
include "GCNProcessors.td"

llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -393,12 +393,13 @@ const TargetRegisterClass *AMDGPUDAGToDAGISel::getOperandRegClass(SDNode *N,
393393

394394
switch (N->getMachineOpcode()) {
395395
default: {
396-
const MCInstrDesc &Desc =
397-
Subtarget->getInstrInfo()->get(N->getMachineOpcode());
396+
const SIInstrInfo *TII = Subtarget->getInstrInfo();
397+
const MCInstrDesc &Desc = TII->get(N->getMachineOpcode());
398398
unsigned OpIdx = Desc.getNumDefs() + OpNo;
399399
if (OpIdx >= Desc.getNumOperands())
400400
return nullptr;
401-
int RegClass = Desc.operands()[OpIdx].RegClass;
401+
402+
int16_t RegClass = TII->getOpRegClassID(Desc.operands()[OpIdx]);
402403
if (RegClass == -1)
403404
return nullptr;
404405

@@ -4338,7 +4339,8 @@ bool AMDGPUDAGToDAGISel::isVGPRImm(const SDNode * N) const {
43384339
if (!RC || SIRI->isSGPRClass(RC))
43394340
return false;
43404341

4341-
if (RC != &AMDGPU::VS_32RegClass && RC != &AMDGPU::VS_64RegClass) {
4342+
if (RC != &AMDGPU::VS_32RegClass && RC != &AMDGPU::VS_64RegClass &&
4343+
RC != &AMDGPU::VS_64_Align2RegClass) {
43424344
AllUsesAcceptSReg = false;
43434345
SDNode *User = U->getUser();
43444346
if (User->isMachineOpcode()) {
@@ -4352,7 +4354,8 @@ bool AMDGPUDAGToDAGISel::isVGPRImm(const SDNode * N) const {
43524354
const TargetRegisterClass *CommutedRC =
43534355
getOperandRegClass(U->getUser(), CommutedOpNo);
43544356
if (CommutedRC == &AMDGPU::VS_32RegClass ||
4355-
CommutedRC == &AMDGPU::VS_64RegClass)
4357+
CommutedRC == &AMDGPU::VS_64RegClass ||
4358+
CommutedRC == &AMDGPU::VS_64_Align2RegClass)
43564359
AllUsesAcceptSReg = true;
43574360
}
43584361
}

llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,6 +1342,7 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
13421342
bool ForcedDPP = false;
13431343
bool ForcedSDWA = false;
13441344
KernelScopeInfo KernelScope;
1345+
const unsigned HwMode;
13451346

13461347
/// @name Auto-generated Match Functions
13471348
/// {
@@ -1351,6 +1352,13 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
13511352

13521353
/// }
13531354

1355+
/// Get size of register operand
1356+
unsigned getRegOperandSize(const MCInstrDesc &Desc, unsigned OpNo) const {
1357+
assert(OpNo < Desc.NumOperands);
1358+
int16_t RCID = MII.getOpRegClassID(Desc.operands()[OpNo], HwMode);
1359+
return getRegBitWidth(RCID) / 8;
1360+
}
1361+
13541362
private:
13551363
void createConstantSymbol(StringRef Id, int64_t Val);
13561364

@@ -1437,9 +1445,9 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
14371445
using OptionalImmIndexMap = std::map<AMDGPUOperand::ImmTy, unsigned>;
14381446

14391447
AMDGPUAsmParser(const MCSubtargetInfo &STI, MCAsmParser &_Parser,
1440-
const MCInstrInfo &MII,
1441-
const MCTargetOptions &Options)
1442-
: MCTargetAsmParser(Options, STI, MII), Parser(_Parser) {
1448+
const MCInstrInfo &MII, const MCTargetOptions &Options)
1449+
: MCTargetAsmParser(Options, STI, MII), Parser(_Parser),
1450+
HwMode(STI.getHwMode()) {
14431451
MCAsmParserExtension::Initialize(Parser);
14441452

14451453
if (getFeatureBits().none()) {
@@ -4130,7 +4138,7 @@ bool AMDGPUAsmParser::validateMIMGDataSize(const MCInst &Inst,
41304138
if ((DMaskIdx == -1 || TFEIdx == -1) && isGFX10_AEncoding()) // intersect_ray
41314139
return true;
41324140

4133-
unsigned VDataSize = AMDGPU::getRegOperandSize(getMRI(), Desc, VDataIdx);
4141+
unsigned VDataSize = getRegOperandSize(Desc, VDataIdx);
41344142
unsigned TFESize = (TFEIdx != -1 && Inst.getOperand(TFEIdx).getImm()) ? 1 : 0;
41354143
unsigned DMask = Inst.getOperand(DMaskIdx).getImm() & 0xf;
41364144
if (DMask == 0)
@@ -4195,8 +4203,7 @@ bool AMDGPUAsmParser::validateMIMGAddrSize(const MCInst &Inst,
41954203
const AMDGPU::MIMGDimInfo *DimInfo = AMDGPU::getMIMGDimInfoByEncoding(Dim);
41964204
bool IsNSA = SrsrcIdx - VAddr0Idx > 1;
41974205
unsigned ActualAddrSize =
4198-
IsNSA ? SrsrcIdx - VAddr0Idx
4199-
: AMDGPU::getRegOperandSize(getMRI(), Desc, VAddr0Idx) / 4;
4206+
IsNSA ? SrsrcIdx - VAddr0Idx : getRegOperandSize(Desc, VAddr0Idx) / 4;
42004207

42014208
unsigned ExpectedAddrSize =
42024209
AMDGPU::getAddrSizeMIMGOp(BaseOpcode, DimInfo, IsA16, hasG16());
@@ -4206,8 +4213,7 @@ bool AMDGPUAsmParser::validateMIMGAddrSize(const MCInst &Inst,
42064213
ExpectedAddrSize >
42074214
getNSAMaxSize(Desc.TSFlags & SIInstrFlags::VSAMPLE)) {
42084215
int VAddrLastIdx = SrsrcIdx - 1;
4209-
unsigned VAddrLastSize =
4210-
AMDGPU::getRegOperandSize(getMRI(), Desc, VAddrLastIdx) / 4;
4216+
unsigned VAddrLastSize = getRegOperandSize(Desc, VAddrLastIdx) / 4;
42114217

42124218
ActualAddrSize = VAddrLastIdx - VAddr0Idx + VAddrLastSize;
42134219
}
@@ -4453,7 +4459,8 @@ bool AMDGPUAsmParser::validateMFMA(const MCInst &Inst,
44534459
return true;
44544460

44554461
const MCRegisterInfo *TRI = getContext().getRegisterInfo();
4456-
if (TRI->getRegClass(Desc.operands()[0].RegClass).getSizeInBits() <= 128)
4462+
if (TRI->getRegClass(MII.getOpRegClassID(Desc.operands()[0], HwMode))
4463+
.getSizeInBits() <= 128)
44574464
return true;
44584465

44594466
if (TRI->regsOverlap(Src2Reg, DstReg)) {
@@ -5012,7 +5019,7 @@ bool AMDGPUAsmParser::validateDPP(const MCInst &Inst,
50125019
unsigned DppCtrl = Inst.getOperand(DppCtrlIdx).getImm();
50135020

50145021
if (!AMDGPU::isLegalDPALU_DPPControl(getSTI(), DppCtrl) &&
5015-
AMDGPU::isDPALU_DPP(MII.get(Opc), getSTI())) {
5022+
AMDGPU::isDPALU_DPP(MII.get(Opc), MII, getSTI())) {
50165023
// DP ALU DPP is supported for row_newbcast only on GFX9* and row_share
50175024
// only on GFX12.
50185025
SMLoc S = getImmLoc(AMDGPUOperand::ImmTyDppCtrl, Operands);
@@ -5530,7 +5537,8 @@ bool AMDGPUAsmParser::validateWMMA(const MCInst &Inst,
55305537
unsigned Fmt = Inst.getOperand(FmtIdx).getImm();
55315538
int SrcIdx = AMDGPU::getNamedOperandIdx(Opc, SrcOp);
55325539
unsigned RegSize =
5533-
TRI->getRegClass(Desc.operands()[SrcIdx].RegClass).getSizeInBits();
5540+
TRI->getRegClass(MII.getOpRegClassID(Desc.operands()[SrcIdx], HwMode))
5541+
.getSizeInBits();
55345542

55355543
if (RegSize == AMDGPU::wmmaScaleF8F6F4FormatToNumRegs(Fmt) * 32)
55365544
return true;

llvm/lib/Target/AMDGPU/BUFInstructions.td

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -417,10 +417,10 @@ class getBUFVDataRegisterOperandForOp<RegisterOperand Op, bit isTFE> {
417417
}
418418

419419
class getMUBUFInsDA<list<RegisterOperand> vdataList,
420-
list<RegisterClass> vaddrList, bit isTFE, bit hasRestrictedSOffset> {
420+
list<RegisterClassLike> vaddrList, bit isTFE, bit hasRestrictedSOffset> {
421421
RegisterOperand vdataClass = !if(!empty(vdataList), ?, !head(vdataList));
422-
RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
423-
RegisterOperand vdata_op = getBUFVDataRegisterOperandForOp<vdataClass, isTFE>.ret;
422+
RegisterClassLike vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
423+
RegisterOperand vdata_op = getBUFVDataRegisterOperand<!cast<SIRegisterClassLike>(vdataClass.RegClass).Size, isTFE>.ret;
424424

425425
dag SOffset = !if(hasRestrictedSOffset, (ins SReg_32:$soffset), (ins SCSrc_b32:$soffset));
426426
dag NonVaddrInputs = !con((ins SReg_128_XNULL:$srsrc), SOffset, (ins Offset:$offset, CPol_0:$cpol, i1imm_0:$swz));
@@ -453,8 +453,8 @@ class getMUBUFIns<int addrKind, list<RegisterOperand> vdataList, bit isTFE, bit
453453
!if(!eq(addrKind, BUFAddrKind.Offset), getMUBUFInsDA<vdataList, [], isTFE, hasRestrictedSOffset>.ret,
454454
!if(!eq(addrKind, BUFAddrKind.OffEn), getMUBUFInsDA<vdataList, [VGPR_32], isTFE, hasRestrictedSOffset>.ret,
455455
!if(!eq(addrKind, BUFAddrKind.IdxEn), getMUBUFInsDA<vdataList, [VGPR_32], isTFE, hasRestrictedSOffset>.ret,
456-
!if(!eq(addrKind, BUFAddrKind.BothEn), getMUBUFInsDA<vdataList, [VReg_64], isTFE, hasRestrictedSOffset>.ret,
457-
!if(!eq(addrKind, BUFAddrKind.Addr64), getMUBUFInsDA<vdataList, [VReg_64], isTFE, hasRestrictedSOffset>.ret,
456+
!if(!eq(addrKind, BUFAddrKind.BothEn), getMUBUFInsDA<vdataList, [VReg_64_AlignTarget], isTFE, hasRestrictedSOffset>.ret,
457+
!if(!eq(addrKind, BUFAddrKind.Addr64), getMUBUFInsDA<vdataList, [VReg_64_AlignTarget], isTFE, hasRestrictedSOffset>.ret,
458458
(ins))))));
459459
}
460460

@@ -677,8 +677,8 @@ class MUBUF_Pseudo_Store_Lds<string opName>
677677
}
678678

679679
class getMUBUFAtomicInsDA<RegisterOperand vdata_op, bit vdata_in, bit hasRestrictedSOffset,
680-
list<RegisterClass> vaddrList=[]> {
681-
RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
680+
list<RegisterClassLike> vaddrList=[]> {
681+
RegisterClassLike vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList));
682682

683683
dag VData = !if(vdata_in, (ins vdata_op:$vdata_in), (ins vdata_op:$vdata));
684684
dag Data = !if(!empty(vaddrList), VData, !con(VData, (ins vaddrClass:$vaddr)));
@@ -702,9 +702,9 @@ class getMUBUFAtomicIns<int addrKind,
702702
!if(!eq(addrKind, BUFAddrKind.IdxEn),
703703
getMUBUFAtomicInsDA<vdataClass, vdata_in, hasRestrictedSOffset, [VGPR_32]>.ret,
704704
!if(!eq(addrKind, BUFAddrKind.BothEn),
705-
getMUBUFAtomicInsDA<vdataClass, vdata_in, hasRestrictedSOffset, [VReg_64]>.ret,
705+
getMUBUFAtomicInsDA<vdataClass, vdata_in, hasRestrictedSOffset, [VReg_64_AlignTarget]>.ret,
706706
!if(!eq(addrKind, BUFAddrKind.Addr64),
707-
getMUBUFAtomicInsDA<vdataClass, vdata_in, hasRestrictedSOffset, [VReg_64]>.ret,
707+
getMUBUFAtomicInsDA<vdataClass, vdata_in, hasRestrictedSOffset, [VReg_64_AlignTarget]>.ret,
708708
(ins))))));
709709
}
710710

@@ -1568,11 +1568,12 @@ multiclass BufferAtomicCmpSwapPat_Common<ValueType vt, ValueType data_vt, string
15681568
# !if(!eq(RtnMode, "ret"), "", "_noret")
15691569
# "_" # vt);
15701570
defvar InstSuffix = !if(!eq(RtnMode, "ret"), "_RTN", "");
1571-
defvar data_vt_RC = getVregSrcForVT<data_vt>.ret.RegClass;
1571+
defvar data_op = getVregSrcForVT<data_vt>.ret;
1572+
defvar data_vt_RC = getVregClassForVT<data_vt>.ret;
15721573

15731574
let AddedComplexity = !if(!eq(RtnMode, "ret"), 0, 1) in {
15741575
defvar OffsetResDag = (!cast<MUBUF_Pseudo>(Inst # "_OFFSET" # InstSuffix)
1575-
data_vt_RC:$vdata_in, SReg_128:$srsrc, SCSrc_b32:$soffset,
1576+
data_op:$vdata_in, SReg_128:$srsrc, SCSrc_b32:$soffset,
15761577
Offset:$offset);
15771578
def : GCNPat<
15781579
(vt (Op (MUBUFOffset v4i32:$srsrc, i32:$soffset, i32:$offset), data_vt:$vdata_in)),
@@ -1583,7 +1584,7 @@ multiclass BufferAtomicCmpSwapPat_Common<ValueType vt, ValueType data_vt, string
15831584
>;
15841585

15851586
defvar Addr64ResDag = (!cast<MUBUF_Pseudo>(Inst # "_ADDR64" # InstSuffix)
1586-
data_vt_RC:$vdata_in, VReg_64:$vaddr, SReg_128:$srsrc,
1587+
data_op:$vdata_in, VReg_64:$vaddr, SReg_128:$srsrc,
15871588
SCSrc_b32:$soffset, Offset:$offset);
15881589
def : GCNPat<
15891590
(vt (Op (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset, i32:$offset),
@@ -1832,7 +1833,7 @@ multiclass SIBufferAtomicCmpSwapPat_Common<ValueType vt, ValueType data_vt, stri
18321833
(extract_cpol_set_glc $auxiliary),
18331834
(extract_cpol $auxiliary));
18341835
defvar SrcRC = getVregSrcForVT<vt>.ret;
1835-
defvar DataRC = getVregSrcForVT<data_vt>.ret.RegClass;
1836+
defvar DataRC = getVregClassForVT<data_vt>.ret;
18361837
defvar SubLo = !if(!eq(vt, i32), sub0, sub0_sub1);
18371838
defvar SubHi = !if(!eq(vt, i32), sub1, sub2_sub3);
18381839

@@ -2088,7 +2089,7 @@ defm : MUBUFStore_PatternOffset <"BUFFER_STORE_SHORT", i16, store_global>;
20882089

20892090
multiclass MUBUFScratchStorePat_Common <string Instr,
20902091
ValueType vt, PatFrag st,
2091-
RegisterClass rc = VGPR_32> {
2092+
RegisterClassLike rc = VGPR_32> {
20922093
def : GCNPat <
20932094
(st vt:$value, (MUBUFScratchOffen v4i32:$srsrc, i32:$vaddr,
20942095
i32:$soffset, i32:$offset)),
@@ -2104,7 +2105,7 @@ multiclass MUBUFScratchStorePat_Common <string Instr,
21042105

21052106
multiclass MUBUFScratchStorePat <string Instr,
21062107
ValueType vt, PatFrag st,
2107-
RegisterClass rc = VGPR_32> {
2108+
RegisterClassLike rc = VGPR_32> {
21082109
let SubtargetPredicate = HasUnrestrictedSOffset in {
21092110
defm : MUBUFScratchStorePat_Common<Instr, vt, st, rc>;
21102111
}

llvm/lib/Target/AMDGPU/DSInstructions.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -904,7 +904,7 @@ let SubtargetPredicate = isGFX1250Plus in {
904904
let WaveSizePredicate = isWave32, mayStore = 0 in {
905905
let OtherPredicates = [HasTransposeLoadF4F6Insts] in {
906906
defm DS_LOAD_TR4_B64 : DS_1A_RET_NoM0<"ds_load_tr4_b64", VGPROp_64>;
907-
defm DS_LOAD_TR6_B96 : DS_1A_RET_NoM0<"ds_load_tr6_b96", VGPROp_96>;
907+
defm DS_LOAD_TR6_B96 : DS_1A_RET_NoM0<"ds_load_tr6_b96", VGPROp_96_Align1>;
908908
} // End OtherPredicates = [HasTransposeLoadF4F6Insts]
909909
defm DS_LOAD_TR8_B64 : DS_1A_RET_NoM0<"ds_load_tr8_b64", VGPROp_64>;
910910
defm DS_LOAD_TR16_B128 : DS_1A_RET_NoM0<"ds_load_tr16_b128", VGPROp_128>;
@@ -934,7 +934,7 @@ let WaveSizePredicate = isWave64, SubtargetPredicate = HasGFX950Insts, mayStore
934934
defm DS_READ_B64_TR_B4 : DS_1A_RET_NoM0<"ds_read_b64_tr_b4", AVLdSt_64>;
935935
defm DS_READ_B64_TR_B8 : DS_1A_RET_NoM0<"ds_read_b64_tr_b8", AVLdSt_64>;
936936
defm DS_READ_B64_TR_B16 : DS_1A_RET_NoM0<"ds_read_b64_tr_b16", AVLdSt_64>;
937-
defm DS_READ_B96_TR_B6 : DS_1A_RET_NoM0<"ds_read_b96_tr_b6", AVLdSt_96>;
937+
defm DS_READ_B96_TR_B6 : DS_1A_RET_NoM0<"ds_read_b96_tr_b6", AVLdSt_96_Align1>;
938938
}
939939

940940
//===----------------------------------------------------------------------===//

llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ static int64_t getInlineImmVal64(unsigned Imm);
5656
AMDGPUDisassembler::AMDGPUDisassembler(const MCSubtargetInfo &STI,
5757
MCContext &Ctx, MCInstrInfo const *MCII)
5858
: MCDisassembler(STI, Ctx), MCII(MCII), MRI(*Ctx.getRegisterInfo()),
59-
MAI(*Ctx.getAsmInfo()), TargetMaxInstBytes(MAI.getMaxInstLength(&STI)),
59+
MAI(*Ctx.getAsmInfo()),
60+
HwModeRegClass(STI.getHwMode(MCSubtargetInfo::HwMode_RegInfo)),
61+
TargetMaxInstBytes(MAI.getMaxInstLength(&STI)),
6062
CodeObjectVersion(AMDGPU::getDefaultAMDHSACodeObjectVersion()) {
6163
// ToDo: AMDGPUDisassembler supports only VI ISA.
6264
if (!STI.hasFeature(AMDGPU::FeatureGCN3Encoding) && !isGFX10Plus())
@@ -824,7 +826,8 @@ DecodeStatus AMDGPUDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
824826
}
825827
}
826828

827-
if (MCII->get(MI.getOpcode()).TSFlags & SIInstrFlags::MIMG) {
829+
const MCInstrDesc &Desc = MCII->get(MI.getOpcode());
830+
if (Desc.TSFlags & SIInstrFlags::MIMG) {
828831
int VAddr0Idx =
829832
AMDGPU::getNamedOperandIdx(MI.getOpcode(), AMDGPU::OpName::vaddr0);
830833
int RsrcIdx =
@@ -837,7 +840,7 @@ DecodeStatus AMDGPUDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
837840
for (unsigned i = 0; i < NSAArgs; ++i) {
838841
const unsigned VAddrIdx = VAddr0Idx + 1 + i;
839842
auto VAddrRCID =
840-
MCII->get(MI.getOpcode()).operands()[VAddrIdx].RegClass;
843+
MCII->getOpRegClassID(Desc.operands()[VAddrIdx], HwModeRegClass);
841844
MI.insert(MI.begin() + VAddrIdx, createRegOperand(VAddrRCID, Bytes[i]));
842845
}
843846
Bytes = Bytes.slice(4 * NSAWords);
@@ -1310,7 +1313,8 @@ void AMDGPUDisassembler::convertMIMGInst(MCInst &MI) const {
13101313
// Widen the register to the correct number of enabled channels.
13111314
MCRegister NewVdata;
13121315
if (DstSize != Info->VDataDwords) {
1313-
auto DataRCID = MCII->get(NewOpcode).operands()[VDataIdx].RegClass;
1316+
auto DataRCID = MCII->getOpRegClassID(
1317+
MCII->get(NewOpcode).operands()[VDataIdx], HwModeRegClass);
13141318

13151319
// Get first subregister of VData
13161320
MCRegister Vdata0 = MI.getOperand(VDataIdx).getReg();
@@ -1337,7 +1341,9 @@ void AMDGPUDisassembler::convertMIMGInst(MCInst &MI) const {
13371341
MCRegister VAddrSubSA = MRI.getSubReg(VAddrSA, AMDGPU::sub0);
13381342
VAddrSA = VAddrSubSA ? VAddrSubSA : VAddrSA;
13391343

1340-
auto AddrRCID = MCII->get(NewOpcode).operands()[VAddrSAIdx].RegClass;
1344+
auto AddrRCID = MCII->getOpRegClassID(
1345+
MCII->get(NewOpcode).operands()[VAddrSAIdx], HwModeRegClass);
1346+
13411347
const MCRegisterClass &NewRC = MRI.getRegClass(AddrRCID);
13421348
NewVAddrSA = MRI.getMatchingSuperReg(VAddrSA, AMDGPU::sub0, &NewRC);
13431349
NewVAddrSA = CheckVGPROverflow(NewVAddrSA, NewRC, MRI);

llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class AMDGPUDisassembler : public MCDisassembler {
4141
std::unique_ptr<MCInstrInfo const> const MCII;
4242
const MCRegisterInfo &MRI;
4343
const MCAsmInfo &MAI;
44+
const unsigned HwModeRegClass;
4445
const unsigned TargetMaxInstBytes;
4546
mutable ArrayRef<uint8_t> Bytes;
4647
mutable uint32_t Literal;

0 commit comments

Comments
 (0)