Skip to content

Commit f5bca36

Browse files
committed
importNamedNodeRenderer
1 parent f2334c5 commit f5bca36

File tree

1 file changed

+94
-82
lines changed

1 file changed

+94
-82
lines changed

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 94 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,10 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
412412
importExplicitUseRenderers(action_iterator InsertPt, RuleMatcher &M,
413413
BuildMIAction &DstMIBuilder,
414414
const TreePatternNode &Dst) const;
415+
416+
Error importNamedNodeRenderer(RuleMatcher &M, BuildMIAction &MIBuilder,
417+
const TreePatternNode &N) const;
418+
415419
Expected<action_iterator>
416420
importExplicitUseRenderer(action_iterator InsertPt, RuleMatcher &Rule,
417421
BuildMIAction &DstMIBuilder,
@@ -1192,15 +1196,97 @@ Error GlobalISelEmitter::importChildMatcher(
11921196
return failedImport("Src pattern child is an unsupported kind");
11931197
}
11941198

1199+
// Equivalent of MatcherGen::EmitResultOfNamedOperand.
1200+
Error GlobalISelEmitter::importNamedNodeRenderer(
1201+
RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N) const {
1202+
StringRef NodeName = N.getName();
1203+
1204+
if (auto SubOperand = M.getComplexSubOperand(NodeName)) {
1205+
auto [ComplexPatternRec, RendererID, SubOperandIdx] = *SubOperand;
1206+
MIBuilder.addRenderer<RenderComplexPatternOperand>(
1207+
*ComplexPatternRec, NodeName, RendererID, SubOperandIdx);
1208+
return Error::success();
1209+
}
1210+
1211+
if (!N.isLeaf()) {
1212+
StringRef OperatorName = N.getOperator()->getName();
1213+
1214+
if (OperatorName == "imm") {
1215+
MIBuilder.addRenderer<CopyConstantAsImmRenderer>(NodeName);
1216+
return Error::success();
1217+
}
1218+
1219+
if (OperatorName == "fpimm") {
1220+
MIBuilder.addRenderer<CopyFConstantAsFPImmRenderer>(NodeName);
1221+
return Error::success();
1222+
}
1223+
1224+
if (OperatorName == "bb" || OperatorName == "timm" ||
1225+
OperatorName == "tframeindex") {
1226+
MIBuilder.addRenderer<CopyRenderer>(NodeName);
1227+
return Error::success();
1228+
}
1229+
1230+
return failedImport("node has unsupported operator " + to_string(N));
1231+
}
1232+
1233+
if (const auto *DI = dyn_cast<DefInit>(N.getLeafValue())) {
1234+
const Record *R = DI->getDef();
1235+
1236+
ArrayRef<TypeSetByHwMode> ChildTypes = N.getExtTypes();
1237+
if (ChildTypes.size() != 1)
1238+
return failedImport("node has multiple results " + to_string(N));
1239+
1240+
std::optional<LLTCodeGen> OpTyOrNone;
1241+
if (ChildTypes.front().isMachineValueType())
1242+
OpTyOrNone = MVTToLLT(ChildTypes.front().getMachineValueType().SimpleTy);
1243+
if (!OpTyOrNone)
1244+
return failedImport("node has unsupported type " + to_string(N));
1245+
1246+
if (R->isSubClassOf("ComplexPattern")) {
1247+
auto I = ComplexPatternEquivs.find(R);
1248+
if (I == ComplexPatternEquivs.end())
1249+
return failedImport("ComplexPattern " + R->getName() +
1250+
" does not have GISel equivalent");
1251+
1252+
const OperandMatcher &OM = M.getOperandMatcher(NodeName);
1253+
MIBuilder.addRenderer<RenderComplexPatternOperand>(
1254+
*I->second, NodeName, OM.getAllocatedTemporariesBaseID());
1255+
return Error::success();
1256+
}
1257+
1258+
if (R->isSubClassOf("RegisterOperand") &&
1259+
!R->isValueUnset("GIZeroRegister")) {
1260+
MIBuilder.addRenderer<CopyOrAddZeroRegRenderer>(
1261+
NodeName, R->getValueAsDef("GIZeroRegister"));
1262+
return Error::success();
1263+
}
1264+
1265+
if (R->isSubClassOf("RegisterClass") ||
1266+
R->isSubClassOf("RegisterOperand") || R->isSubClassOf("ValueType")) {
1267+
MIBuilder.addRenderer<CopyRenderer>(NodeName);
1268+
return Error::success();
1269+
}
1270+
}
1271+
1272+
if (!M.hasOperand(NodeName))
1273+
return failedImport("could not find node $" + NodeName +
1274+
" in the source DAG");
1275+
1276+
if (isa<UnsetInit>(N.getLeafValue())) {
1277+
MIBuilder.addRenderer<CopyRenderer>(NodeName);
1278+
return Error::success();
1279+
}
1280+
1281+
return failedImport("unsupported node " + to_string(N));
1282+
}
1283+
11951284
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
11961285
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
11971286
const TreePatternNode &Dst) const {
1198-
1199-
const auto &SubOperand = Rule.getComplexSubOperand(Dst.getName());
1200-
if (SubOperand) {
1201-
DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
1202-
*std::get<0>(*SubOperand), Dst.getName(), std::get<1>(*SubOperand),
1203-
std::get<2>(*SubOperand));
1287+
if (Dst.hasName()) {
1288+
if (Error Err = importNamedNodeRenderer(Rule, DstMIBuilder, Dst))
1289+
return Err;
12041290
return InsertPt;
12051291
}
12061292

@@ -1226,37 +1312,6 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12261312
" has no custom renderer");
12271313
}
12281314

1229-
// We accept 'bb' here. It's an operator because BasicBlockSDNode isn't
1230-
// inline, but in MI it's just another operand.
1231-
if (Dst.getOperator()->isSubClassOf("SDNode")) {
1232-
auto &ChildSDNI = CGP.getSDNodeInfo(Dst.getOperator());
1233-
if (ChildSDNI.getSDClassName() == "BasicBlockSDNode") {
1234-
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
1235-
return InsertPt;
1236-
}
1237-
}
1238-
1239-
// Similarly, imm is an operator in TreePatternNode's view but must be
1240-
// rendered as operands.
1241-
// FIXME: The target should be able to choose sign-extended when appropriate
1242-
// (e.g. on Mips).
1243-
if (Dst.getOperator()->getName() == "timm") {
1244-
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
1245-
return InsertPt;
1246-
}
1247-
if (Dst.getOperator()->getName() == "tframeindex") {
1248-
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
1249-
return InsertPt;
1250-
}
1251-
if (Dst.getOperator()->getName() == "imm") {
1252-
DstMIBuilder.addRenderer<CopyConstantAsImmRenderer>(Dst.getName());
1253-
return InsertPt;
1254-
}
1255-
if (Dst.getOperator()->getName() == "fpimm") {
1256-
DstMIBuilder.addRenderer<CopyFConstantAsFPImmRenderer>(Dst.getName());
1257-
return InsertPt;
1258-
}
1259-
12601315
if (Dst.getOperator()->isSubClassOf("Instruction")) {
12611316
auto OpTy = getInstResultType(Dst, Target);
12621317
if (!OpTy)
@@ -1274,8 +1329,8 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12741329
return InsertPtOrError.get();
12751330
}
12761331

1277-
return failedImport("Dst pattern child isn't a leaf node or an MBB" +
1278-
llvm::to_string(Dst));
1332+
// Should not reach here.
1333+
return failedImport("unrecognized node " + llvm::to_string(Dst));
12791334
}
12801335

12811336
// It could be a specific immediate in which case we should just check for
@@ -1289,64 +1344,21 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12891344
if (auto *ChildDefInit = dyn_cast<DefInit>(Dst.getLeafValue())) {
12901345
auto *ChildRec = ChildDefInit->getDef();
12911346

1292-
ArrayRef<TypeSetByHwMode> ChildTypes = Dst.getExtTypes();
1293-
if (ChildTypes.size() != 1)
1294-
return failedImport("Dst pattern child has multiple results");
1295-
1296-
std::optional<LLTCodeGen> OpTyOrNone;
1297-
if (ChildTypes.front().isMachineValueType())
1298-
OpTyOrNone = MVTToLLT(ChildTypes.front().getMachineValueType().SimpleTy);
1299-
if (!OpTyOrNone)
1300-
return failedImport("Dst operand has an unsupported type");
1301-
13021347
if (ChildRec->isSubClassOf("Register")) {
13031348
DstMIBuilder.addRenderer<AddRegisterRenderer>(Target, ChildRec);
13041349
return InsertPt;
13051350
}
13061351

1307-
if (ChildRec->isSubClassOf("RegisterClass") ||
1308-
ChildRec->isSubClassOf("RegisterOperand") ||
1309-
ChildRec->isSubClassOf("ValueType")) {
1310-
if (ChildRec->isSubClassOf("RegisterOperand") &&
1311-
!ChildRec->isValueUnset("GIZeroRegister")) {
1312-
DstMIBuilder.addRenderer<CopyOrAddZeroRegRenderer>(
1313-
Dst.getName(), ChildRec->getValueAsDef("GIZeroRegister"));
1314-
return InsertPt;
1315-
}
1316-
1317-
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
1318-
return InsertPt;
1319-
}
1320-
13211352
if (ChildRec->isSubClassOf("SubRegIndex")) {
13221353
CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx(ChildRec);
13231354
DstMIBuilder.addRenderer<ImmRenderer>(SubIdx->EnumValue);
13241355
return InsertPt;
13251356
}
13261357

1327-
if (ChildRec->isSubClassOf("ComplexPattern")) {
1328-
const auto &ComplexPattern = ComplexPatternEquivs.find(ChildRec);
1329-
if (ComplexPattern == ComplexPatternEquivs.end())
1330-
return failedImport(
1331-
"SelectionDAG ComplexPattern not mapped to GlobalISel");
1332-
1333-
const OperandMatcher &OM = Rule.getOperandMatcher(Dst.getName());
1334-
DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
1335-
*ComplexPattern->second, Dst.getName(),
1336-
OM.getAllocatedTemporariesBaseID());
1337-
return InsertPt;
1338-
}
1339-
13401358
return failedImport(
13411359
"Dst pattern child def is an unsupported tablegen class");
13421360
}
13431361

1344-
// Handle the case where the MVT/register class is omitted in the dest pattern
1345-
// but MVT exists in the source pattern.
1346-
if (isa<UnsetInit>(Dst.getLeafValue()) && Rule.hasOperand(Dst.getName())) {
1347-
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
1348-
return InsertPt;
1349-
}
13501362
return failedImport("Dst pattern child is an unsupported kind");
13511363
}
13521364

0 commit comments

Comments
 (0)