Skip to content

Commit ea5ae36

Browse files
committed
importLeafNodeRenderer
1 parent f5bca36 commit ea5ae36

File tree

1 file changed

+65
-60
lines changed

1 file changed

+65
-60
lines changed

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 65 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,9 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
416416
Error importNamedNodeRenderer(RuleMatcher &M, BuildMIAction &MIBuilder,
417417
const TreePatternNode &N) const;
418418

419+
Error importLeafNodeRenderer(RuleMatcher &M, BuildMIAction &MIBuilder,
420+
const TreePatternNode &N) const;
421+
419422
Expected<action_iterator>
420423
importExplicitUseRenderer(action_iterator InsertPt, RuleMatcher &Rule,
421424
BuildMIAction &DstMIBuilder,
@@ -1281,85 +1284,87 @@ Error GlobalISelEmitter::importNamedNodeRenderer(
12811284
return failedImport("unsupported node " + to_string(N));
12821285
}
12831286

1284-
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1285-
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1286-
const TreePatternNode &Dst) const {
1287-
if (Dst.hasName()) {
1288-
if (Error Err = importNamedNodeRenderer(Rule, DstMIBuilder, Dst))
1289-
return Err;
1290-
return InsertPt;
1287+
// Equivalent of MatcherGen::EmitResultLeafAsOperand.
1288+
Error GlobalISelEmitter::importLeafNodeRenderer(
1289+
RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N) const {
1290+
if (const auto *II = dyn_cast<IntInit>(N.getLeafValue())) {
1291+
MIBuilder.addRenderer<ImmRenderer>(II->getValue());
1292+
return Error::success();
12911293
}
12921294

1293-
if (!Dst.isLeaf()) {
1294-
if (Dst.getOperator()->isSubClassOf("SDNodeXForm")) {
1295-
auto &Child = Dst.getChild(0);
1296-
auto I = SDNodeXFormEquivs.find(Dst.getOperator());
1297-
if (I != SDNodeXFormEquivs.end()) {
1298-
const Record *XFormOpc = Dst.getOperator()->getValueAsDef("Opcode");
1299-
if (XFormOpc->getName() == "timm") {
1300-
// If this is a TargetConstant, there won't be a corresponding
1301-
// instruction to transform. Instead, this will refer directly to an
1302-
// operand in an instruction's operand list.
1303-
DstMIBuilder.addRenderer<CustomOperandRenderer>(*I->second,
1304-
Child.getName());
1305-
} else {
1306-
DstMIBuilder.addRenderer<CustomRenderer>(*I->second, Child.getName());
1307-
}
1295+
if (const auto *DI = dyn_cast<DefInit>(N.getLeafValue())) {
1296+
const Record *R = DI->getDef();
13081297

1309-
return InsertPt;
1310-
}
1311-
return failedImport("SDNodeXForm " + Child.getName() +
1312-
" has no custom renderer");
1298+
if (R->isSubClassOf("Register")) {
1299+
MIBuilder.addRenderer<AddRegisterRenderer>(Target, R);
1300+
return Error::success();
13131301
}
13141302

1315-
if (Dst.getOperator()->isSubClassOf("Instruction")) {
1316-
auto OpTy = getInstResultType(Dst, Target);
1317-
if (!OpTy)
1318-
return OpTy.takeError();
1319-
1320-
unsigned TempRegID = Rule.allocateTempRegID();
1321-
InsertPt =
1322-
Rule.insertAction<MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1323-
DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID);
1324-
1325-
auto InsertPtOrError = createAndImportSubInstructionRenderer(
1326-
++InsertPt, Rule, Dst, TempRegID);
1327-
if (auto Error = InsertPtOrError.takeError())
1328-
return std::move(Error);
1329-
return InsertPtOrError.get();
1303+
if (R->isSubClassOf("SubRegIndex")) {
1304+
const CodeGenSubRegIndex *SubRegIndex = CGRegs.getSubRegIdx(R);
1305+
MIBuilder.addRenderer<ImmRenderer>(SubRegIndex->EnumValue);
1306+
return Error::success();
13301307
}
1308+
}
1309+
1310+
return failedImport("unrecognized node " + to_string(N));
1311+
}
13311312

1332-
// Should not reach here.
1333-
return failedImport("unrecognized node " + llvm::to_string(Dst));
1313+
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1314+
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1315+
const TreePatternNode &Dst) const {
1316+
if (Dst.hasName()) {
1317+
if (Error Err = importNamedNodeRenderer(Rule, DstMIBuilder, Dst))
1318+
return Err;
1319+
return InsertPt;
13341320
}
13351321

1336-
// It could be a specific immediate in which case we should just check for
1337-
// that immediate.
1338-
if (const IntInit *ChildIntInit = dyn_cast<IntInit>(Dst.getLeafValue())) {
1339-
DstMIBuilder.addRenderer<ImmRenderer>(ChildIntInit->getValue());
1322+
if (Dst.isLeaf()) {
1323+
if (Error Err = importLeafNodeRenderer(Rule, DstMIBuilder, Dst))
1324+
return Err;
13401325
return InsertPt;
13411326
}
13421327

1343-
// Otherwise, we're looking for a bog-standard RegisterClass operand.
1344-
if (auto *ChildDefInit = dyn_cast<DefInit>(Dst.getLeafValue())) {
1345-
auto *ChildRec = ChildDefInit->getDef();
1328+
if (Dst.getOperator()->isSubClassOf("SDNodeXForm")) {
1329+
auto &Child = Dst.getChild(0);
1330+
auto I = SDNodeXFormEquivs.find(Dst.getOperator());
1331+
if (I != SDNodeXFormEquivs.end()) {
1332+
const Record *XFormOpc = Dst.getOperator()->getValueAsDef("Opcode");
1333+
if (XFormOpc->getName() == "timm") {
1334+
// If this is a TargetConstant, there won't be a corresponding
1335+
// instruction to transform. Instead, this will refer directly to an
1336+
// operand in an instruction's operand list.
1337+
DstMIBuilder.addRenderer<CustomOperandRenderer>(*I->second,
1338+
Child.getName());
1339+
} else {
1340+
DstMIBuilder.addRenderer<CustomRenderer>(*I->second, Child.getName());
1341+
}
13461342

1347-
if (ChildRec->isSubClassOf("Register")) {
1348-
DstMIBuilder.addRenderer<AddRegisterRenderer>(Target, ChildRec);
13491343
return InsertPt;
13501344
}
1345+
return failedImport("SDNodeXForm " + Child.getName() +
1346+
" has no custom renderer");
1347+
}
13511348

1352-
if (ChildRec->isSubClassOf("SubRegIndex")) {
1353-
CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx(ChildRec);
1354-
DstMIBuilder.addRenderer<ImmRenderer>(SubIdx->EnumValue);
1355-
return InsertPt;
1356-
}
1349+
if (Dst.getOperator()->isSubClassOf("Instruction")) {
1350+
auto OpTy = getInstResultType(Dst, Target);
1351+
if (!OpTy)
1352+
return OpTy.takeError();
13571353

1358-
return failedImport(
1359-
"Dst pattern child def is an unsupported tablegen class");
1354+
unsigned TempRegID = Rule.allocateTempRegID();
1355+
InsertPt =
1356+
Rule.insertAction<MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1357+
DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID);
1358+
1359+
auto InsertPtOrError =
1360+
createAndImportSubInstructionRenderer(++InsertPt, Rule, Dst, TempRegID);
1361+
if (auto Error = InsertPtOrError.takeError())
1362+
return std::move(Error);
1363+
return InsertPtOrError.get();
13601364
}
13611365

1362-
return failedImport("Dst pattern child is an unsupported kind");
1366+
// Should not reach here.
1367+
return failedImport("unrecognized node " + llvm::to_string(Dst));
13631368
}
13641369

13651370
/// Generates code that builds the resulting instruction(s) from the destination

0 commit comments

Comments
 (0)