[MCSched] Bind PFM Counters to the CPUs instead of the SchedModel.
Summary:
The pfm counters are now in the ExegesisTarget rather than the
MCSchedModel (PR39165).
This also compresses the pfm counter tables (PR37068).
Reviewers: RKSimon, gchatelet
Subscribers: mgrang, llvm-commits
Differential Revision: https://reviews.llvm.org/D52932
llvm-svn: 345243
diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp
index b7828a1..588c40e 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Target.cpp
@@ -85,10 +85,37 @@
return llvm::make_unique<UopsBenchmarkRunner>(State);
}
+static_assert(std::is_pod<PfmCountersInfo>::value,
+ "We shouldn't have dynamic initialization here");
+const PfmCountersInfo PfmCountersInfo::Default = {nullptr, nullptr, nullptr};
+
+const PfmCountersInfo &
+ExegesisTarget::getPfmCounters(llvm::StringRef CpuName) const {
+ assert(std::is_sorted(
+ CpuPfmCounters.begin(), CpuPfmCounters.end(),
+ [](const CpuAndPfmCounters &LHS, const CpuAndPfmCounters &RHS) {
+ return strcmp(LHS.CpuName, RHS.CpuName) < 0;
+ }) &&
+ "CpuPfmCounters table is not sorted");
+
+ // Find entry
+ auto Found =
+ std::lower_bound(CpuPfmCounters.begin(), CpuPfmCounters.end(), CpuName);
+ if (Found == CpuPfmCounters.end() ||
+ llvm::StringRef(Found->CpuName) != CpuName) {
+ return PfmCountersInfo::Default;
+ }
+ assert(Found->PCI && "Missing counters");
+ return *Found->PCI;
+}
+
namespace {
// Default implementation.
class ExegesisDefaultTarget : public ExegesisTarget {
+public:
+ ExegesisDefaultTarget() : ExegesisTarget({}) {}
+
private:
std::vector<llvm::MCInst> setRegTo(const llvm::MCSubtargetInfo &STI,
unsigned Reg,