@@ -288,7 +288,7 @@ void RegisterInfoEmitter::EmitRegUnitPressure(raw_ostream &OS,
288288 << " return PressureLimitTable[Idx];\n "
289289 << " }\n\n " ;
290290
291- SequenceToOffsetTable<std::vector<int >> PSetsSeqs;
291+ SequenceToOffsetTable<std::vector<int >> PSetsSeqs ( /* Terminator= */ - 1 ) ;
292292
293293 // This table may be larger than NumRCs if some register units needed a list
294294 // of unit sets that did not correspond to a register class.
@@ -309,7 +309,7 @@ void RegisterInfoEmitter::EmitRegUnitPressure(raw_ostream &OS,
309309
310310 OS << " /// Table of pressure sets per register class or unit.\n "
311311 << " static const int RCSetsTable[] = {\n " ;
312- PSetsSeqs.emit (OS, printInt, " -1 " );
312+ PSetsSeqs.emit (OS, printInt);
313313 OS << " };\n\n " ;
314314
315315 OS << " /// Get the dimensions of register pressure impacted by this "
@@ -610,7 +610,7 @@ static void printSimpleValueType(raw_ostream &OS, MVT::SimpleValueType VT) {
610610}
611611
612612static void printSubRegIndex (raw_ostream &OS, const CodeGenSubRegIndex *Idx) {
613- OS << Idx->EnumValue ;
613+ OS << ( Idx ? Idx ->EnumValue : 0 ) ;
614614}
615615
616616// Differentially encoded register and regunit lists allow for better
@@ -869,22 +869,23 @@ void RegisterInfoEmitter::runMCDesc(raw_ostream &OS) {
869869 typedef std::vector<const CodeGenRegister *> RegVec;
870870
871871 // Differentially encoded lists.
872- SequenceToOffsetTable<DiffVec> DiffSeqs;
872+ SequenceToOffsetTable<DiffVec> DiffSeqs ( /* Terminator= */ 0 ) ;
873873 SmallVector<DiffVec, 4 > SubRegLists (Regs.size ());
874874 SmallVector<DiffVec, 4 > SuperRegLists (Regs.size ());
875875 SmallVector<DiffVec, 4 > RegUnitLists (Regs.size ());
876876
877877 // List of lane masks accompanying register unit sequences.
878- SequenceToOffsetTable<MaskVec> LaneMaskSeqs;
878+ SequenceToOffsetTable<MaskVec> LaneMaskSeqs ( /* Terminator= */ std:: nullopt ) ;
879879 SmallVector<MaskVec, 4 > RegUnitLaneMasks (Regs.size ());
880880
881881 // Keep track of sub-register names as well. These are not differentially
882882 // encoded.
883883 typedef SmallVector<const CodeGenSubRegIndex *, 4 > SubRegIdxVec;
884- SequenceToOffsetTable<SubRegIdxVec, deref<std::less<>>> SubRegIdxSeqs;
884+ SequenceToOffsetTable<SubRegIdxVec, deref<std::less<>>> SubRegIdxSeqs (
885+ /* Terminator=*/ std::nullopt );
885886 SmallVector<SubRegIdxVec, 4 > SubRegIdxLists (Regs.size ());
886887
887- SequenceToOffsetTable<std::string> RegStrings;
888+ SequenceToOffsetTable<std::string> RegStrings ( /* Terminator= */ ' \0 ' ) ;
888889
889890 // Precompute register lists for the SequenceToOffsetTable.
890891 unsigned i = 0 ;
@@ -936,9 +937,7 @@ void RegisterInfoEmitter::runMCDesc(raw_ostream &OS) {
936937
937938 // Emit the shared table of regunit lane mask sequences.
938939 OS << " extern const LaneBitmask " << TargetName << " LaneMaskLists[] = {\n " ;
939- // TODO: Omit the terminator since it is never used. The length of this list
940- // is known implicitly from the corresponding reg unit list.
941- LaneMaskSeqs.emit (OS, printMask, " LaneBitmask::getAll()" );
940+ LaneMaskSeqs.emit (OS, printMask);
942941 OS << " };\n\n " ;
943942
944943 // Emit the table of sub-register indexes.
@@ -994,7 +993,7 @@ void RegisterInfoEmitter::runMCDesc(raw_ostream &OS) {
994993 // Loop over all of the register classes... emitting each one.
995994 OS << " namespace { // Register classes...\n " ;
996995
997- SequenceToOffsetTable<std::string> RegClassStrings;
996+ SequenceToOffsetTable<std::string> RegClassStrings ( /* Terminator= */ ' \0 ' ) ;
998997
999998 // Emit the register enum value arrays for each RegisterClass
1000999 for (const auto &RC : RegisterClasses) {
@@ -1209,7 +1208,8 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
12091208 unsigned NumModes = CGH.getNumModeIds ();
12101209
12111210 // Build a shared array of value types.
1212- SequenceToOffsetTable<std::vector<MVT::SimpleValueType>> VTSeqs;
1211+ SequenceToOffsetTable<std::vector<MVT::SimpleValueType>> VTSeqs (
1212+ /* Terminator=*/ MVT::Other);
12131213 for (unsigned M = 0 ; M < NumModes; ++M) {
12141214 for (const auto &RC : RegisterClasses) {
12151215 std::vector<MVT::SimpleValueType> S;
@@ -1221,7 +1221,7 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
12211221 }
12221222 VTSeqs.layout ();
12231223 OS << " \n static const MVT::SimpleValueType VTLists[] = {\n " ;
1224- VTSeqs.emit (OS, printSimpleValueType, " MVT::Other " );
1224+ VTSeqs.emit (OS, printSimpleValueType);
12251225 OS << " };\n " ;
12261226
12271227 // Emit SubRegIndex names, skipping 0.
@@ -1307,7 +1307,8 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
13071307 // Compress the sub-reg index lists.
13081308 typedef std::vector<const CodeGenSubRegIndex *> IdxList;
13091309 SmallVector<IdxList, 8 > SuperRegIdxLists (RegisterClasses.size ());
1310- SequenceToOffsetTable<IdxList, deref<std::less<>>> SuperRegIdxSeqs;
1310+ SequenceToOffsetTable<IdxList, deref<std::less<>>> SuperRegIdxSeqs (
1311+ /* Terminator=*/ nullptr );
13111312 BitVector MaskBV (RegisterClasses.size ());
13121313
13131314 for (const auto &RC : RegisterClasses) {
0 commit comments