1616#include " PredicateExpander.h"
1717#include " llvm/ADT/STLExtras.h"
1818#include " llvm/ADT/SmallPtrSet.h"
19+ #include " llvm/ADT/SmallSet.h"
1920#include " llvm/ADT/StringExtras.h"
2021#include " llvm/ADT/StringRef.h"
2122#include " llvm/MC/MCInstrItineraries.h"
@@ -134,7 +135,7 @@ class SubtargetEmitter {
134135
135136 void EmitSchedModel (raw_ostream &OS);
136137 void emitMacroFusionBits (const CodeGenProcModel &ProcModel, raw_ostream &OS);
137- void emitGetMacroFusions ( const std::string &ClassName , raw_ostream &OS);
138+ void emitMacroFusionTable (RecVec Fusions , raw_ostream &OS);
138139 void EmitHwModeCheck (const std::string &ClassName, raw_ostream &OS);
139140 void ParseFeaturesFunction (raw_ostream &OS);
140141
@@ -1789,25 +1790,23 @@ void SubtargetEmitter::EmitSchedModelHelpers(const std::string &ClassName,
17891790 PE.expandSTIPredicate (OS, Fn);
17901791}
17911792
1792- void SubtargetEmitter::emitGetMacroFusions (const std::string &ClassName,
1793- raw_ostream &OS) {
1794- OS << " std::vector<MacroFusionPredTy> " << ClassName
1795- << " ::getMacroFusions() const {\n " ;
1796- OS.indent (2 ) << " switch(getSchedModel().getProcessorID()) {\n " ;
1797- for (auto &Proc : TGT.getSchedModels ().procModels ()) {
1798- if (Proc.hasMacroFusions ()) {
1799- OS.indent (4 ) << " case " << Proc.Index << " : // " << Proc.ModelName
1800- << " \n " ;
1801- OS.indent (4 ) << " return {" ;
1802- std::vector<std::string> Predicates;
1803- for (auto *R : Proc.MacroFusions )
1804- Predicates.push_back (" is" + R->getNameInitAsString ());
1805- OS << llvm::join (Predicates, " , " );
1806- OS << " };\n " ;
1807- }
1793+ void SubtargetEmitter::emitMacroFusionTable (RecVec Fusions, raw_ostream &OS) {
1794+ OS << " const llvm::MacroFusionEntry " << Target << " MacroFusionTable[] = {\n " ;
1795+
1796+ SmallSet<StringRef, 32 > Names;
1797+ for (auto &Fusion : Fusions) {
1798+ StringRef Name = Fusion->getValueAsString (" Name" );
1799+ if (Name.empty ())
1800+ PrintFatalError (Fusion->getLoc (),
1801+ " The name of macro fusion cannot be empty" );
1802+ if (Names.contains (Name))
1803+ PrintFatalError (Fusion->getLoc (),
1804+ " The name of macro fusion already exists" );
1805+ OS.indent (2 ) << " {\" " << Name << " \" , "
1806+ << " llvm::is" + Fusion->getNameInitAsString () << " },\n " ;
18081807 }
1809- OS. indent ( 2 ) << " } \n " ;
1810- OS. indent ( 2 ) << " return { };\n } \n " ;
1808+
1809+ OS << " };\n\n " ;
18111810}
18121811
18131812void SubtargetEmitter::EmitHwModeCheck (const std::string &ClassName,
@@ -2027,9 +2026,6 @@ void SubtargetEmitter::run(raw_ostream &OS) {
20272026 << " const;\n " ;
20282027 if (TGT.getHwModes ().getNumModeIds () > 1 )
20292028 OS << " unsigned getHwMode() const override;\n " ;
2030- if (TGT.getSchedModels ().hasMacroFusions ())
2031- OS << " std::vector<MacroFusionPredTy> getMacroFusions() const "
2032- " override;\n " ;
20332029
20342030 STIPredicateExpander PE (Target);
20352031 PE.setByRef (false );
@@ -2044,6 +2040,13 @@ void SubtargetEmitter::run(raw_ostream &OS) {
20442040 OS << " \n #ifdef GET_SUBTARGETINFO_CTOR\n " ;
20452041 OS << " #undef GET_SUBTARGETINFO_CTOR\n\n " ;
20462042
2043+ std::vector<Record *> Fusions = Records.getAllDerivedDefinitions (" Fusion" );
2044+ // Sort macro fusions by name.
2045+ llvm::sort (Fusions, LessRecord ());
2046+
2047+ if (!Fusions.empty ())
2048+ emitMacroFusionTable (Fusions, OS);
2049+
20472050 OS << " #include \" llvm/CodeGen/TargetSchedule.h\"\n\n " ;
20482051 OS << " namespace llvm {\n " ;
20492052 OS << " extern const llvm::SubtargetFeatureKV " << Target << " FeatureKV[];\n " ;
@@ -2078,17 +2081,19 @@ void SubtargetEmitter::run(raw_ostream &OS) {
20782081 << Target << " ReadAdvanceTable, " ;
20792082 OS << ' \n ' ; OS.indent (24 );
20802083 if (SchedModels.hasItineraries ()) {
2081- OS << Target << " Stages, "
2082- << Target << " OperandCycles, "
2083- << Target << " ForwardingPaths" ;
2084+ OS << Target << " Stages, " << Target << " OperandCycles, " << Target
2085+ << " ForwardingPaths, " ;
20842086 } else
2085- OS << " nullptr, nullptr, nullptr" ;
2087+ OS << " nullptr, nullptr, nullptr, " ;
2088+ if (!Fusions.empty ()) {
2089+ OS << " ArrayRef(" << Target << " MacroFusionTable, " << Fusions.size ()
2090+ << " )" ;
2091+ } else
2092+ OS << " std::nullopt" ;
20862093 OS << " ) {}\n\n " ;
20872094
20882095 EmitSchedModelHelpers (ClassName, OS);
20892096 EmitHwModeCheck (ClassName, OS);
2090- if (TGT.getSchedModels ().hasMacroFusions ())
2091- emitGetMacroFusions (ClassName, OS);
20922097
20932098 OS << " } // end namespace llvm\n\n " ;
20942099
0 commit comments