Skip to content

Commit 8a6029f

Browse files
committed
importXFormNodeRenderer
1 parent ea5ae36 commit 8a6029f

File tree

1 file changed

+32
-18
lines changed

1 file changed

+32
-18
lines changed

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,9 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
419419
Error importLeafNodeRenderer(RuleMatcher &M, BuildMIAction &MIBuilder,
420420
const TreePatternNode &N) const;
421421

422+
Error importXFormNodeRenderer(RuleMatcher &M, BuildMIAction &MIBuilder,
423+
const TreePatternNode &N) const;
424+
422425
Expected<action_iterator>
423426
importExplicitUseRenderer(action_iterator InsertPt, RuleMatcher &Rule,
424427
BuildMIAction &DstMIBuilder,
@@ -1310,6 +1313,32 @@ Error GlobalISelEmitter::importLeafNodeRenderer(
13101313
return failedImport("unrecognized node " + to_string(N));
13111314
}
13121315

1316+
// Equivalent of MatcherGen::EmitResultSDNodeXFormAsOperand.
1317+
Error GlobalISelEmitter::importXFormNodeRenderer(
1318+
RuleMatcher &M, BuildMIAction &MIBuilder, const TreePatternNode &N) const {
1319+
const Record *XFormRec = N.getOperator();
1320+
auto I = SDNodeXFormEquivs.find(XFormRec);
1321+
if (I == SDNodeXFormEquivs.end())
1322+
return failedImport("SDNodeXForm " + XFormRec->getName() +
1323+
" does not have GISel equivalent");
1324+
1325+
const Record *XFormEquivRec = I->second;
1326+
const TreePatternNode &Node = N.getChild(0);
1327+
1328+
const Record *XFormOpc = CGP.getSDNodeTransform(XFormRec).first;
1329+
if (XFormOpc->getName() == "timm") {
1330+
// If this is a TargetConstant, there won't be a corresponding
1331+
// instruction to transform. Instead, this will refer directly to an
1332+
// operand in an instruction's operand list.
1333+
MIBuilder.addRenderer<CustomOperandRenderer>(*XFormEquivRec,
1334+
Node.getName());
1335+
} else {
1336+
MIBuilder.addRenderer<CustomRenderer>(*XFormEquivRec, Node.getName());
1337+
}
1338+
1339+
return Error::success();
1340+
}
1341+
13131342
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13141343
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
13151344
const TreePatternNode &Dst) const {
@@ -1326,24 +1355,9 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13261355
}
13271356

13281357
if (Dst.getOperator()->isSubClassOf("SDNodeXForm")) {
1329-
auto &Child = Dst.getChild(0);
1330-
auto I = SDNodeXFormEquivs.find(Dst.getOperator());
1331-
if (I != SDNodeXFormEquivs.end()) {
1332-
const Record *XFormOpc = Dst.getOperator()->getValueAsDef("Opcode");
1333-
if (XFormOpc->getName() == "timm") {
1334-
// If this is a TargetConstant, there won't be a corresponding
1335-
// instruction to transform. Instead, this will refer directly to an
1336-
// operand in an instruction's operand list.
1337-
DstMIBuilder.addRenderer<CustomOperandRenderer>(*I->second,
1338-
Child.getName());
1339-
} else {
1340-
DstMIBuilder.addRenderer<CustomRenderer>(*I->second, Child.getName());
1341-
}
1342-
1343-
return InsertPt;
1344-
}
1345-
return failedImport("SDNodeXForm " + Child.getName() +
1346-
" has no custom renderer");
1358+
if (Error Err = importXFormNodeRenderer(Rule, DstMIBuilder, Dst))
1359+
return Err;
1360+
return InsertPt;
13471361
}
13481362

13491363
if (Dst.getOperator()->isSubClassOf("Instruction")) {

0 commit comments

Comments
 (0)