@@ -422,6 +422,10 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
422
422
Error importXFormNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
423
423
const TreePatternNode &N) const ;
424
424
425
+ Error importInstructionNodeRenderer (RuleMatcher &M, BuildMIAction &MIBuilder,
426
+ const TreePatternNode &N,
427
+ action_iterator &InsertPt) const ;
428
+
425
429
Expected<action_iterator>
426
430
importExplicitUseRenderer (action_iterator InsertPt, RuleMatcher &Rule,
427
431
BuildMIAction &DstMIBuilder,
@@ -1339,6 +1343,27 @@ Error GlobalISelEmitter::importXFormNodeRenderer(
1339
1343
return Error::success ();
1340
1344
}
1341
1345
1346
+ // Equivalent of MatcherGen::EmitResultInstructionAsOperand.
1347
+ Error GlobalISelEmitter::importInstructionNodeRenderer (
1348
+ RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N,
1349
+ action_iterator &InsertPt) const {
1350
+ Expected<LLTCodeGen> OpTy = getInstResultType (N, Target);
1351
+ if (!OpTy)
1352
+ return OpTy.takeError ();
1353
+
1354
+ unsigned TempRegID = M.allocateTempRegID ();
1355
+ InsertPt = M.insertAction <MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1356
+ MIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1357
+
1358
+ auto InsertPtOrError =
1359
+ createAndImportSubInstructionRenderer (++InsertPt, M, N, TempRegID);
1360
+ if (!InsertPtOrError)
1361
+ return InsertPtOrError.takeError ();
1362
+
1363
+ InsertPt = *InsertPtOrError;
1364
+ return Error::success ();
1365
+ }
1366
+
1342
1367
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer (
1343
1368
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1344
1369
const TreePatternNode &Dst) const {
@@ -1361,20 +1386,10 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1361
1386
}
1362
1387
1363
1388
if (Dst.getOperator ()->isSubClassOf (" Instruction" )) {
1364
- auto OpTy = getInstResultType (Dst, Target);
1365
- if (!OpTy)
1366
- return OpTy.takeError ();
1367
-
1368
- unsigned TempRegID = Rule.allocateTempRegID ();
1369
- InsertPt =
1370
- Rule.insertAction <MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1371
- DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1372
-
1373
- auto InsertPtOrError =
1374
- createAndImportSubInstructionRenderer (++InsertPt, Rule, Dst, TempRegID);
1375
- if (auto Error = InsertPtOrError.takeError ())
1376
- return std::move (Error);
1377
- return InsertPtOrError.get ();
1389
+ if (Error Err =
1390
+ importInstructionNodeRenderer (Rule, DstMIBuilder, Dst, InsertPt))
1391
+ return Err;
1392
+ return InsertPt;
1378
1393
}
1379
1394
1380
1395
// Should not reach here.
0 commit comments