Skip to content

Commit 5ee3665

Browse files
committed
importInstructionNodeRenderer
1 parent e7a645d commit 5ee3665

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,
@@ -1357,6 +1361,30 @@ Error GlobalISelEmitter::importXFormNodeRenderer(
13571361
return Error::success();
13581362
}
13591363

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+
13601388
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13611389
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
13621390
const TreePatternNode &Dst) const {
@@ -1379,20 +1407,10 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13791407
}
13801408

13811409
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;
13961414
}
13971415

13981416
// Should not reach here.

0 commit comments

Comments
 (0)