@@ -416,6 +416,9 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
416
416
Error importNamedNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
417
417
const TreePatternNode &N) const ;
418
418
419
+ Error importLeafNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
420
+ const TreePatternNode &N) const ;
421
+
419
422
Expected<action_iterator>
420
423
importExplicitUseRenderer (action_iterator InsertPt, RuleMatcher &Rule,
421
424
BuildMIAction &DstMIBuilder,
@@ -1281,85 +1284,87 @@ Error GlobalISelEmitter::importNamedNodeRenderer(
1281
1284
return failedImport (" unsupported node " + to_string (N));
1282
1285
}
1283
1286
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 ();
1291
1293
}
1292
1294
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 ();
1308
1297
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 ();
1313
1301
}
1314
1302
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 ();
1330
1307
}
1308
+ }
1309
+
1310
+ return failedImport (" unrecognized node " + to_string (N));
1311
+ }
1331
1312
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;
1334
1320
}
1335
1321
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;
1340
1325
return InsertPt;
1341
1326
}
1342
1327
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
+ }
1346
1342
1347
- if (ChildRec->isSubClassOf (" Register" )) {
1348
- DstMIBuilder.addRenderer <AddRegisterRenderer>(Target, ChildRec);
1349
1343
return InsertPt;
1350
1344
}
1345
+ return failedImport (" SDNodeXForm " + Child.getName () +
1346
+ " has no custom renderer" );
1347
+ }
1351
1348
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 ();
1357
1353
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 ();
1360
1364
}
1361
1365
1362
- return failedImport (" Dst pattern child is an unsupported kind" );
1366
+ // Should not reach here.
1367
+ return failedImport (" unrecognized node " + llvm::to_string (Dst));
1363
1368
}
1364
1369
1365
1370
// / Generates code that builds the resulting instruction(s) from the destination
0 commit comments