Skip to content

Commit cb3cc0a

Browse files
committed
importInstructionNodeRenderer
1 parent de44234 commit cb3cc0a

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,10 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
422422
Error importXFormNodeRenderer(RuleMatcher &M, BuildMIAction &MIBuilder,
423423
const TreePatternNode &N) const;
424424

425+
Error importInstructionNodeRenderer(RuleMatcher &M, BuildMIAction &MIBuilder,
426+
const TreePatternNode &N,
427+
action_iterator &InsertPt) const;
428+
425429
Expected<action_iterator>
426430
importExplicitUseRenderer(action_iterator InsertPt, RuleMatcher &Rule,
427431
BuildMIAction &DstMIBuilder,
@@ -1360,6 +1364,30 @@ Error GlobalISelEmitter::importXFormNodeRenderer(
13601364
return Error::success();
13611365
}
13621366

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+
13631391
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13641392
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
13651393
const TreePatternNode &Dst) const {
@@ -1382,20 +1410,10 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13821410
}
13831411

13841412
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;
13991417
}
14001418

14011419
// Should not reach here.

0 commit comments

Comments
 (0)