[llvm] [TableGen] Enhance testability of TableGen-based macro fusion (PR #73075)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 21 20:21:19 PST 2023


================
@@ -14,16 +14,62 @@
 
 using namespace llvm;
 
+static cl::list<std::string> MFusions("mfusion", cl::CommaSeparated,
+                                      cl::desc("Target specific macro fusions"),
+                                      cl::value_desc("a1,+a2,-a3,..."));
+
 TargetSubtargetInfo::TargetSubtargetInfo(
     const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS,
     ArrayRef<SubtargetFeatureKV> PF, ArrayRef<SubtargetSubTypeKV> PD,
     const MCWriteProcResEntry *WPR, const MCWriteLatencyEntry *WL,
     const MCReadAdvanceEntry *RA, const InstrStage *IS, const unsigned *OC,
-    const unsigned *FP)
-    : MCSubtargetInfo(TT, CPU, TuneCPU, FS, PF, PD, WPR, WL, RA, IS, OC, FP) {}
+    const unsigned *FP, ArrayRef<MacroFusionEntry> MF)
+    : MCSubtargetInfo(TT, CPU, TuneCPU, FS, PF, PD, WPR, WL, RA, IS, OC, FP),
+      MacroFusionTable(MF) {
+  // assert if MacroFusionTable is not sorted.
+  assert(llvm::is_sorted(MacroFusionTable));
+  overrideFusionBits();
+}
 
 TargetSubtargetInfo::~TargetSubtargetInfo() = default;
 
+void TargetSubtargetInfo::overrideFusionBits() {
+  if (MFusions.getNumOccurrences() != 0) {
+    for (std::string &MFusion : MFusions) {
+      char Prefix = MFusion[0];
+      bool Disable = Prefix == '-';
+      if (Prefix == '+' || Prefix == '-')
+        MFusion = MFusion.substr(1);
+
+      // MacroFusionTable is sorted.
+      const auto *Pos = std::lower_bound(
+          MacroFusionTable.begin(), MacroFusionTable.end(), MFusion,
+          [](const MacroFusionEntry &LHS, const std::string &RHS) {
+            int CmpName = StringRef(LHS.Name).compare(RHS);
----------------
topperc wrote:

Isn't this just `return String(LHS.Name).compare(RHS) < 0`

https://github.com/llvm/llvm-project/pull/73075


More information about the llvm-commits mailing list