Skip to content

Commit 5ac2b21

Browse files
committed
Try to infer register class for physical register defs
1 parent 5d3e267 commit 5ac2b21

File tree

5 files changed

+34
-7
lines changed

5 files changed

+34
-7
lines changed

llvm/include/llvm/Target/Target.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ class RegisterClass<string namespace, list<ValueType> regTypes, int alignment,
283283
// value means copying is extremely expensive or impossible.
284284
int CopyCost = 1;
285285

286+
RegisterClass CrossCopyRegClass = ?;
287+
286288
// MemberList - Specify which registers are in this class. If the
287289
// allocation_order_* method are not specified, this also defines the order of
288290
// allocation used by the register allocator.

llvm/lib/Target/AMDGPU/SIRegisterInfo.td

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -362,13 +362,6 @@ foreach Index = 0...255 in {
362362
// Groupings using register classes and tuples
363363
//===----------------------------------------------------------------------===//
364364

365-
def SCC_CLASS : SIRegisterClass<"AMDGPU", [i1], 1, (add SCC)> {
366-
let CopyCost = -1;
367-
let isAllocatable = 0;
368-
let HasSGPR = 1;
369-
let BaseClassOrder = 10000;
370-
}
371-
372365
def M0_CLASS : SIRegisterClass<"AMDGPU", [i32], 32, (add M0)> {
373366
let CopyCost = 1;
374367
let isAllocatable = 0;
@@ -801,6 +794,14 @@ def SReg_32_XM0 : SIRegisterClass<"AMDGPU", [i32, f32, i16, f16, bf16, v2i16, v2
801794

802795
} // End GeneratePressureSet = 0
803796

797+
def SCC_CLASS : SIRegisterClass<"AMDGPU", [i1], 1, (add SCC)> {
798+
let CopyCost = -1;
799+
let isAllocatable = 0;
800+
let CrossCopyRegClass = SReg_32_XM0_XEXEC;
801+
let HasSGPR = 1;
802+
let BaseClassOrder = 10000;
803+
}
804+
804805
// Register class for all scalar registers (SGPRs + Special Registers)
805806
def SReg_32 : SIRegisterClass<"AMDGPU", [i32, f32, i16, f16, bf16, v2i16, v2f16, v2bf16, i1], 32,
806807
(add SReg_32_XM0, M0_CLASS)> {

llvm/utils/TableGen/Common/CodeGenRegisters.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,6 +1306,18 @@ CodeGenRegBank::CodeGenRegBank(const RecordKeeper &Records,
13061306
addToMaps(&RC);
13071307
}
13081308

1309+
// Resolve cross references.
1310+
for (const Record *RCRec : RCs) {
1311+
if (const Record *CrossCopyRCRec =
1312+
RCRec->getValueAsOptionalDef("CrossCopyRegClass")) {
1313+
const CodeGenRegisterClass *CrossCopyRC = getRegClass(CrossCopyRCRec);
1314+
if (!CrossCopyRC->Allocatable)
1315+
PrintFatalError(RCRec->getFieldLoc("CrossCopyRegClass"),
1316+
"cross-copy register class must be allocatable");
1317+
getRegClass(RCRec)->CrossCopyRC = CrossCopyRC;
1318+
}
1319+
}
1320+
13091321
// Infer missing classes to create a full algebra.
13101322
computeInferredRegisterClasses();
13111323

llvm/utils/TableGen/Common/CodeGenRegisters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ class CodeGenRegisterClass {
351351
RegSizeInfoByHwMode RSI;
352352
int CopyCost;
353353
bool Allocatable;
354+
const CodeGenRegisterClass *CrossCopyRC = nullptr;
354355
StringRef AltOrderSelect;
355356
uint8_t AllocationPriority;
356357
bool GlobalPriority;

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1570,6 +1570,17 @@ Expected<action_iterator> GlobalISelEmitter::importDefRenderers(
15701570
StringRef PermanentRef = M.getOperandMatcher(OpName).getSymbolicName();
15711571
CopyBuilder.addRenderer<CopyRenderer>(PermanentRef);
15721572
CopyBuilder.addRenderer<AddRegisterRenderer>(Target, Reg);
1573+
1574+
const CodeGenRegisterClass *RC = CGRegs.getRegClassForRegister(Reg);
1575+
if (RC && !RC->Allocatable)
1576+
RC = RC->CrossCopyRC;
1577+
1578+
if (!RC)
1579+
return failedImport("could not infer register class for " +
1580+
Reg->getName());
1581+
1582+
M.addAction<ConstrainOperandToRegClassAction>(CopyBuilder.getInsnID(),
1583+
/*OpIdx=*/0, *RC);
15731584
}
15741585

15751586
return InsertPt;

0 commit comments

Comments
 (0)