16
16
#include " PredicateExpander.h"
17
17
#include " llvm/ADT/STLExtras.h"
18
18
#include " llvm/ADT/SmallPtrSet.h"
19
+ #include " llvm/ADT/SmallSet.h"
19
20
#include " llvm/ADT/StringExtras.h"
20
21
#include " llvm/ADT/StringRef.h"
21
22
#include " llvm/MC/MCInstrItineraries.h"
@@ -134,7 +135,7 @@ class SubtargetEmitter {
134
135
135
136
void EmitSchedModel (raw_ostream &OS);
136
137
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);
138
139
void EmitHwModeCheck (const std::string &ClassName, raw_ostream &OS);
139
140
void ParseFeaturesFunction (raw_ostream &OS);
140
141
@@ -1789,25 +1790,23 @@ void SubtargetEmitter::EmitSchedModelHelpers(const std::string &ClassName,
1789
1790
PE.expandSTIPredicate (OS, Fn);
1790
1791
}
1791
1792
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 " ;
1808
1807
}
1809
- OS. indent ( 2 ) << " } \n " ;
1810
- OS. indent ( 2 ) << " return { };\n } \n " ;
1808
+
1809
+ OS << " };\n\n " ;
1811
1810
}
1812
1811
1813
1812
void SubtargetEmitter::EmitHwModeCheck (const std::string &ClassName,
@@ -2027,9 +2026,6 @@ void SubtargetEmitter::run(raw_ostream &OS) {
2027
2026
<< " const;\n " ;
2028
2027
if (TGT.getHwModes ().getNumModeIds () > 1 )
2029
2028
OS << " unsigned getHwMode() const override;\n " ;
2030
- if (TGT.getSchedModels ().hasMacroFusions ())
2031
- OS << " std::vector<MacroFusionPredTy> getMacroFusions() const "
2032
- " override;\n " ;
2033
2029
2034
2030
STIPredicateExpander PE (Target);
2035
2031
PE.setByRef (false );
@@ -2044,6 +2040,13 @@ void SubtargetEmitter::run(raw_ostream &OS) {
2044
2040
OS << " \n #ifdef GET_SUBTARGETINFO_CTOR\n " ;
2045
2041
OS << " #undef GET_SUBTARGETINFO_CTOR\n\n " ;
2046
2042
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
+
2047
2050
OS << " #include \" llvm/CodeGen/TargetSchedule.h\"\n\n " ;
2048
2051
OS << " namespace llvm {\n " ;
2049
2052
OS << " extern const llvm::SubtargetFeatureKV " << Target << " FeatureKV[];\n " ;
@@ -2078,17 +2081,19 @@ void SubtargetEmitter::run(raw_ostream &OS) {
2078
2081
<< Target << " ReadAdvanceTable, " ;
2079
2082
OS << ' \n ' ; OS.indent (24 );
2080
2083
if (SchedModels.hasItineraries ()) {
2081
- OS << Target << " Stages, "
2082
- << Target << " OperandCycles, "
2083
- << Target << " ForwardingPaths" ;
2084
+ OS << Target << " Stages, " << Target << " OperandCycles, " << Target
2085
+ << " ForwardingPaths, " ;
2084
2086
} 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" ;
2086
2093
OS << " ) {}\n\n " ;
2087
2094
2088
2095
EmitSchedModelHelpers (ClassName, OS);
2089
2096
EmitHwModeCheck (ClassName, OS);
2090
- if (TGT.getSchedModels ().hasMacroFusions ())
2091
- emitGetMacroFusions (ClassName, OS);
2092
2097
2093
2098
OS << " } // end namespace llvm\n\n " ;
2094
2099
0 commit comments