@@ -418,7 +418,8 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
418418 const TreePatternNode &N) const ;
419419
420420 Error importLeafNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
421- const TreePatternNode &N) const ;
421+ const TreePatternNode &N,
422+ action_iterator InsertPt) const ;
422423
423424 Error importXFormNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
424425 const TreePatternNode &N) const ;
@@ -431,9 +432,6 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
431432 const TreePatternNode &N,
432433 action_iterator &InsertPt) const ;
433434
434- Error importDefaultOperandRenderers (action_iterator InsertPt, RuleMatcher &M,
435- BuildMIAction &DstMIBuilder,
436- const DAGDefaultOperand &DefaultOp) const ;
437435 Error importImplicitDefRenderers (BuildMIAction &DstMIBuilder,
438436 ArrayRef<const Record *> ImplicitDefs) const ;
439437
@@ -1291,7 +1289,8 @@ Error GlobalISelEmitter::importNamedNodeRenderer(
12911289
12921290// Equivalent of MatcherGen::EmitResultLeafAsOperand.
12931291Error GlobalISelEmitter::importLeafNodeRenderer (
1294- RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N) const {
1292+ RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N,
1293+ action_iterator InsertPt) const {
12951294 if (const auto *II = dyn_cast<IntInit>(N.getLeafValue ())) {
12961295 MIBuilder.addRenderer <ImmRenderer>(II->getValue ());
12971296 return Error::success ();
@@ -1300,11 +1299,24 @@ Error GlobalISelEmitter::importLeafNodeRenderer(
13001299 if (const auto *DI = dyn_cast<DefInit>(N.getLeafValue ())) {
13011300 const Record *R = DI->getDef ();
13021301
1303- if (R->isSubClassOf (" Register" )) {
1302+ if (R->isSubClassOf (" Register" ) || R-> getName () == " zero_reg " ) {
13041303 MIBuilder.addRenderer <AddRegisterRenderer>(Target, R);
13051304 return Error::success ();
13061305 }
13071306
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+
13081320 if (R->isSubClassOf (" SubRegIndex" )) {
13091321 const CodeGenSubRegIndex *SubRegIndex = CGRegs.getSubRegIdx (R);
13101322 MIBuilder.addRenderer <ImmRenderer>(SubRegIndex->EnumValue );
@@ -1386,7 +1398,7 @@ Error GlobalISelEmitter::importNodeRenderer(RuleMatcher &M,
13861398 return importNamedNodeRenderer (M, MIBuilder, N);
13871399
13881400 if (N.isLeaf ())
1389- return importLeafNodeRenderer (M, MIBuilder, N);
1401+ return importLeafNodeRenderer (M, MIBuilder, N, InsertPt );
13901402
13911403 if (N.getOperator ()->isSubClassOf (" SDNodeXForm" ))
13921404 return importXFormNodeRenderer (M, MIBuilder, N);
@@ -1707,11 +1719,11 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
17071719 // This is a predicate or optional def operand which the pattern has not
17081720 // overridden, or which we aren't letting it override; emit the 'default
17091721 // 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+ }
17151727
17161728 ++NumDefaultOps;
17171729 continue ;
@@ -1734,47 +1746,6 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
17341746 return InsertPt;
17351747}
17361748
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-
17781749Error GlobalISelEmitter::importImplicitDefRenderers (
17791750 BuildMIAction &DstMIBuilder, ArrayRef<const Record *> ImplicitDefs) const {
17801751 if (!ImplicitDefs.empty ())
0 commit comments