@@ -412,6 +412,10 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
412
412
importExplicitUseRenderers (action_iterator InsertPt, RuleMatcher &M,
413
413
BuildMIAction &DstMIBuilder,
414
414
const TreePatternNode &Dst) const ;
415
+
416
+ Error importNamedNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
417
+ const TreePatternNode &N) const ;
418
+
415
419
Expected<action_iterator>
416
420
importExplicitUseRenderer (action_iterator InsertPt, RuleMatcher &Rule,
417
421
BuildMIAction &DstMIBuilder,
@@ -1192,15 +1196,97 @@ Error GlobalISelEmitter::importChildMatcher(
1192
1196
return failedImport (" Src pattern child is an unsupported kind" );
1193
1197
}
1194
1198
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
+
1195
1284
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer (
1196
1285
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1197
1286
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;
1204
1290
return InsertPt;
1205
1291
}
1206
1292
@@ -1226,37 +1312,6 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1226
1312
" has no custom renderer" );
1227
1313
}
1228
1314
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
-
1260
1315
if (Dst.getOperator ()->isSubClassOf (" Instruction" )) {
1261
1316
auto OpTy = getInstResultType (Dst, Target);
1262
1317
if (!OpTy)
@@ -1274,8 +1329,8 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1274
1329
return InsertPtOrError.get ();
1275
1330
}
1276
1331
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));
1279
1334
}
1280
1335
1281
1336
// It could be a specific immediate in which case we should just check for
@@ -1289,64 +1344,21 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1289
1344
if (auto *ChildDefInit = dyn_cast<DefInit>(Dst.getLeafValue ())) {
1290
1345
auto *ChildRec = ChildDefInit->getDef ();
1291
1346
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
-
1302
1347
if (ChildRec->isSubClassOf (" Register" )) {
1303
1348
DstMIBuilder.addRenderer <AddRegisterRenderer>(Target, ChildRec);
1304
1349
return InsertPt;
1305
1350
}
1306
1351
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
-
1321
1352
if (ChildRec->isSubClassOf (" SubRegIndex" )) {
1322
1353
CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx (ChildRec);
1323
1354
DstMIBuilder.addRenderer <ImmRenderer>(SubIdx->EnumValue );
1324
1355
return InsertPt;
1325
1356
}
1326
1357
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
-
1340
1358
return failedImport (
1341
1359
" Dst pattern child def is an unsupported tablegen class" );
1342
1360
}
1343
1361
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
- }
1350
1362
return failedImport (" Dst pattern child is an unsupported kind" );
1351
1363
}
1352
1364
0 commit comments