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 <agrossman...@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; _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits