@@ -393,28 +393,30 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
393
393
bool OperandIsAPointer, bool OperandIsImmArg,
394
394
unsigned OpIdx, unsigned &TempOpIdx);
395
395
396
- Expected<BuildMIAction &> createAndImportInstructionRenderer (
397
- RuleMatcher &M, InstructionMatcher &InsnMatcher,
398
- const TreePatternNode &Src, const TreePatternNode &Dst);
396
+ Expected<BuildMIAction &>
397
+ createAndImportInstructionRenderer (RuleMatcher &M,
398
+ InstructionMatcher &InsnMatcher,
399
+ const TreePatternNode &Dst);
399
400
Expected<action_iterator> createAndImportSubInstructionRenderer (
400
401
action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
401
- const TreePatternNode &Src, unsigned TempReg);
402
+ unsigned TempReg);
402
403
Expected<action_iterator>
403
404
createInstructionRenderer (action_iterator InsertPt, RuleMatcher &M,
404
405
const TreePatternNode &Dst);
405
406
406
407
Expected<action_iterator>
407
408
importExplicitDefRenderers (action_iterator InsertPt, RuleMatcher &M,
408
409
BuildMIAction &DstMIBuilder,
409
- const TreePatternNode &Src,
410
410
const TreePatternNode &Dst, unsigned Start = 0 );
411
411
412
- Expected<action_iterator> importExplicitUseRenderers (
413
- action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
414
- const llvm::TreePatternNode &Dst, const TreePatternNode &Src);
415
- Expected<action_iterator> importExplicitUseRenderer (
416
- action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
417
- const TreePatternNode &DstChild, const TreePatternNode &Src);
412
+ Expected<action_iterator>
413
+ importExplicitUseRenderers (action_iterator InsertPt, RuleMatcher &M,
414
+ BuildMIAction &DstMIBuilder,
415
+ const TreePatternNode &Dst);
416
+ Expected<action_iterator>
417
+ importExplicitUseRenderer (action_iterator InsertPt, RuleMatcher &Rule,
418
+ BuildMIAction &DstMIBuilder,
419
+ const TreePatternNode &Dst);
418
420
Error importDefaultOperandRenderers (action_iterator InsertPt, RuleMatcher &M,
419
421
BuildMIAction &DstMIBuilder,
420
422
const DAGDefaultOperand &DefaultOp) const ;
@@ -1196,23 +1198,22 @@ Error GlobalISelEmitter::importChildMatcher(
1196
1198
1197
1199
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer (
1198
1200
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1199
- const TreePatternNode &DstChild, const TreePatternNode &Src ) {
1201
+ const TreePatternNode &Dst ) {
1200
1202
1201
- const auto &SubOperand = Rule.getComplexSubOperand (DstChild .getName ());
1203
+ const auto &SubOperand = Rule.getComplexSubOperand (Dst .getName ());
1202
1204
if (SubOperand) {
1203
1205
DstMIBuilder.addRenderer <RenderComplexPatternOperand>(
1204
- *std::get<0 >(*SubOperand), DstChild .getName (), std::get<1 >(*SubOperand),
1206
+ *std::get<0 >(*SubOperand), Dst .getName (), std::get<1 >(*SubOperand),
1205
1207
std::get<2 >(*SubOperand));
1206
1208
return InsertPt;
1207
1209
}
1208
1210
1209
- if (!DstChild .isLeaf ()) {
1210
- if (DstChild .getOperator ()->isSubClassOf (" SDNodeXForm" )) {
1211
- auto &Child = DstChild .getChild (0 );
1212
- auto I = SDNodeXFormEquivs.find (DstChild .getOperator ());
1211
+ if (!Dst .isLeaf ()) {
1212
+ if (Dst .getOperator ()->isSubClassOf (" SDNodeXForm" )) {
1213
+ auto &Child = Dst .getChild (0 );
1214
+ auto I = SDNodeXFormEquivs.find (Dst .getOperator ());
1213
1215
if (I != SDNodeXFormEquivs.end ()) {
1214
- const Record *XFormOpc =
1215
- DstChild.getOperator ()->getValueAsDef (" Opcode" );
1216
+ const Record *XFormOpc = Dst.getOperator ()->getValueAsDef (" Opcode" );
1216
1217
if (XFormOpc->getName () == " timm" ) {
1217
1218
// If this is a TargetConstant, there won't be a corresponding
1218
1219
// instruction to transform. Instead, this will refer directly to an
@@ -1231,10 +1232,10 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1231
1232
1232
1233
// We accept 'bb' here. It's an operator because BasicBlockSDNode isn't
1233
1234
// inline, but in MI it's just another operand.
1234
- if (DstChild .getOperator ()->isSubClassOf (" SDNode" )) {
1235
- auto &ChildSDNI = CGP.getSDNodeInfo (DstChild .getOperator ());
1235
+ if (Dst .getOperator ()->isSubClassOf (" SDNode" )) {
1236
+ auto &ChildSDNI = CGP.getSDNodeInfo (Dst .getOperator ());
1236
1237
if (ChildSDNI.getSDClassName () == " BasicBlockSDNode" ) {
1237
- DstMIBuilder.addRenderer <CopyRenderer>(DstChild .getName ());
1238
+ DstMIBuilder.addRenderer <CopyRenderer>(Dst .getName ());
1238
1239
return InsertPt;
1239
1240
}
1240
1241
}
@@ -1243,26 +1244,25 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1243
1244
// rendered as operands.
1244
1245
// FIXME: The target should be able to choose sign-extended when appropriate
1245
1246
// (e.g. on Mips).
1246
- if (DstChild .getOperator ()->getName () == " timm" ) {
1247
- DstMIBuilder.addRenderer <CopyRenderer>(DstChild .getName ());
1247
+ if (Dst .getOperator ()->getName () == " timm" ) {
1248
+ DstMIBuilder.addRenderer <CopyRenderer>(Dst .getName ());
1248
1249
return InsertPt;
1249
1250
}
1250
- if (DstChild .getOperator ()->getName () == " tframeindex" ) {
1251
- DstMIBuilder.addRenderer <CopyRenderer>(DstChild .getName ());
1251
+ if (Dst .getOperator ()->getName () == " tframeindex" ) {
1252
+ DstMIBuilder.addRenderer <CopyRenderer>(Dst .getName ());
1252
1253
return InsertPt;
1253
1254
}
1254
- if (DstChild .getOperator ()->getName () == " imm" ) {
1255
- DstMIBuilder.addRenderer <CopyConstantAsImmRenderer>(DstChild .getName ());
1255
+ if (Dst .getOperator ()->getName () == " imm" ) {
1256
+ DstMIBuilder.addRenderer <CopyConstantAsImmRenderer>(Dst .getName ());
1256
1257
return InsertPt;
1257
1258
}
1258
- if (DstChild.getOperator ()->getName () == " fpimm" ) {
1259
- DstMIBuilder.addRenderer <CopyFConstantAsFPImmRenderer>(
1260
- DstChild.getName ());
1259
+ if (Dst.getOperator ()->getName () == " fpimm" ) {
1260
+ DstMIBuilder.addRenderer <CopyFConstantAsFPImmRenderer>(Dst.getName ());
1261
1261
return InsertPt;
1262
1262
}
1263
1263
1264
- if (DstChild .getOperator ()->isSubClassOf (" Instruction" )) {
1265
- auto OpTy = getInstResultType (DstChild , Target);
1264
+ if (Dst .getOperator ()->isSubClassOf (" Instruction" )) {
1265
+ auto OpTy = getInstResultType (Dst , Target);
1266
1266
if (!OpTy)
1267
1267
return OpTy.takeError ();
1268
1268
@@ -1272,29 +1272,28 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1272
1272
DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1273
1273
1274
1274
auto InsertPtOrError = createAndImportSubInstructionRenderer (
1275
- ++InsertPt, Rule, DstChild, Src , TempRegID);
1275
+ ++InsertPt, Rule, Dst , TempRegID);
1276
1276
if (auto Error = InsertPtOrError.takeError ())
1277
1277
return std::move (Error);
1278
1278
return InsertPtOrError.get ();
1279
1279
}
1280
1280
1281
1281
return failedImport (" Dst pattern child isn't a leaf node or an MBB" +
1282
- llvm::to_string (DstChild ));
1282
+ llvm::to_string (Dst ));
1283
1283
}
1284
1284
1285
1285
// It could be a specific immediate in which case we should just check for
1286
1286
// that immediate.
1287
- if (const IntInit *ChildIntInit =
1288
- dyn_cast<IntInit>(DstChild.getLeafValue ())) {
1287
+ if (const IntInit *ChildIntInit = dyn_cast<IntInit>(Dst.getLeafValue ())) {
1289
1288
DstMIBuilder.addRenderer <ImmRenderer>(ChildIntInit->getValue ());
1290
1289
return InsertPt;
1291
1290
}
1292
1291
1293
1292
// Otherwise, we're looking for a bog-standard RegisterClass operand.
1294
- if (auto *ChildDefInit = dyn_cast<DefInit>(DstChild .getLeafValue ())) {
1293
+ if (auto *ChildDefInit = dyn_cast<DefInit>(Dst .getLeafValue ())) {
1295
1294
auto *ChildRec = ChildDefInit->getDef ();
1296
1295
1297
- ArrayRef<TypeSetByHwMode> ChildTypes = DstChild .getExtTypes ();
1296
+ ArrayRef<TypeSetByHwMode> ChildTypes = Dst .getExtTypes ();
1298
1297
if (ChildTypes.size () != 1 )
1299
1298
return failedImport (" Dst pattern child has multiple results" );
1300
1299
@@ -1315,11 +1314,11 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1315
1314
if (ChildRec->isSubClassOf (" RegisterOperand" ) &&
1316
1315
!ChildRec->isValueUnset (" GIZeroRegister" )) {
1317
1316
DstMIBuilder.addRenderer <CopyOrAddZeroRegRenderer>(
1318
- DstChild .getName (), ChildRec->getValueAsDef (" GIZeroRegister" ));
1317
+ Dst .getName (), ChildRec->getValueAsDef (" GIZeroRegister" ));
1319
1318
return InsertPt;
1320
1319
}
1321
1320
1322
- DstMIBuilder.addRenderer <CopyRenderer>(DstChild .getName ());
1321
+ DstMIBuilder.addRenderer <CopyRenderer>(Dst .getName ());
1323
1322
return InsertPt;
1324
1323
}
1325
1324
@@ -1335,9 +1334,9 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1335
1334
return failedImport (
1336
1335
" SelectionDAG ComplexPattern not mapped to GlobalISel" );
1337
1336
1338
- const OperandMatcher &OM = Rule.getOperandMatcher (DstChild .getName ());
1337
+ const OperandMatcher &OM = Rule.getOperandMatcher (Dst .getName ());
1339
1338
DstMIBuilder.addRenderer <RenderComplexPatternOperand>(
1340
- *ComplexPattern->second , DstChild .getName (),
1339
+ *ComplexPattern->second , Dst .getName (),
1341
1340
OM.getAllocatedTemporariesBaseID ());
1342
1341
return InsertPt;
1343
1342
}
@@ -1348,16 +1347,19 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1348
1347
1349
1348
// Handle the case where the MVT/register class is omitted in the dest pattern
1350
1349
// but MVT exists in the source pattern.
1351
- if (isa<UnsetInit>(DstChild.getLeafValue ()) &&
1352
- Rule.hasOperand (DstChild.getName ())) {
1353
- DstMIBuilder.addRenderer <CopyRenderer>(DstChild.getName ());
1350
+ if (isa<UnsetInit>(Dst.getLeafValue ()) && Rule.hasOperand (Dst.getName ())) {
1351
+ DstMIBuilder.addRenderer <CopyRenderer>(Dst.getName ());
1354
1352
return InsertPt;
1355
1353
}
1356
1354
return failedImport (" Dst pattern child is an unsupported kind" );
1357
1355
}
1358
1356
1357
+ // / Generates code that builds the resulting instruction(s) from the destination
1358
+ // / DAG. Note that to do this we do not and should not need the source DAG.
1359
+ // / We do need to know whether a generated instruction defines a result of the
1360
+ // / source DAG; this information is available via RuleMatcher::hasOperand.
1359
1361
Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer (
1360
- RuleMatcher &M, InstructionMatcher &InsnMatcher, const TreePatternNode &Src,
1362
+ RuleMatcher &M, InstructionMatcher &InsnMatcher,
1361
1363
const TreePatternNode &Dst) {
1362
1364
auto InsertPtOrError = createInstructionRenderer (M.actions_end (), M, Dst);
1363
1365
if (auto Error = InsertPtOrError.takeError ())
@@ -1377,23 +1379,21 @@ Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
1377
1379
CopyToPhysRegMIBuilder.addRenderer <CopyPhysRegRenderer>(PhysInput.first );
1378
1380
}
1379
1381
1380
- if (auto Error =
1381
- importExplicitDefRenderers (InsertPt, M, DstMIBuilder, Src, Dst)
1382
- .takeError ())
1382
+ if (auto Error = importExplicitDefRenderers (InsertPt, M, DstMIBuilder, Dst)
1383
+ .takeError ())
1383
1384
return std::move (Error);
1384
1385
1385
- if (auto Error =
1386
- importExplicitUseRenderers (InsertPt, M, DstMIBuilder, Dst, Src)
1387
- .takeError ())
1386
+ if (auto Error = importExplicitUseRenderers (InsertPt, M, DstMIBuilder, Dst)
1387
+ .takeError ())
1388
1388
return std::move (Error);
1389
1389
1390
1390
return DstMIBuilder;
1391
1391
}
1392
1392
1393
1393
Expected<action_iterator>
1394
1394
GlobalISelEmitter::createAndImportSubInstructionRenderer (
1395
- const action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
1396
- const TreePatternNode &Src, unsigned TempRegID) {
1395
+ action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
1396
+ unsigned TempRegID) {
1397
1397
auto InsertPtOrError = createInstructionRenderer (InsertPt, M, Dst);
1398
1398
1399
1399
// TODO: Assert there's exactly one result.
@@ -1408,13 +1408,13 @@ GlobalISelEmitter::createAndImportSubInstructionRenderer(
1408
1408
DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID, true );
1409
1409
1410
1410
// Handle additional (ignored) results.
1411
- InsertPtOrError = importExplicitDefRenderers (
1412
- std::prev (*InsertPtOrError), M, DstMIBuilder, Src , Dst, /* Start=*/ 1 );
1411
+ InsertPtOrError = importExplicitDefRenderers (std::prev (*InsertPtOrError), M,
1412
+ DstMIBuilder , Dst, /* Start=*/ 1 );
1413
1413
if (auto Error = InsertPtOrError.takeError ())
1414
1414
return std::move (Error);
1415
1415
1416
- InsertPtOrError = importExplicitUseRenderers (InsertPtOrError. get (), M,
1417
- DstMIBuilder, Dst, Src );
1416
+ InsertPtOrError =
1417
+ importExplicitUseRenderers (InsertPtOrError. get (), M, DstMIBuilder, Dst);
1418
1418
if (auto Error = InsertPtOrError.takeError ())
1419
1419
return std::move (Error);
1420
1420
@@ -1448,7 +1448,7 @@ Expected<action_iterator> GlobalISelEmitter::createInstructionRenderer(
1448
1448
1449
1449
Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers (
1450
1450
action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1451
- const TreePatternNode &Src, const TreePatternNode & Dst, unsigned Start) {
1451
+ const TreePatternNode &Dst, unsigned Start) {
1452
1452
const CodeGenInstruction *DstI = DstMIBuilder.getCGI ();
1453
1453
1454
1454
// Some instructions have multiple defs, but are missing a type entry
@@ -1497,7 +1497,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers(
1497
1497
1498
1498
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers (
1499
1499
action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1500
- const llvm:: TreePatternNode &Dst, const llvm::TreePatternNode &Src ) {
1500
+ const TreePatternNode &Dst) {
1501
1501
const CodeGenInstruction *DstI = DstMIBuilder.getCGI ();
1502
1502
CodeGenInstruction *OrigDstI = &Target.getInstruction (Dst.getOperator ());
1503
1503
@@ -1527,7 +1527,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1527
1527
TempRegID);
1528
1528
1529
1529
auto InsertPtOrError = createAndImportSubInstructionRenderer (
1530
- ++InsertPt, M, ValChild, Src, TempRegID);
1530
+ ++InsertPt, M, ValChild, TempRegID);
1531
1531
if (auto Error = InsertPtOrError.takeError ())
1532
1532
return std::move (Error);
1533
1533
@@ -1585,7 +1585,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1585
1585
CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx (SubRegInit->getDef ());
1586
1586
1587
1587
auto InsertPtOrError =
1588
- importExplicitUseRenderer (InsertPt, M, DstMIBuilder, ValChild, Src );
1588
+ importExplicitUseRenderer (InsertPt, M, DstMIBuilder, ValChild);
1589
1589
if (auto Error = InsertPtOrError.takeError ())
1590
1590
return std::move (Error);
1591
1591
InsertPt = InsertPtOrError.get ();
@@ -1654,7 +1654,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1654
1654
}
1655
1655
1656
1656
auto InsertPtOrError = importExplicitUseRenderer (InsertPt, M, DstMIBuilder,
1657
- Dst.getChild (Child), Src );
1657
+ Dst.getChild (Child));
1658
1658
if (auto Error = InsertPtOrError.takeError ())
1659
1659
return std::move (Error);
1660
1660
InsertPt = InsertPtOrError.get ();
@@ -2135,7 +2135,7 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
2135
2135
}
2136
2136
2137
2137
auto DstMIBuilderOrError =
2138
- createAndImportInstructionRenderer (M, InsnMatcher, Src, Dst);
2138
+ createAndImportInstructionRenderer (M, InsnMatcher, Dst);
2139
2139
if (auto Error = DstMIBuilderOrError.takeError ())
2140
2140
return std::move (Error);
2141
2141
BuildMIAction &DstMIBuilder = DstMIBuilderOrError.get ();
0 commit comments