@@ -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,24 @@ 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
+ unsigned TempRegID = M.allocateTempRegID ();
1310
+ M.insertAction <MakeTempRegisterAction>(InsertPt, *OpTyOrNone, TempRegID);
1311
+ auto I = M.insertAction <BuildMIAction>(
1312
+ InsertPt, M.allocateOutputInsnID (),
1313
+ &Target.getInstruction (RK.getDef (" IMPLICIT_DEF" )));
1314
+ auto &ImpDefBuilder = static_cast <BuildMIAction &>(**I);
1315
+ ImpDefBuilder.addRenderer <TempRegRenderer>(TempRegID, /* IsDef=*/ true );
1316
+ MIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1317
+ return Error::success ();
1318
+ }
1319
+
1308
1320
if (R->isSubClassOf (" SubRegIndex" )) {
1309
1321
const CodeGenSubRegIndex *SubRegIndex = CGRegs.getSubRegIdx (R);
1310
1322
MIBuilder.addRenderer <ImmRenderer>(SubRegIndex->EnumValue );
@@ -1386,7 +1398,7 @@ Error GlobalISelEmitter::importNodeRenderer(RuleMatcher &M,
1386
1398
return importNamedNodeRenderer (M, MIBuilder, N);
1387
1399
1388
1400
if (N.isLeaf ())
1389
- return importLeafNodeRenderer (M, MIBuilder, N);
1401
+ return importLeafNodeRenderer (M, MIBuilder, N, InsertPt );
1390
1402
1391
1403
if (N.getOperator ()->isSubClassOf (" SDNodeXForm" ))
1392
1404
return importXFormNodeRenderer (M, MIBuilder, N);
@@ -1707,11 +1719,11 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1707
1719
// This is a predicate or optional def operand which the pattern has not
1708
1720
// overridden, or which we aren't letting it override; emit the 'default
1709
1721
// 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);
1722
+ for ( const TreePatternNode &OpNode :
1723
+ make_pointee_range (CGP. getDefaultOperand (OperandNode). DefaultOps )) {
1724
+ if (Error Err = importNodeRenderer (M, DstMIBuilder, OpNode, InsertPt))
1725
+ return Err;
1726
+ }
1715
1727
1716
1728
++NumDefaultOps;
1717
1729
continue ;
@@ -1734,47 +1746,6 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1734
1746
return InsertPt;
1735
1747
}
1736
1748
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
1749
Error GlobalISelEmitter::importImplicitDefRenderers (
1779
1750
BuildMIAction &DstMIBuilder, ArrayRef<const Record *> ImplicitDefs) const {
1780
1751
if (!ImplicitDefs.empty ())
0 commit comments