Skip to content

Commit 86e4f09

Browse files
committed
[TableGen][GISel] Delete unused Src arguments
The last uses were removed in llvm#120332 and llvm#120426. When emitting renderers, we shouldn't look at the source DAG at all. The required information is provided by the destination DAG and by the instructions referenced in that DAG. Sometimes, we do want to know if a leaf was referenced in the source DAG; this can be checked by calling `RuleMatcher::hasOperand`. Any other use of the source DAG when emitting renderers is likely an error.
1 parent 94a13d9 commit 86e4f09

File tree

1 file changed

+62
-66
lines changed

1 file changed

+62
-66
lines changed

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 62 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -393,28 +393,30 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
393393
bool OperandIsAPointer, bool OperandIsImmArg,
394394
unsigned OpIdx, unsigned &TempOpIdx);
395395

396-
Expected<BuildMIAction &> createAndImportInstructionRenderer(
397-
RuleMatcher &M, InstructionMatcher &InsnMatcher,
398-
const TreePatternNode &Src, const TreePatternNode &Dst);
396+
Expected<BuildMIAction &>
397+
createAndImportInstructionRenderer(RuleMatcher &M,
398+
InstructionMatcher &InsnMatcher,
399+
const TreePatternNode &Dst);
399400
Expected<action_iterator> createAndImportSubInstructionRenderer(
400401
action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
401-
const TreePatternNode &Src, unsigned TempReg);
402+
unsigned TempReg);
402403
Expected<action_iterator>
403404
createInstructionRenderer(action_iterator InsertPt, RuleMatcher &M,
404405
const TreePatternNode &Dst);
405406

406407
Expected<action_iterator>
407408
importExplicitDefRenderers(action_iterator InsertPt, RuleMatcher &M,
408409
BuildMIAction &DstMIBuilder,
409-
const TreePatternNode &Src,
410410
const TreePatternNode &Dst, unsigned Start = 0);
411411

412-
Expected<action_iterator> importExplicitUseRenderers(
413-
action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
414-
const llvm::TreePatternNode &Dst, const TreePatternNode &Src);
415-
Expected<action_iterator> importExplicitUseRenderer(
416-
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
417-
const TreePatternNode &DstChild, const TreePatternNode &Src);
412+
Expected<action_iterator>
413+
importExplicitUseRenderers(action_iterator InsertPt, RuleMatcher &M,
414+
BuildMIAction &DstMIBuilder,
415+
const TreePatternNode &Dst);
416+
Expected<action_iterator>
417+
importExplicitUseRenderer(action_iterator InsertPt, RuleMatcher &Rule,
418+
BuildMIAction &DstMIBuilder,
419+
const TreePatternNode &Dst);
418420
Error importDefaultOperandRenderers(action_iterator InsertPt, RuleMatcher &M,
419421
BuildMIAction &DstMIBuilder,
420422
const DAGDefaultOperand &DefaultOp) const;
@@ -1196,23 +1198,22 @@ Error GlobalISelEmitter::importChildMatcher(
11961198

11971199
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
11981200
action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1199-
const TreePatternNode &DstChild, const TreePatternNode &Src) {
1201+
const TreePatternNode &Dst) {
12001202

1201-
const auto &SubOperand = Rule.getComplexSubOperand(DstChild.getName());
1203+
const auto &SubOperand = Rule.getComplexSubOperand(Dst.getName());
12021204
if (SubOperand) {
12031205
DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
1204-
*std::get<0>(*SubOperand), DstChild.getName(), std::get<1>(*SubOperand),
1206+
*std::get<0>(*SubOperand), Dst.getName(), std::get<1>(*SubOperand),
12051207
std::get<2>(*SubOperand));
12061208
return InsertPt;
12071209
}
12081210

1209-
if (!DstChild.isLeaf()) {
1210-
if (DstChild.getOperator()->isSubClassOf("SDNodeXForm")) {
1211-
auto &Child = DstChild.getChild(0);
1212-
auto I = SDNodeXFormEquivs.find(DstChild.getOperator());
1211+
if (!Dst.isLeaf()) {
1212+
if (Dst.getOperator()->isSubClassOf("SDNodeXForm")) {
1213+
auto &Child = Dst.getChild(0);
1214+
auto I = SDNodeXFormEquivs.find(Dst.getOperator());
12131215
if (I != SDNodeXFormEquivs.end()) {
1214-
const Record *XFormOpc =
1215-
DstChild.getOperator()->getValueAsDef("Opcode");
1216+
const Record *XFormOpc = Dst.getOperator()->getValueAsDef("Opcode");
12161217
if (XFormOpc->getName() == "timm") {
12171218
// If this is a TargetConstant, there won't be a corresponding
12181219
// instruction to transform. Instead, this will refer directly to an
@@ -1231,10 +1232,10 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12311232

12321233
// We accept 'bb' here. It's an operator because BasicBlockSDNode isn't
12331234
// inline, but in MI it's just another operand.
1234-
if (DstChild.getOperator()->isSubClassOf("SDNode")) {
1235-
auto &ChildSDNI = CGP.getSDNodeInfo(DstChild.getOperator());
1235+
if (Dst.getOperator()->isSubClassOf("SDNode")) {
1236+
auto &ChildSDNI = CGP.getSDNodeInfo(Dst.getOperator());
12361237
if (ChildSDNI.getSDClassName() == "BasicBlockSDNode") {
1237-
DstMIBuilder.addRenderer<CopyRenderer>(DstChild.getName());
1238+
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
12381239
return InsertPt;
12391240
}
12401241
}
@@ -1243,26 +1244,25 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12431244
// rendered as operands.
12441245
// FIXME: The target should be able to choose sign-extended when appropriate
12451246
// (e.g. on Mips).
1246-
if (DstChild.getOperator()->getName() == "timm") {
1247-
DstMIBuilder.addRenderer<CopyRenderer>(DstChild.getName());
1247+
if (Dst.getOperator()->getName() == "timm") {
1248+
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
12481249
return InsertPt;
12491250
}
1250-
if (DstChild.getOperator()->getName() == "tframeindex") {
1251-
DstMIBuilder.addRenderer<CopyRenderer>(DstChild.getName());
1251+
if (Dst.getOperator()->getName() == "tframeindex") {
1252+
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
12521253
return InsertPt;
12531254
}
1254-
if (DstChild.getOperator()->getName() == "imm") {
1255-
DstMIBuilder.addRenderer<CopyConstantAsImmRenderer>(DstChild.getName());
1255+
if (Dst.getOperator()->getName() == "imm") {
1256+
DstMIBuilder.addRenderer<CopyConstantAsImmRenderer>(Dst.getName());
12561257
return InsertPt;
12571258
}
1258-
if (DstChild.getOperator()->getName() == "fpimm") {
1259-
DstMIBuilder.addRenderer<CopyFConstantAsFPImmRenderer>(
1260-
DstChild.getName());
1259+
if (Dst.getOperator()->getName() == "fpimm") {
1260+
DstMIBuilder.addRenderer<CopyFConstantAsFPImmRenderer>(Dst.getName());
12611261
return InsertPt;
12621262
}
12631263

1264-
if (DstChild.getOperator()->isSubClassOf("Instruction")) {
1265-
auto OpTy = getInstResultType(DstChild, Target);
1264+
if (Dst.getOperator()->isSubClassOf("Instruction")) {
1265+
auto OpTy = getInstResultType(Dst, Target);
12661266
if (!OpTy)
12671267
return OpTy.takeError();
12681268

@@ -1272,29 +1272,28 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12721272
DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID);
12731273

12741274
auto InsertPtOrError = createAndImportSubInstructionRenderer(
1275-
++InsertPt, Rule, DstChild, Src, TempRegID);
1275+
++InsertPt, Rule, Dst, TempRegID);
12761276
if (auto Error = InsertPtOrError.takeError())
12771277
return std::move(Error);
12781278
return InsertPtOrError.get();
12791279
}
12801280

12811281
return failedImport("Dst pattern child isn't a leaf node or an MBB" +
1282-
llvm::to_string(DstChild));
1282+
llvm::to_string(Dst));
12831283
}
12841284

12851285
// It could be a specific immediate in which case we should just check for
12861286
// that immediate.
1287-
if (const IntInit *ChildIntInit =
1288-
dyn_cast<IntInit>(DstChild.getLeafValue())) {
1287+
if (const IntInit *ChildIntInit = dyn_cast<IntInit>(Dst.getLeafValue())) {
12891288
DstMIBuilder.addRenderer<ImmRenderer>(ChildIntInit->getValue());
12901289
return InsertPt;
12911290
}
12921291

12931292
// Otherwise, we're looking for a bog-standard RegisterClass operand.
1294-
if (auto *ChildDefInit = dyn_cast<DefInit>(DstChild.getLeafValue())) {
1293+
if (auto *ChildDefInit = dyn_cast<DefInit>(Dst.getLeafValue())) {
12951294
auto *ChildRec = ChildDefInit->getDef();
12961295

1297-
ArrayRef<TypeSetByHwMode> ChildTypes = DstChild.getExtTypes();
1296+
ArrayRef<TypeSetByHwMode> ChildTypes = Dst.getExtTypes();
12981297
if (ChildTypes.size() != 1)
12991298
return failedImport("Dst pattern child has multiple results");
13001299

@@ -1315,11 +1314,11 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13151314
if (ChildRec->isSubClassOf("RegisterOperand") &&
13161315
!ChildRec->isValueUnset("GIZeroRegister")) {
13171316
DstMIBuilder.addRenderer<CopyOrAddZeroRegRenderer>(
1318-
DstChild.getName(), ChildRec->getValueAsDef("GIZeroRegister"));
1317+
Dst.getName(), ChildRec->getValueAsDef("GIZeroRegister"));
13191318
return InsertPt;
13201319
}
13211320

1322-
DstMIBuilder.addRenderer<CopyRenderer>(DstChild.getName());
1321+
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
13231322
return InsertPt;
13241323
}
13251324

@@ -1335,9 +1334,9 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13351334
return failedImport(
13361335
"SelectionDAG ComplexPattern not mapped to GlobalISel");
13371336

1338-
const OperandMatcher &OM = Rule.getOperandMatcher(DstChild.getName());
1337+
const OperandMatcher &OM = Rule.getOperandMatcher(Dst.getName());
13391338
DstMIBuilder.addRenderer<RenderComplexPatternOperand>(
1340-
*ComplexPattern->second, DstChild.getName(),
1339+
*ComplexPattern->second, Dst.getName(),
13411340
OM.getAllocatedTemporariesBaseID());
13421341
return InsertPt;
13431342
}
@@ -1348,16 +1347,15 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13481347

13491348
// Handle the case where the MVT/register class is omitted in the dest pattern
13501349
// but MVT exists in the source pattern.
1351-
if (isa<UnsetInit>(DstChild.getLeafValue()) &&
1352-
Rule.hasOperand(DstChild.getName())) {
1353-
DstMIBuilder.addRenderer<CopyRenderer>(DstChild.getName());
1350+
if (isa<UnsetInit>(Dst.getLeafValue()) && Rule.hasOperand(Dst.getName())) {
1351+
DstMIBuilder.addRenderer<CopyRenderer>(Dst.getName());
13541352
return InsertPt;
13551353
}
13561354
return failedImport("Dst pattern child is an unsupported kind");
13571355
}
13581356

13591357
Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
1360-
RuleMatcher &M, InstructionMatcher &InsnMatcher, const TreePatternNode &Src,
1358+
RuleMatcher &M, InstructionMatcher &InsnMatcher,
13611359
const TreePatternNode &Dst) {
13621360
auto InsertPtOrError = createInstructionRenderer(M.actions_end(), M, Dst);
13631361
if (auto Error = InsertPtOrError.takeError())
@@ -1377,23 +1375,21 @@ Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
13771375
CopyToPhysRegMIBuilder.addRenderer<CopyPhysRegRenderer>(PhysInput.first);
13781376
}
13791377

1380-
if (auto Error =
1381-
importExplicitDefRenderers(InsertPt, M, DstMIBuilder, Src, Dst)
1382-
.takeError())
1378+
if (auto Error = importExplicitDefRenderers(InsertPt, M, DstMIBuilder, Dst)
1379+
.takeError())
13831380
return std::move(Error);
13841381

1385-
if (auto Error =
1386-
importExplicitUseRenderers(InsertPt, M, DstMIBuilder, Dst, Src)
1387-
.takeError())
1382+
if (auto Error = importExplicitUseRenderers(InsertPt, M, DstMIBuilder, Dst)
1383+
.takeError())
13881384
return std::move(Error);
13891385

13901386
return DstMIBuilder;
13911387
}
13921388

13931389
Expected<action_iterator>
13941390
GlobalISelEmitter::createAndImportSubInstructionRenderer(
1395-
const action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
1396-
const TreePatternNode &Src, unsigned TempRegID) {
1391+
action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
1392+
unsigned TempRegID) {
13971393
auto InsertPtOrError = createInstructionRenderer(InsertPt, M, Dst);
13981394

13991395
// TODO: Assert there's exactly one result.
@@ -1408,13 +1404,13 @@ GlobalISelEmitter::createAndImportSubInstructionRenderer(
14081404
DstMIBuilder.addRenderer<TempRegRenderer>(TempRegID, true);
14091405

14101406
// Handle additional (ignored) results.
1411-
InsertPtOrError = importExplicitDefRenderers(
1412-
std::prev(*InsertPtOrError), M, DstMIBuilder, Src, Dst, /*Start=*/1);
1407+
InsertPtOrError = importExplicitDefRenderers(std::prev(*InsertPtOrError), M,
1408+
DstMIBuilder, Dst, /*Start=*/1);
14131409
if (auto Error = InsertPtOrError.takeError())
14141410
return std::move(Error);
14151411

1416-
InsertPtOrError = importExplicitUseRenderers(InsertPtOrError.get(), M,
1417-
DstMIBuilder, Dst, Src);
1412+
InsertPtOrError =
1413+
importExplicitUseRenderers(InsertPtOrError.get(), M, DstMIBuilder, Dst);
14181414
if (auto Error = InsertPtOrError.takeError())
14191415
return std::move(Error);
14201416

@@ -1448,7 +1444,7 @@ Expected<action_iterator> GlobalISelEmitter::createInstructionRenderer(
14481444

14491445
Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers(
14501446
action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1451-
const TreePatternNode &Src, const TreePatternNode &Dst, unsigned Start) {
1447+
const TreePatternNode &Dst, unsigned Start) {
14521448
const CodeGenInstruction *DstI = DstMIBuilder.getCGI();
14531449

14541450
// Some instructions have multiple defs, but are missing a type entry
@@ -1497,7 +1493,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers(
14971493

14981494
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
14991495
action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1500-
const llvm::TreePatternNode &Dst, const llvm::TreePatternNode &Src) {
1496+
const TreePatternNode &Dst) {
15011497
const CodeGenInstruction *DstI = DstMIBuilder.getCGI();
15021498
CodeGenInstruction *OrigDstI = &Target.getInstruction(Dst.getOperator());
15031499

@@ -1527,7 +1523,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
15271523
TempRegID);
15281524

15291525
auto InsertPtOrError = createAndImportSubInstructionRenderer(
1530-
++InsertPt, M, ValChild, Src, TempRegID);
1526+
++InsertPt, M, ValChild, TempRegID);
15311527
if (auto Error = InsertPtOrError.takeError())
15321528
return std::move(Error);
15331529

@@ -1585,7 +1581,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
15851581
CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx(SubRegInit->getDef());
15861582

15871583
auto InsertPtOrError =
1588-
importExplicitUseRenderer(InsertPt, M, DstMIBuilder, ValChild, Src);
1584+
importExplicitUseRenderer(InsertPt, M, DstMIBuilder, ValChild);
15891585
if (auto Error = InsertPtOrError.takeError())
15901586
return std::move(Error);
15911587
InsertPt = InsertPtOrError.get();
@@ -1654,7 +1650,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
16541650
}
16551651

16561652
auto InsertPtOrError = importExplicitUseRenderer(InsertPt, M, DstMIBuilder,
1657-
Dst.getChild(Child), Src);
1653+
Dst.getChild(Child));
16581654
if (auto Error = InsertPtOrError.takeError())
16591655
return std::move(Error);
16601656
InsertPt = InsertPtOrError.get();
@@ -2135,7 +2131,7 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
21352131
}
21362132

21372133
auto DstMIBuilderOrError =
2138-
createAndImportInstructionRenderer(M, InsnMatcher, Src, Dst);
2134+
createAndImportInstructionRenderer(M, InsnMatcher, Dst);
21392135
if (auto Error = DstMIBuilderOrError.takeError())
21402136
return std::move(Error);
21412137
BuildMIAction &DstMIBuilder = DstMIBuilderOrError.get();

0 commit comments

Comments
 (0)