Skip to content

Commit dbe1daf

Browse files
authored
[NFC][TableGen] Code cleanup in InstrInfoEmitter.cpp (llvm#126578)
- Use range for loops and `enumerate` in a few places. - Use `StringRef` for `TargetName` in `InstrInfoEmitter::run`. - Use `\n` character for new line instead of string. - Use StringRef in `InstrNames` (instead of std::string) and avoid string copies.
1 parent d89c23b commit dbe1daf

File tree

2 files changed

+42
-44
lines changed

2 files changed

+42
-44
lines changed

llvm/utils/TableGen/Common/CodeGenSchedule.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -480,11 +480,8 @@ class CodeGenSchedModels {
480480
iterator_range<const_class_iterator> classes() const {
481481
return make_range(classes_begin(), classes_end());
482482
}
483-
iterator_range<class_iterator> explicit_classes() {
484-
return make_range(classes_begin(), classes_begin() + NumInstrSchedClasses);
485-
}
486-
iterator_range<const_class_iterator> explicit_classes() const {
487-
return make_range(classes_begin(), classes_begin() + NumInstrSchedClasses);
483+
ArrayRef<CodeGenSchedClass> explicit_classes() const {
484+
return ArrayRef(SchedClasses).take_front(NumInstrSchedClasses);
488485
}
489486

490487
const Record *getModelOrItinDef(const Record *ProcDef) const {

llvm/utils/TableGen/InstrInfoEmitter.cpp

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ class InstrInfoEmitter {
6161
void run(raw_ostream &OS);
6262

6363
private:
64-
void emitEnums(raw_ostream &OS);
64+
void emitEnums(raw_ostream &OS,
65+
ArrayRef<const CodeGenInstruction *> NumberedInstructions);
6566

6667
typedef std::vector<std::string> OperandInfoTy;
6768
typedef std::vector<OperandInfoTy> OperandInfoListTy;
@@ -117,10 +118,9 @@ InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
117118
// either case into a list of operands for this op.
118119
std::vector<CGIOperandList::OperandInfo> OperandList;
119120

120-
// This might be a multiple operand thing. Targets like X86 have
121-
// registers in their multi-operand operands. It may also be an anonymous
122-
// operand, which has a single operand, but no declared class for the
123-
// operand.
121+
// This might be a multiple operand thing. Targets like X86 have registers
122+
// in their multi-operand operands. It may also be an anonymous operand,
123+
// which has a single operand, but no declared class for the operand.
124124
const DagInit *MIOI = Op.MIOperandInfo;
125125

126126
if (!MIOI || MIOI->getNumArgs() == 0) {
@@ -135,8 +135,9 @@ InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
135135
}
136136
}
137137

138-
for (unsigned j = 0, e = OperandList.size(); j != e; ++j) {
139-
const Record *OpR = OperandList[j].Rec;
138+
for (const auto &[OpInfo, Constraint] :
139+
zip_equal(OperandList, Op.Constraints)) {
140+
const Record *OpR = OpInfo.Rec;
140141
std::string Res;
141142

142143
if (OpR->isSubClassOf("RegisterOperand"))
@@ -179,12 +180,11 @@ InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
179180
// Fill in constraint info.
180181
Res += ", ";
181182

182-
const CGIOperandList::ConstraintInfo &Constraint = Op.Constraints[j];
183-
if (Constraint.isNone())
183+
if (Constraint.isNone()) {
184184
Res += "0";
185-
else if (Constraint.isEarlyClobber())
185+
} else if (Constraint.isEarlyClobber()) {
186186
Res += "MCOI_EARLY_CLOBBER";
187-
else {
187+
} else {
188188
assert(Constraint.isTied());
189189
Res += "MCOI_TIED_TO(" + utostr(Constraint.getTiedOperand()) + ")";
190190
}
@@ -329,7 +329,7 @@ void InstrInfoEmitter::emitOperandNameMappings(
329329
OS << " return -1;\n";
330330
}
331331
OS << "}\n";
332-
OS << "} // end namespace llvm::" << Namespace << "\n";
332+
OS << "} // end namespace llvm::" << Namespace << '\n';
333333
OS << "#endif //GET_INSTRINFO_NAMED_OPS\n\n";
334334
}
335335

@@ -445,7 +445,7 @@ void InstrInfoEmitter::emitOperandTypeMappings(
445445

446446
OS << " return OpcodeOperandTypes[Offsets[Opcode] + OpIdx];\n";
447447
OS << "}\n";
448-
OS << "} // end namespace llvm::" << Namespace << "\n";
448+
OS << "} // end namespace llvm::" << Namespace << '\n';
449449
OS << "#endif // GET_INSTRINFO_OPERAND_TYPE\n\n";
450450

451451
OS << "#ifdef GET_INSTRINFO_MEM_OPERAND_SIZE\n";
@@ -468,7 +468,7 @@ void InstrInfoEmitter::emitOperandTypeMappings(
468468
OS << " return " << Size << ";\n\n";
469469
}
470470
OS << " }\n}\n";
471-
OS << "} // end namespace llvm::" << Namespace << "\n";
471+
OS << "} // end namespace llvm::" << Namespace << '\n';
472472
OS << "#endif // GET_INSTRINFO_MEM_OPERAND_SIZE\n\n";
473473
}
474474

@@ -527,8 +527,7 @@ void InstrInfoEmitter::emitLogicalOperandSizeMappings(
527527
for (; i < static_cast<int>(LogicalOpListSize); ++i) {
528528
OS << "0, ";
529529
}
530-
OS << "}, ";
531-
OS << "\n";
530+
OS << "}, \n";
532531
}
533532
OS << " };\n";
534533

@@ -556,7 +555,7 @@ void InstrInfoEmitter::emitLogicalOperandSizeMappings(
556555
OS << " return S;\n";
557556
OS << "}\n";
558557

559-
OS << "} // end namespace llvm::" << Namespace << "\n";
558+
OS << "} // end namespace llvm::" << Namespace << '\n';
560559
OS << "#endif // GET_INSTRINFO_LOGICAL_OPERAND_SIZE_MAP\n\n";
561560
}
562561

@@ -705,7 +704,7 @@ void InstrInfoEmitter::emitFeatureVerifier(raw_ostream &OS,
705704
}
706705
if (!NumPredicates)
707706
OS << "_None";
708-
OS << ", // " << Inst->TheDef->getName() << " = " << InstIdx << "\n";
707+
OS << ", // " << Inst->TheDef->getName() << " = " << InstIdx << '\n';
709708
InstIdx++;
710709
}
711710
OS << " };\n\n"
@@ -811,10 +810,14 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
811810
Timer.startTimer("Analyze DAG patterns");
812811

813812
emitSourceFileHeader("Target Instruction Enum Values and Descriptors", OS);
814-
emitEnums(OS);
815813

816814
const CodeGenTarget &Target = CDP.getTargetInfo();
817-
const std::string &TargetName = std::string(Target.getName());
815+
ArrayRef<const CodeGenInstruction *> NumberedInstructions =
816+
Target.getInstructionsByEnumValue();
817+
818+
emitEnums(OS, NumberedInstructions);
819+
820+
StringRef TargetName = Target.getName();
818821
const Record *InstrInfo = Target.getInstructionSet();
819822

820823
// Collect all of the operand info records.
@@ -824,9 +827,6 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
824827
unsigned OperandInfoSize =
825828
CollectOperandInfo(OperandInfoList, OperandInfoMap);
826829

827-
ArrayRef<const CodeGenInstruction *> NumberedInstructions =
828-
Target.getInstructionsByEnumValue();
829-
830830
// Collect all of the instruction's implicit uses and defs.
831831
// Also collect which features are enabled by instructions to control
832832
// emission of various mappings.
@@ -882,11 +882,11 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
882882

883883
OS << "extern const " << TargetName << "InstrTable " << TargetName
884884
<< "Descs = {\n {\n";
885-
SequenceToOffsetTable<std::string> InstrNames;
885+
SequenceToOffsetTable<StringRef> InstrNames;
886886
unsigned Num = NumberedInstructions.size();
887887
for (const CodeGenInstruction *Inst : reverse(NumberedInstructions)) {
888888
// Keep a list of the instruction names.
889-
InstrNames.add(std::string(Inst->TheDef->getName()));
889+
InstrNames.add(Inst->TheDef->getName());
890890
// Emit the record into the table.
891891
emitRecord(*Inst, --Num, InstrInfo, EmittedLists, OperandInfoMap, OS);
892892
}
@@ -922,7 +922,7 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
922922
// Newline every eight entries.
923923
if (Num % 8 == 0)
924924
OS << "\n ";
925-
OS << InstrNames.get(std::string(Inst->TheDef->getName())) << "U, ";
925+
OS << InstrNames.get(Inst->TheDef->getName()) << "U, ";
926926
++Num;
927927
}
928928
OS << "\n};\n\n";
@@ -995,7 +995,7 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
995995
OS << "#ifdef GET_INSTRINFO_HEADER\n";
996996
OS << "#undef GET_INSTRINFO_HEADER\n";
997997

998-
std::string ClassName = TargetName + "GenInstrInfo";
998+
Twine ClassName = TargetName + "GenInstrInfo";
999999
OS << "namespace llvm {\n";
10001000
OS << "struct " << ClassName << " : public TargetInstrInfo {\n"
10011001
<< " explicit " << ClassName
@@ -1010,7 +1010,7 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
10101010
OS << "#ifdef GET_INSTRINFO_HELPER_DECLS\n";
10111011
OS << "#undef GET_INSTRINFO_HELPER_DECLS\n\n";
10121012
emitTIIHelperMethods(OS, TargetName, /* ExpandDefinition = */ false);
1013-
OS << "\n";
1013+
OS << '\n';
10141014
OS << "#endif // GET_INSTRINFO_HELPER_DECLS\n\n";
10151015

10161016
OS << "#ifdef GET_INSTRINFO_HELPERS\n";
@@ -1209,11 +1209,13 @@ void InstrInfoEmitter::emitRecord(
12091209
OS.write_hex(Value);
12101210
OS << "ULL";
12111211

1212-
OS << " }, // Inst #" << Num << " = " << Inst.TheDef->getName() << "\n";
1212+
OS << " }, // Inst #" << Num << " = " << Inst.TheDef->getName() << '\n';
12131213
}
12141214

12151215
// emitEnums - Print out enum values for all of the instructions.
1216-
void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
1216+
void InstrInfoEmitter::emitEnums(
1217+
raw_ostream &OS,
1218+
ArrayRef<const CodeGenInstruction *> NumberedInstructions) {
12171219
OS << "#ifdef GET_INSTRINFO_ENUM\n";
12181220
OS << "#undef GET_INSTRINFO_ENUM\n";
12191221

@@ -1226,23 +1228,22 @@ void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
12261228
OS << "namespace llvm::" << Namespace << " {\n";
12271229

12281230
OS << " enum {\n";
1229-
unsigned Num = 0;
1230-
for (const CodeGenInstruction *Inst : Target.getInstructionsByEnumValue())
1231+
for (const CodeGenInstruction *Inst : NumberedInstructions)
12311232
OS << " " << Inst->TheDef->getName()
1232-
<< "\t= " << (Num = Target.getInstrIntValue(Inst->TheDef)) << ",\n";
1233-
OS << " INSTRUCTION_LIST_END = " << Num + 1 << "\n";
1233+
<< "\t= " << Target.getInstrIntValue(Inst->TheDef) << ",\n";
1234+
OS << " INSTRUCTION_LIST_END = " << NumberedInstructions.size() << '\n';
12341235
OS << " };\n\n";
1235-
OS << "} // end namespace llvm::" << Namespace << "\n";
1236+
OS << "} // end namespace llvm::" << Namespace << '\n';
12361237
OS << "#endif // GET_INSTRINFO_ENUM\n\n";
12371238

12381239
OS << "#ifdef GET_INSTRINFO_SCHED_ENUM\n";
12391240
OS << "#undef GET_INSTRINFO_SCHED_ENUM\n";
12401241
OS << "namespace llvm::" << Namespace << "::Sched {\n\n";
12411242
OS << " enum {\n";
1242-
Num = 0;
1243-
for (const auto &Class : SchedModels.explicit_classes())
1244-
OS << " " << Class.Name << "\t= " << Num++ << ",\n";
1245-
OS << " SCHED_LIST_END = " << Num << "\n";
1243+
auto ExplictClasses = SchedModels.explicit_classes();
1244+
for (const auto &[Idx, Class] : enumerate(ExplictClasses))
1245+
OS << " " << Class.Name << "\t= " << Idx << ",\n";
1246+
OS << " SCHED_LIST_END = " << ExplictClasses.size() << '\n';
12461247
OS << " };\n";
12471248
OS << "} // end namespace llvm::" << Namespace << "::Sched\n";
12481249

0 commit comments

Comments
 (0)