From 8fc5ec78d54df15de2908f16d55945da4b239613 Mon Sep 17 00:00:00 2001 From: John Brawn Date: Mon, 2 Jul 2018 13:14:49 +0000 Subject: [PATCH] [llvm-exegesis] Delegate the decision of cycle counter name to the target Currently the cycle counter is taken from the subtarget schedule model, which isn't any use if the subtarget doesn't have one. Delegate the decision to the target benchmark runner, as it may know better what to do in that case, with the default being the current behaviour. Differential Revision: https://reviews.llvm.org/D48779 llvm-svn: 336099 --- llvm/tools/llvm-exegesis/lib/Latency.cpp | 19 ++++++++++++++----- llvm/tools/llvm-exegesis/lib/Latency.h | 2 ++ llvm/tools/llvm-exegesis/llvm-exegesis.cpp | 4 ---- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/llvm/tools/llvm-exegesis/lib/Latency.cpp b/llvm/tools/llvm-exegesis/lib/Latency.cpp index 29bb74f..e2aae97 100644 --- a/llvm/tools/llvm-exegesis/lib/Latency.cpp +++ b/llvm/tools/llvm-exegesis/lib/Latency.cpp @@ -94,6 +94,18 @@ LatencyBenchmarkRunner::generatePrototype(unsigned Opcode) const { return generateTwoInstructionPrototype(Instr); } +const char *LatencyBenchmarkRunner::getCounterName() const { + if (!State.getSubtargetInfo().getSchedModel().hasExtraProcessorInfo()) + llvm::report_fatal_error("sched model is missing extra processor info!"); + const char *CounterName = State.getSubtargetInfo() + .getSchedModel() + .getExtraProcessorInfo() + .PfmCounters.CycleCounter; + if (!CounterName) + llvm::report_fatal_error("sched model does not define a cycle counter"); + return CounterName; +} + std::vector LatencyBenchmarkRunner::runMeasurements(const ExecutableFunction &Function, const unsigned NumRepetitions) const { @@ -101,12 +113,9 @@ LatencyBenchmarkRunner::runMeasurements(const ExecutableFunction &Function, // measure several times and take the minimum value. constexpr const int NumMeasurements = 30; int64_t MinLatency = std::numeric_limits::max(); - const char *CounterName = State.getSubtargetInfo() - .getSchedModel() - .getExtraProcessorInfo() - .PfmCounters.CycleCounter; + const char *CounterName = getCounterName(); if (!CounterName) - llvm::report_fatal_error("sched model does not define a cycle counter"); + llvm::report_fatal_error("could not determine cycle counter name"); const pfm::PerfEvent CyclesPerfEvent(CounterName); if (!CyclesPerfEvent.valid()) llvm::report_fatal_error("invalid perf event"); diff --git a/llvm/tools/llvm-exegesis/lib/Latency.h b/llvm/tools/llvm-exegesis/lib/Latency.h index 058216d..9d6cfc7 100644 --- a/llvm/tools/llvm-exegesis/lib/Latency.h +++ b/llvm/tools/llvm-exegesis/lib/Latency.h @@ -38,6 +38,8 @@ private: std::vector runMeasurements(const ExecutableFunction &EF, const unsigned NumRepetitions) const override; + + virtual const char *getCounterName() const; }; } // namespace exegesis diff --git a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp index 92d19c0..6b626b0 100644 --- a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp +++ b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp @@ -140,10 +140,6 @@ void benchmarkMain() { return; } - // FIXME: Do not require SchedModel for latency. - if (!State.getSubtargetInfo().getSchedModel().hasExtraProcessorInfo()) - llvm::report_fatal_error("sched model is missing extra processor info!"); - const std::unique_ptr Runner = State.getExegesisTarget().createBenchmarkRunner(BenchmarkMode, State); if (!Runner) { -- 2.7.4