[llvm-branch-commits] [llvm] [llvm-exegesis] Add tablegen support for validation counters (PR #76652)
Aiden Grossman via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Dec 30 21:58:09 PST 2023
https://github.com/boomanaiden154 created https://github.com/llvm/llvm-project/pull/76652
This patch adds support in the llvm-exegesis tablegen emitter for validation counters. Full support for validation counters in llvm-exegesis is added in a future patch.
>From 75261b9626878b92fa4bde2b4801815251238748 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <agrossman154 at yahoo.com>
Date: Sat, 30 Dec 2023 17:03:59 -0800
Subject: [PATCH] [llvm-exegesis] Add tablegen support for validation counters
---
llvm/include/llvm/Target/TargetPfmCounters.td | 19 +++++++++++++
llvm/lib/Target/X86/X86PfmCounters.td | 6 ++++
llvm/tools/llvm-exegesis/lib/Target.cpp | 13 +++++----
llvm/tools/llvm-exegesis/lib/Target.h | 11 ++++++++
llvm/utils/TableGen/ExegesisEmitter.cpp | 28 +++++++++++++++++--
5 files changed, 69 insertions(+), 8 deletions(-)
diff --git a/llvm/include/llvm/Target/TargetPfmCounters.td b/llvm/include/llvm/Target/TargetPfmCounters.td
index b00f3e19c35f90..72f6b39f4878f4 100644
--- a/llvm/include/llvm/Target/TargetPfmCounters.td
+++ b/llvm/include/llvm/Target/TargetPfmCounters.td
@@ -28,6 +28,22 @@ class PfmIssueCounter<string resource_name, string counter>
string ResourceName = resource_name;
}
+class ValidationEvent <int event_number> {
+ int EventNumber = event_number;
+}
+
+def L1DCacheLoadMiss : ValidationEvent<0>;
+def InstructionRetired : ValidationEvent<1>;
+def DataTLBLoadMiss : ValidationEvent<2>;
+def DataTLBStoreMiss : ValidationEvent<3>;
+
+// Validation counters can be tied to a specific event
+class PfmValidationCounter<ValidationEvent event_type, string counter>
+ : PfmCounter<counter> {
+ // The name of the event that the validation counter detects.
+ ValidationEvent EventType = event_type;
+}
+
def NoPfmCounter : PfmCounter <""> {}
// Set of PfmCounters for measuring sched model characteristics.
@@ -38,6 +54,9 @@ class ProcPfmCounters {
PfmCounter UopsCounter = NoPfmCounter;
// Processors can define how to measure issued uops by defining IssueCounters.
list<PfmIssueCounter> IssueCounters = [];
+ // Processor can list mappings between validation events and real counters
+ // to measure the specified events.
+ list<PfmValidationCounter> ValidationCounters = [];
}
// A binding of a set of counters to a CPU.
diff --git a/llvm/lib/Target/X86/X86PfmCounters.td b/llvm/lib/Target/X86/X86PfmCounters.td
index 49ef6efc6aecf2..99cac504f157d3 100644
--- a/llvm/lib/Target/X86/X86PfmCounters.td
+++ b/llvm/lib/Target/X86/X86PfmCounters.td
@@ -275,6 +275,9 @@ def ZnVer2PfmCounters : ProcPfmCounters {
PfmIssueCounter<"Zn2AGU", "ls_dispatch:ld_st_dispatch + ls_dispatch:ld_dispatch + ls_dispatch:store_dispatch">,
PfmIssueCounter<"Zn2Divider", "div_op_count">
];
+ let ValidationCounters = [
+ PfmValidationCounter<InstructionRetired, "RETIRED_INSTRUCTIONS">
+ ];
}
def : PfmCountersBinding<"znver2", ZnVer2PfmCounters>;
@@ -288,6 +291,9 @@ def ZnVer3PfmCounters : ProcPfmCounters {
PfmIssueCounter<"Zn3Store", "ls_dispatch:store_dispatch">,
PfmIssueCounter<"Zn3Divider", "div_op_count">
];
+ let ValidationCounters = [
+ PfmValidationCounter<InstructionRetired, "RETIRED_INSTRUCTIONS">
+ ];
}
def : PfmCountersBinding<"znver3", ZnVer3PfmCounters>;
diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp
index 23c80e5b98953a..20b4afb9b8f676 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Target.cpp
@@ -147,13 +147,14 @@ std::unique_ptr<BenchmarkRunner> ExegesisTarget::createUopsBenchmarkRunner(
ExecutionMode);
}
-static_assert(std::is_trivial_v<PfmCountersInfo>,
- "We shouldn't have dynamic initialization here");
-const PfmCountersInfo PfmCountersInfo::Default = {nullptr, nullptr, nullptr,
- 0u};
+const PfmCountersInfo PfmCountersInfo::Default = {
+ nullptr, nullptr, nullptr, 0u, {}};
const PfmCountersInfo PfmCountersInfo::Dummy = {
- pfm::PerfEvent::DummyEventString, pfm::PerfEvent::DummyEventString, nullptr,
- 0u};
+ pfm::PerfEvent::DummyEventString,
+ pfm::PerfEvent::DummyEventString,
+ nullptr,
+ 0u,
+ {}};
const PfmCountersInfo &ExegesisTarget::getPfmCounters(StringRef CpuName) const {
assert(llvm::is_sorted(
diff --git a/llvm/tools/llvm-exegesis/lib/Target.h b/llvm/tools/llvm-exegesis/lib/Target.h
index c37dd8b7082162..3956bc983181f6 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.h
+++ b/llvm/tools/llvm-exegesis/lib/Target.h
@@ -32,6 +32,8 @@
#include "llvm/TargetParser/SubtargetFeature.h"
#include "llvm/TargetParser/Triple.h"
+#include <unordered_map>
+
namespace llvm {
namespace exegesis {
@@ -39,6 +41,13 @@ extern cl::OptionCategory Options;
extern cl::OptionCategory BenchmarkOptions;
extern cl::OptionCategory AnalysisOptions;
+enum ValidationEvent {
+ L1DCacheLoadMiss,
+ InstructionRetired,
+ DataTLBLoadMiss,
+ DataTLBStoreMiss
+};
+
struct PfmCountersInfo {
// An optional name of a performance counter that can be used to measure
// cycles.
@@ -59,6 +68,8 @@ struct PfmCountersInfo {
const IssueCounter *IssueCounters;
unsigned NumIssueCounters;
+ std::unordered_map<ValidationEvent, const char *> ValidationCounters;
+
static const PfmCountersInfo Default;
static const PfmCountersInfo Dummy;
};
diff --git a/llvm/utils/TableGen/ExegesisEmitter.cpp b/llvm/utils/TableGen/ExegesisEmitter.cpp
index 736f1220be14dd..247ed83f25ea64 100644
--- a/llvm/utils/TableGen/ExegesisEmitter.cpp
+++ b/llvm/utils/TableGen/ExegesisEmitter.cpp
@@ -22,6 +22,8 @@
#include <string>
#include <vector>
+#include <iostream>
+
using namespace llvm;
#define DEBUG_TYPE "exegesis-emitter"
@@ -81,6 +83,11 @@ collectPfmCounters(const RecordKeeper &Records) {
"duplicate ResourceName " + ResourceName);
AddPfmCounterName(IssueCounter);
}
+
+ for (const Record *ValidationCounter :
+ Def->getValueAsListOfDefs("ValidationCounters"))
+ AddPfmCounterName(ValidationCounter);
+
AddPfmCounterName(Def->getValueAsDef("CycleCounter"));
AddPfmCounterName(Def->getValueAsDef("UopsCounter"));
}
@@ -109,6 +116,8 @@ void ExegesisEmitter::emitPfmCountersInfo(const Record &Def,
Def.getValueAsDef("UopsCounter")->getValueAsString("Counter");
const size_t NumIssueCounters =
Def.getValueAsListOfDefs("IssueCounters").size();
+ const size_t NumValidationCounters =
+ Def.getValueAsListOfDefs("ValidationCounters").size();
OS << "\nstatic const PfmCountersInfo " << Target << Def.getName()
<< " = {\n";
@@ -129,10 +138,25 @@ void ExegesisEmitter::emitPfmCountersInfo(const Record &Def,
// Issue Counters
if (NumIssueCounters == 0)
- OS << " nullptr, // No issue counters.\n 0\n";
+ OS << " nullptr, 0, // No issue counters\n";
else
OS << " " << Target << "PfmIssueCounters + " << IssueCountersTableOffset
- << ", " << NumIssueCounters << " // Issue counters.\n";
+ << ", " << NumIssueCounters << ", // Issue counters.\n";
+
+ // Validation Counters
+ if (NumValidationCounters == 0)
+ OS << " {} // No validation counters.\n";
+ else {
+ OS << " {\n";
+ for (const Record *ValidationCounter :
+ Def.getValueAsListOfDefs("ValidationCounters")) {
+ OS << " { " << ValidationCounter->getValueAsDef("EventType")->getName()
+ << ", " << Target << "PfmCounterNames["
+ << getPfmCounterId(ValidationCounter->getValueAsString("Counter"))
+ << "]}\n";
+ }
+ OS << " } // Validation counters.\n";
+ }
OS << "};\n";
IssueCountersTableOffset += NumIssueCounters;
More information about the llvm-branch-commits
mailing list