Skip to content

Commit 3b0a77b

Browse files
committed
[TableGen][GISel] Reuse importNodeRenderer for OperandWithDefaultOps
This avoids some code duplication (handling `Register`, `zero_reg` and immediate operands).
1 parent 46cf6fc commit 3b0a77b

File tree

1 file changed

+24
-53
lines changed

1 file changed

+24
-53
lines changed

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 24 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,8 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
418418
const TreePatternNode &N) const;
419419

420420
Error importLeafNodeRenderer(RuleMatcher &M, BuildMIAction &MIBuilder,
421-
const TreePatternNode &N) const;
421+
const TreePatternNode &N,
422+
action_iterator InsertPt) const;
422423

423424
Error importXFormNodeRenderer(RuleMatcher &M, BuildMIAction &MIBuilder,
424425
const TreePatternNode &N) const;
@@ -431,9 +432,6 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
431432
const TreePatternNode &N,
432433
action_iterator &InsertPt) const;
433434

434-
Error importDefaultOperandRenderers(action_iterator InsertPt, RuleMatcher &M,
435-
BuildMIAction &DstMIBuilder,
436-
const DAGDefaultOperand &DefaultOp) const;
437435
Error importImplicitDefRenderers(BuildMIAction &DstMIBuilder,
438436
ArrayRef<const Record *> ImplicitDefs) const;
439437

@@ -1291,7 +1289,8 @@ Error GlobalISelEmitter::importNamedNodeRenderer(
12911289

12921290
// Equivalent of MatcherGen::EmitResultLeafAsOperand.
12931291
Error GlobalISelEmitter::importLeafNodeRenderer(
1294-
RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N) const {
1292+
RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N,
1293+
action_iterator InsertPt) const {
12951294
if (const auto *II = dyn_cast<IntInit>(N.getLeafValue())) {
12961295
MIBuilder.addRenderer<ImmRenderer>(II->getValue());
12971296
return Error::success();
@@ -1300,11 +1299,24 @@ Error GlobalISelEmitter::importLeafNodeRenderer(
13001299
if (const auto *DI = dyn_cast<DefInit>(N.getLeafValue())) {
13011300
const Record *R = DI->getDef();
13021301

1303-
if (R->isSubClassOf("Register")) {
1302+
if (R->isSubClassOf("Register") || R->getName() == "zero_reg") {
13041303
MIBuilder.addRenderer<AddRegisterRenderer>(Target, R);
13051304
return Error::success();
13061305
}
13071306

1307+
if (R->getName() == "undef_tied_input") {
1308+
std::optional<LLTCodeGen> OpTyOrNone = MVTToLLT(N.getSimpleType(0));
1309+
unsigned TempRegID = M.allocateTempRegID();
1310+
M.insertAction<MakeTempRegisterAction>(InsertPt, *OpTyOrNone, TempRegID);
1311+
auto I = M.insertAction<BuildMIAction>(
1312+
InsertPt, M.allocateOutputInsnID(),
1313+
&Target.getInstruction(RK.getDef("IMPLICIT_DEF")));
1314+
auto &ImpDefBuilder = static_cast<BuildMIAction &>(**I);
1315+
ImpDefBuilder.addRenderer<TempRegRenderer>(TempRegID, /*IsDef=*/true);
1316+
MIBuilder.addRenderer<TempRegRenderer>(TempRegID);
1317+
return Error::success();
1318+
}
1319+
13081320
if (R->isSubClassOf("SubRegIndex")) {
13091321
const CodeGenSubRegIndex *SubRegIndex = CGRegs.getSubRegIdx(R);
13101322
MIBuilder.addRenderer<ImmRenderer>(SubRegIndex->EnumValue);
@@ -1386,7 +1398,7 @@ Error GlobalISelEmitter::importNodeRenderer(RuleMatcher &M,
13861398
return importNamedNodeRenderer(M, MIBuilder, N);
13871399

13881400
if (N.isLeaf())
1389-
return importLeafNodeRenderer(M, MIBuilder, N);
1401+
return importLeafNodeRenderer(M, MIBuilder, N, InsertPt);
13901402

13911403
if (N.getOperator()->isSubClassOf("SDNodeXForm"))
13921404
return importXFormNodeRenderer(M, MIBuilder, N);
@@ -1707,11 +1719,11 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
17071719
// This is a predicate or optional def operand which the pattern has not
17081720
// overridden, or which we aren't letting it override; emit the 'default
17091721
// ops' operands.
1710-
1711-
const Record *OperandNode = DstI->Operands[InstOpNo].Rec;
1712-
if (auto Error = importDefaultOperandRenderers(
1713-
InsertPt, M, DstMIBuilder, CGP.getDefaultOperand(OperandNode)))
1714-
return std::move(Error);
1722+
for (const TreePatternNode &OpNode :
1723+
make_pointee_range(CGP.getDefaultOperand(OperandNode).DefaultOps)) {
1724+
if (Error Err = importNodeRenderer(M, DstMIBuilder, OpNode, InsertPt))
1725+
return Err;
1726+
}
17151727

17161728
++NumDefaultOps;
17171729
continue;
@@ -1734,47 +1746,6 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
17341746
return InsertPt;
17351747
}
17361748

1737-
Error GlobalISelEmitter::importDefaultOperandRenderers(
1738-
action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1739-
const DAGDefaultOperand &DefaultOp) const {
1740-
for (const auto &Op : DefaultOp.DefaultOps) {
1741-
const auto &N = *Op;
1742-
if (!N.isLeaf())
1743-
return failedImport("Could not add default op");
1744-
1745-
const auto *DefaultOp = N.getLeafValue();
1746-
1747-
if (const DefInit *DefaultDefOp = dyn_cast<DefInit>(DefaultOp)) {
1748-
std::optional<LLTCodeGen> OpTyOrNone = MVTToLLT(N.getSimpleType(0));
1749-
auto *Def = DefaultDefOp->getDef();
1750-
if (Def->getName() == "undef_tied_input") {
1751-
unsigned TempRegID = M.allocateTempRegID();
1752-
M.insertAction<MakeTempRegisterAction>(InsertPt, *OpTyOrNone,
1753-
TempRegID);
1754-
InsertPt = M.insertAction<BuildMIAction>(
1755-
InsertPt, M.allocateOutputInsnID(),
1756-
&Target.getInstruction(RK.getDef("IMPLICIT_DEF")));
1757-
BuildMIAction &IDMIBuilder =
1758-
*static_cast<BuildMIAction *>(InsertPt->get());
1759-
IDMIBuilder.addRenderer<TempRegRenderer>(TempRegID, /*IsDef=*/true);
1760-
DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID);
1761-
} else {
1762-
DstMIBuilder.addRenderer<AddRegisterRenderer>(Target, Def);
1763-
}
1764-
continue;
1765-
}
1766-
1767-
if (const IntInit *DefaultIntOp = dyn_cast<IntInit>(DefaultOp)) {
1768-
DstMIBuilder.addRenderer<ImmRenderer>(DefaultIntOp->getValue());
1769-
continue;
1770-
}
1771-
1772-
return failedImport("Could not add default op");
1773-
}
1774-
1775-
return Error::success();
1776-
}
1777-
17781749
Error GlobalISelEmitter::importImplicitDefRenderers(
17791750
BuildMIAction &DstMIBuilder, ArrayRef<const Record *> ImplicitDefs) const {
17801751
if (!ImplicitDefs.empty())

0 commit comments

Comments
 (0)