@@ -61,7 +61,8 @@ class InstrInfoEmitter {
6161 void run (raw_ostream &OS);
6262
6363private:
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