@@ -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,
@@ -1360,6 +1364,30 @@ Error GlobalISelEmitter::importXFormNodeRenderer(
1360
1364
return Error::success ();
1361
1365
}
1362
1366
1367
+ // Equivalent of MatcherGen::EmitResultInstructionAsOperand.
1368
+ Error GlobalISelEmitter::importInstructionNodeRenderer (
1369
+ RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N,
1370
+ action_iterator &InsertPt) const {
1371
+ Expected<LLTCodeGen> OpTy = getInstResultType (N, Target);
1372
+ if (!OpTy)
1373
+ return OpTy.takeError ();
1374
+
1375
+ // TODO: See the comment in importXFormNodeRenderer. We rely on the node
1376
+ // requiring a temporary register, which prevents us from using this
1377
+ // function on the root of the destination DAG.
1378
+ unsigned TempRegID = M.allocateTempRegID ();
1379
+ InsertPt = M.insertAction <MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1380
+ MIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1381
+
1382
+ auto InsertPtOrError =
1383
+ createAndImportSubInstructionRenderer (++InsertPt, M, N, TempRegID);
1384
+ if (!InsertPtOrError)
1385
+ return InsertPtOrError.takeError ();
1386
+
1387
+ InsertPt = *InsertPtOrError;
1388
+ return Error::success ();
1389
+ }
1390
+
1363
1391
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer (
1364
1392
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1365
1393
const TreePatternNode &Dst) const {
@@ -1382,20 +1410,10 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1382
1410
}
1383
1411
1384
1412
if (Dst.getOperator ()->isSubClassOf (" Instruction" )) {
1385
- auto OpTy = getInstResultType (Dst, Target);
1386
- if (!OpTy)
1387
- return OpTy.takeError ();
1388
-
1389
- unsigned TempRegID = Rule.allocateTempRegID ();
1390
- InsertPt =
1391
- Rule.insertAction <MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1392
- DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1393
-
1394
- auto InsertPtOrError =
1395
- createAndImportSubInstructionRenderer (++InsertPt, Rule, Dst, TempRegID);
1396
- if (auto Error = InsertPtOrError.takeError ())
1397
- return std::move (Error);
1398
- return InsertPtOrError.get ();
1413
+ if (Error Err =
1414
+ importInstructionNodeRenderer (Rule, DstMIBuilder, Dst, InsertPt))
1415
+ return Err;
1416
+ return InsertPt;
1399
1417
}
1400
1418
1401
1419
// Should not reach here.
0 commit comments