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