@@ -418,7 +418,8 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
418
418
const TreePatternNode &N) const ;
419
419
420
420
Error importLeafNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
421
- const TreePatternNode &N) const ;
421
+ const TreePatternNode &N,
422
+ action_iterator InsertPt) const ;
422
423
423
424
Error importXFormNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
424
425
const TreePatternNode &N) const ;
@@ -431,9 +432,6 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
431
432
const TreePatternNode &N,
432
433
action_iterator &InsertPt) const ;
433
434
434
- Error importDefaultOperandRenderers (action_iterator InsertPt, RuleMatcher &M,
435
- BuildMIAction &DstMIBuilder,
436
- const DAGDefaultOperand &DefaultOp) const ;
437
435
Error importImplicitDefRenderers (BuildMIAction &DstMIBuilder,
438
436
ArrayRef<const Record *> ImplicitDefs) const ;
439
437
@@ -1291,7 +1289,8 @@ Error GlobalISelEmitter::importNamedNodeRenderer(
1291
1289
1292
1290
// Equivalent of MatcherGen::EmitResultLeafAsOperand.
1293
1291
Error GlobalISelEmitter::importLeafNodeRenderer (
1294
- RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N) const {
1292
+ RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N,
1293
+ action_iterator InsertPt) const {
1295
1294
if (const auto *II = dyn_cast<IntInit>(N.getLeafValue ())) {
1296
1295
MIBuilder.addRenderer <ImmRenderer>(II->getValue ());
1297
1296
return Error::success ();
@@ -1300,11 +1299,29 @@ Error GlobalISelEmitter::importLeafNodeRenderer(
1300
1299
if (const auto *DI = dyn_cast<DefInit>(N.getLeafValue ())) {
1301
1300
const Record *R = DI->getDef ();
1302
1301
1303
- if (R->isSubClassOf (" Register" )) {
1302
+ if (R->isSubClassOf (" Register" ) || R-> getName () == " zero_reg " ) {
1304
1303
MIBuilder.addRenderer <AddRegisterRenderer>(Target, R);
1305
1304
return Error::success ();
1306
1305
}
1307
1306
1307
+ if (R->getName () == " undef_tied_input" ) {
1308
+ std::optional<LLTCodeGen> OpTyOrNone = MVTToLLT (N.getSimpleType (0 ));
1309
+ if (!OpTyOrNone)
1310
+ return failedImport (" unsupported type" );
1311
+
1312
+ unsigned TempRegID = M.allocateTempRegID ();
1313
+ M.insertAction <MakeTempRegisterAction>(InsertPt, *OpTyOrNone, TempRegID);
1314
+
1315
+ auto I = M.insertAction <BuildMIAction>(
1316
+ InsertPt, M.allocateOutputInsnID (),
1317
+ &Target.getInstruction (RK.getDef (" IMPLICIT_DEF" )));
1318
+ auto &ImpDefBuilder = static_cast <BuildMIAction &>(**I);
1319
+ ImpDefBuilder.addRenderer <TempRegRenderer>(TempRegID, /* IsDef=*/ true );
1320
+
1321
+ MIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1322
+ return Error::success ();
1323
+ }
1324
+
1308
1325
if (R->isSubClassOf (" SubRegIndex" )) {
1309
1326
const CodeGenSubRegIndex *SubRegIndex = CGRegs.getSubRegIdx (R);
1310
1327
MIBuilder.addRenderer <ImmRenderer>(SubRegIndex->EnumValue );
@@ -1386,7 +1403,7 @@ Error GlobalISelEmitter::importNodeRenderer(RuleMatcher &M,
1386
1403
return importNamedNodeRenderer (M, MIBuilder, N);
1387
1404
1388
1405
if (N.isLeaf ())
1389
- return importLeafNodeRenderer (M, MIBuilder, N);
1406
+ return importLeafNodeRenderer (M, MIBuilder, N, InsertPt );
1390
1407
1391
1408
if (N.getOperator ()->isSubClassOf (" SDNodeXForm" ))
1392
1409
return importXFormNodeRenderer (M, MIBuilder, N);
@@ -1707,11 +1724,11 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1707
1724
// This is a predicate or optional def operand which the pattern has not
1708
1725
// overridden, or which we aren't letting it override; emit the 'default
1709
1726
// ops' operands.
1710
-
1711
- const Record *OperandNode = DstI-> Operands [InstOpNo]. Rec ;
1712
- if (auto Error = importDefaultOperandRenderers (
1713
- InsertPt, M, DstMIBuilder, CGP. getDefaultOperand (OperandNode)))
1714
- return std::move (Error);
1727
+ for ( const TreePatternNode &OpNode :
1728
+ make_pointee_range (CGP. getDefaultOperand (OperandNode). DefaultOps )) {
1729
+ if (Error Err = importNodeRenderer (M, DstMIBuilder, OpNode, InsertPt))
1730
+ return Err;
1731
+ }
1715
1732
1716
1733
++NumDefaultOps;
1717
1734
continue ;
@@ -1734,47 +1751,6 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1734
1751
return InsertPt;
1735
1752
}
1736
1753
1737
- Error GlobalISelEmitter::importDefaultOperandRenderers (
1738
- action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1739
- const DAGDefaultOperand &DefaultOp) const {
1740
- for (const auto &Op : DefaultOp.DefaultOps ) {
1741
- const auto &N = *Op;
1742
- if (!N.isLeaf ())
1743
- return failedImport (" Could not add default op" );
1744
-
1745
- const auto *DefaultOp = N.getLeafValue ();
1746
-
1747
- if (const DefInit *DefaultDefOp = dyn_cast<DefInit>(DefaultOp)) {
1748
- std::optional<LLTCodeGen> OpTyOrNone = MVTToLLT (N.getSimpleType (0 ));
1749
- auto *Def = DefaultDefOp->getDef ();
1750
- if (Def->getName () == " undef_tied_input" ) {
1751
- unsigned TempRegID = M.allocateTempRegID ();
1752
- M.insertAction <MakeTempRegisterAction>(InsertPt, *OpTyOrNone,
1753
- TempRegID);
1754
- InsertPt = M.insertAction <BuildMIAction>(
1755
- InsertPt, M.allocateOutputInsnID (),
1756
- &Target.getInstruction (RK.getDef (" IMPLICIT_DEF" )));
1757
- BuildMIAction &IDMIBuilder =
1758
- *static_cast <BuildMIAction *>(InsertPt->get ());
1759
- IDMIBuilder.addRenderer <TempRegRenderer>(TempRegID, /* IsDef=*/ true );
1760
- DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1761
- } else {
1762
- DstMIBuilder.addRenderer <AddRegisterRenderer>(Target, Def);
1763
- }
1764
- continue ;
1765
- }
1766
-
1767
- if (const IntInit *DefaultIntOp = dyn_cast<IntInit>(DefaultOp)) {
1768
- DstMIBuilder.addRenderer <ImmRenderer>(DefaultIntOp->getValue ());
1769
- continue ;
1770
- }
1771
-
1772
- return failedImport (" Could not add default op" );
1773
- }
1774
-
1775
- return Error::success ();
1776
- }
1777
-
1778
1754
Error GlobalISelEmitter::importImplicitDefRenderers (
1779
1755
BuildMIAction &DstMIBuilder, ArrayRef<const Record *> ImplicitDefs) const {
1780
1756
if (!ImplicitDefs.empty ())
0 commit comments