Skip to content

Commit 4451431

Browse files
authored
[TableGen][GISel] Delete unused Src arguments (NFC) (#120445)
The last uses were removed in #120332 and #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 result 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. Pull Request: #120445
1 parent 6ecedb0 commit 4451431

File tree

1 file changed

+66
-66
lines changed

1 file changed

+66
-66
lines changed

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 66 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,19 @@ 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

1357+
/// Generates code that builds the resulting instruction(s) from the destination
1358+
/// DAG. Note that to do this we do not and should not need the source DAG.
1359+
/// We do need to know whether a generated instruction defines a result of the
1360+
/// source DAG; this information is available via RuleMatcher::hasOperand.
13591361
Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
1360-
RuleMatcher &M, InstructionMatcher &InsnMatcher, const TreePatternNode &Src,
1362+
RuleMatcher &M, InstructionMatcher &InsnMatcher,
13611363
const TreePatternNode &Dst) {
13621364
auto InsertPtOrError = createInstructionRenderer(M.actions_end(), M, Dst);
13631365
if (auto Error = InsertPtOrError.takeError())
@@ -1377,23 +1379,21 @@ Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
13771379
CopyToPhysRegMIBuilder.addRenderer<CopyPhysRegRenderer>(PhysInput.first);
13781380
}
13791381

1380-
if (auto Error =
1381-
importExplicitDefRenderers(InsertPt, M, DstMIBuilder, Src, Dst)
1382-
.takeError())
1382+
if (auto Error = importExplicitDefRenderers(InsertPt, M, DstMIBuilder, Dst)
1383+
.takeError())
13831384
return std::move(Error);
13841385

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

13901390
return DstMIBuilder;
13911391
}
13921392

13931393
Expected<action_iterator>
13941394
GlobalISelEmitter::createAndImportSubInstructionRenderer(
1395-
const action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
1396-
const TreePatternNode &Src, unsigned TempRegID) {
1395+
action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
1396+
unsigned TempRegID) {
13971397
auto InsertPtOrError = createInstructionRenderer(InsertPt, M, Dst);
13981398

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

14101410
// Handle additional (ignored) results.
1411-
InsertPtOrError = importExplicitDefRenderers(
1412-
std::prev(*InsertPtOrError), M, DstMIBuilder, Src, Dst, /*Start=*/1);
1411+
InsertPtOrError = importExplicitDefRenderers(std::prev(*InsertPtOrError), M,
1412+
DstMIBuilder, Dst, /*Start=*/1);
14131413
if (auto Error = InsertPtOrError.takeError())
14141414
return std::move(Error);
14151415

1416-
InsertPtOrError = importExplicitUseRenderers(InsertPtOrError.get(), M,
1417-
DstMIBuilder, Dst, Src);
1416+
InsertPtOrError =
1417+
importExplicitUseRenderers(InsertPtOrError.get(), M, DstMIBuilder, Dst);
14181418
if (auto Error = InsertPtOrError.takeError())
14191419
return std::move(Error);
14201420

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

14491449
Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers(
14501450
action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1451-
const TreePatternNode &Src, const TreePatternNode &Dst, unsigned Start) {
1451+
const TreePatternNode &Dst, unsigned Start) {
14521452
const CodeGenInstruction *DstI = DstMIBuilder.getCGI();
14531453

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

14981498
Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
14991499
action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1500-
const llvm::TreePatternNode &Dst, const llvm::TreePatternNode &Src) {
1500+
const TreePatternNode &Dst) {
15011501
const CodeGenInstruction *DstI = DstMIBuilder.getCGI();
15021502
CodeGenInstruction *OrigDstI = &Target.getInstruction(Dst.getOperator());
15031503

@@ -1527,7 +1527,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
15271527
TempRegID);
15281528

15291529
auto InsertPtOrError = createAndImportSubInstructionRenderer(
1530-
++InsertPt, M, ValChild, Src, TempRegID);
1530+
++InsertPt, M, ValChild, TempRegID);
15311531
if (auto Error = InsertPtOrError.takeError())
15321532
return std::move(Error);
15331533

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

15871587
auto InsertPtOrError =
1588-
importExplicitUseRenderer(InsertPt, M, DstMIBuilder, ValChild, Src);
1588+
importExplicitUseRenderer(InsertPt, M, DstMIBuilder, ValChild);
15891589
if (auto Error = InsertPtOrError.takeError())
15901590
return std::move(Error);
15911591
InsertPt = InsertPtOrError.get();
@@ -1654,7 +1654,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
16541654
}
16551655

16561656
auto InsertPtOrError = importExplicitUseRenderer(InsertPt, M, DstMIBuilder,
1657-
Dst.getChild(Child), Src);
1657+
Dst.getChild(Child));
16581658
if (auto Error = InsertPtOrError.takeError())
16591659
return std::move(Error);
16601660
InsertPt = InsertPtOrError.get();
@@ -2135,7 +2135,7 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
21352135
}
21362136

21372137
auto DstMIBuilderOrError =
2138-
createAndImportInstructionRenderer(M, InsnMatcher, Src, Dst);
2138+
createAndImportInstructionRenderer(M, InsnMatcher, Dst);
21392139
if (auto Error = DstMIBuilderOrError.takeError())
21402140
return std::move(Error);
21412141
BuildMIAction &DstMIBuilder = DstMIBuilderOrError.get();

0 commit comments

Comments
 (0)