[llvm] 6bddd09 - Revert "[llvm-exegesis] Add benchmark latency option on X86 that uses LBR for more precise measurements."

Clement Courbet via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 17 07:55:36 PDT 2020


Author: Clement Courbet
Date: 2020-07-17T16:55:17+02:00
New Revision: 6bddd099ac1434547dcc73da2552e97e1d89e58e

URL: https://github.com/llvm/llvm-project/commit/6bddd099ac1434547dcc73da2552e97e1d89e58e
DIFF: https://github.com/llvm/llvm-project/commit/6bddd099ac1434547dcc73da2552e97e1d89e58e.diff

LOG: Revert "[llvm-exegesis] Add benchmark latency option on X86 that uses LBR for more precise measurements."

>From @erichkeane:
```
This patch doesn't seem to build for me:
/iusers/ekeane1/workspaces/llvm-project/llvm/tools/llvm-exegesis/lib/X86/X86Counter.cpp: In function ‘llvm::Error llvm::exegesis::parseDataBuffer(const char*, size_t, const void*, const void*, llvm::SmallVector<long int, 4>*)’:
/iusers/ekeane1/workspaces/llvm-project/llvm/tools/llvm-exegesis/lib/X86/X86Counter.cpp:99:37: error: ‘struct perf_branch_entry’ has no member named ‘cycles’

CycleArray->push_back(Entry.cycles);
I'm on RHEL7, so I have kernel 3.10, so it doesn't have 'cycles'.

According ot this: https://elixir.bootlin.com/linux/v4.3/source/include/uapi/linux/perf_event.h#L963 kernel 4.3 is the first time that 'cycles' appeared in this structure.
```

Added: 
    

Modified: 
    llvm/docs/CommandGuide/llvm-exegesis.rst
    llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
    llvm/tools/llvm-exegesis/lib/PerfHelper.cpp
    llvm/tools/llvm-exegesis/lib/PerfHelper.h
    llvm/tools/llvm-exegesis/lib/X86/CMakeLists.txt
    llvm/tools/llvm-exegesis/lib/X86/Target.cpp
    llvm/tools/llvm-exegesis/llvm-exegesis.cpp

Removed: 
    llvm/test/tools/llvm-exegesis/X86/lbr/Inputs/mov_add.att
    llvm/test/tools/llvm-exegesis/X86/lbr/lit.local.cfg
    llvm/test/tools/llvm-exegesis/X86/lbr/mov-add.s
    llvm/tools/llvm-exegesis/lib/X86/X86Counter.cpp
    llvm/tools/llvm-exegesis/lib/X86/X86Counter.h


################################################################################
diff  --git a/llvm/docs/CommandGuide/llvm-exegesis.rst b/llvm/docs/CommandGuide/llvm-exegesis.rst
index f3bce16b93dd..321cdf5a6dab 100644
--- a/llvm/docs/CommandGuide/llvm-exegesis.rst
+++ b/llvm/docs/CommandGuide/llvm-exegesis.rst
@@ -192,24 +192,10 @@ OPTIONS
 
 .. option:: -mode=[latency|uops|inverse_throughput|analysis]
 
- Specify the run mode. Note that some modes have additional requirements and options.
+ Specify the run mode. Note that if you pick `analysis` mode, you also need
+ to specify at least one of the `-analysis-clusters-output-file=` and
+ `-analysis-inconsistencies-output-file=`.
 
- `latency` mode can be  make use of either RDTSC or LBR.
- `latency[LBR]` is only available on X86 (at least `Skylake`).
- To run in this mode, a positive value  must be specified for `x86-lbr-sample-period` and `--repetition-mode=loop`
-
- In `analysis` mode, you also need to specify at least one of the
- `-analysis-clusters-output-file=` and `-analysis-inconsistencies-output-file=`.
-
-.. option:: -x86-lbr-sample-period=<nBranches/sample>
-
-  Specify the LBR sampling period - how many branches before we take a sample.
-  When a positive value is specified for this option and when the mode is `latency`,
-  we will use LBRs for measuring.
-  On choosing the "right" sampling period, a small value is preferred, but throttling
-  could occur if the sampling is too frequent. A prime number should be used to
-  avoid consistently skipping certain blocks.
-  
 .. option:: -repetition-mode=[duplicate|loop|min]
 
  Specify the repetition mode. `duplicate` will create a large, straight line

diff  --git a/llvm/test/tools/llvm-exegesis/X86/lbr/Inputs/mov_add.att b/llvm/test/tools/llvm-exegesis/X86/lbr/Inputs/mov_add.att
deleted file mode 100644
index 8f85b395e731..000000000000
--- a/llvm/test/tools/llvm-exegesis/X86/lbr/Inputs/mov_add.att
+++ /dev/null
@@ -1,4 +0,0 @@
-# LLVM-EXEGESIS-LIVEIN RDI
-# LLVM-EXEGESIS-DEFREG XMM1 42
-movq $2, %rdi
-addq $0x10, %rdi
\ No newline at end of file

diff  --git a/llvm/test/tools/llvm-exegesis/X86/lbr/lit.local.cfg b/llvm/test/tools/llvm-exegesis/X86/lbr/lit.local.cfg
deleted file mode 100644
index 431967c1ec9b..000000000000
--- a/llvm/test/tools/llvm-exegesis/X86/lbr/lit.local.cfg
+++ /dev/null
@@ -1,31 +0,0 @@
-import subprocess
-import lit.util
-
-if not ('X86' in config.root.targets):
-    # We need support for X86.
-    config.unsupported = True
-
-elif not ('x86_64' in config.root.host_triple):
-    # We need to be running on an X86 host.
-    config.unsupported = True
-    
-else:    
-    # We need libpfm to be installed and the host to be at least skylake.
-    llvm_exegesis_exe = lit.util.which('llvm-exegesis', config.llvm_tools_dir)
-    if not llvm_exegesis_exe:
-        print('llvm-exegesis not found')
-        config.unsupported = True
-    else:
-      try:
-          with open(os.devnull, 'w') as quiet:
-              check_llvm_exegesis_uops_result = subprocess.call(
-                [llvm_exegesis_exe, '-allowed-host-cpu', 'skylake', '-allowed-host-cpu', 'skylake-avx512', '-mode', 'uops', '-snippets-file', '/dev/null'], stdout=quiet, stderr=quiet)
-              check_llvm_exegesis_latency_result = subprocess.call(
-                [llvm_exegesis_exe, '-allowed-host-cpu', 'skylake', '-allowed-host-cpu', 'skylake-avx512', '-mode', 'latency', '-snippets-file', '/dev/null'], stdout=quiet, stderr=quiet)
-      except OSError:
-          print('could not exec llvm-exegesis')
-          config.unsupported = True
-      if not check_llvm_exegesis_uops_result == 0:
-        config.unsupported = True
-      if not check_llvm_exegesis_latency_result == 0:
-        config.unsupported = True

diff  --git a/llvm/test/tools/llvm-exegesis/X86/lbr/mov-add.s b/llvm/test/tools/llvm-exegesis/X86/lbr/mov-add.s
deleted file mode 100644
index 5f72e8f99b30..000000000000
--- a/llvm/test/tools/llvm-exegesis/X86/lbr/mov-add.s
+++ /dev/null
@@ -1,18 +0,0 @@
-# RUN: llvm-exegesis -mode=latency --repetition-mode=loop --x86-lbr-sample-period=521 --snippets-file=%p/Inputs/mov_add.att
-
-
-CHECK:      ---
-CHECK-NEXT: mode: latency
-CHECK-NEXT: key:
-CHECK-NEXT:   instructions:
-CHECK-NEXT:     'MOV64ri32 RDI i_0x2'
-CHECK-NEXT:     'ADD64ri8 RDI RDI i_0x10'
-CHECK-NEXT: config: ''
-CHECK-NEXT: {{.*}}
-CHECK-NEXT: {{.*}}
-CHECK-NEXT: {{.*}}
-CHECK-NEXT: {{.*}}
-CHECK-NEXT: num_repetitions: 10000
-CHECK-NEXT: measurements:
-CHECK-NEXT: {{.*}} value: 0.0001, per_snippet_value: 0.0002 {{.*}}
-CHECK-LAST: ...

diff  --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
index f015147b0fc2..bdef8f8a8918 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
@@ -55,6 +55,7 @@ class FunctionExecutorImpl : public BenchmarkRunner::FunctionExecutor {
   static void
   accumulateCounterValues(const llvm::SmallVector<int64_t, 4> &NewValues,
                           llvm::SmallVector<int64_t, 4> *Result) {
+
     const size_t NumValues = std::max(NewValues.size(), Result->size());
     if (NumValues > Result->size())
       Result->resize(NumValues, 0);
@@ -105,10 +106,10 @@ class FunctionExecutorImpl : public BenchmarkRunner::FunctionExecutor {
         if (Crashed)
           return make_error<SnippetCrash>("snippet crashed while running");
       }
-
-      auto ValueOrError = Counter->readOrError(Function.getFunctionBytes());
+      auto ValueOrError = Counter->readOrError();
       if (!ValueOrError)
         return ValueOrError.takeError();
+
       accumulateCounterValues(ValueOrError.get(), &CounterValues);
     }
     return CounterValues;

diff  --git a/llvm/tools/llvm-exegesis/lib/PerfHelper.cpp b/llvm/tools/llvm-exegesis/lib/PerfHelper.cpp
index 58e1f4dc2a2b..cba4846709e8 100644
--- a/llvm/tools/llvm-exegesis/lib/PerfHelper.cpp
+++ b/llvm/tools/llvm-exegesis/lib/PerfHelper.cpp
@@ -128,8 +128,7 @@ int64_t Counter::read() const {
   return -1;
 }
 
-llvm::Expected<llvm::SmallVector<int64_t, 4>>
-Counter::readOrError(StringRef /*unused*/) const {
+llvm::Expected<llvm::SmallVector<int64_t, 4>> Counter::readOrError() const {
   int64_t Count = 0;
   ssize_t ReadSize = ::read(FileDescriptor, &Count, sizeof(Count));
   if (ReadSize != sizeof(Count))
@@ -153,8 +152,7 @@ void Counter::stop() {}
 
 int64_t Counter::read() const { return 42; }
 
-llvm::Expected<llvm::SmallVector<int64_t, 4>>
-Counter::readOrError(StringRef /*unused*/) const {
+llvm::Expected<llvm::SmallVector<int64_t, 4>> Counter::readOrError() const {
   return llvm::make_error<llvm::StringError>("Not implemented",
                                              llvm::errc::io_error);
 }

diff  --git a/llvm/tools/llvm-exegesis/lib/PerfHelper.h b/llvm/tools/llvm-exegesis/lib/PerfHelper.h
index 19a35595c9af..d41b090e85f1 100644
--- a/llvm/tools/llvm-exegesis/lib/PerfHelper.h
+++ b/llvm/tools/llvm-exegesis/lib/PerfHelper.h
@@ -59,9 +59,8 @@ class PerfEvent {
   // e.g. "snb_ep::INSTRUCTION_RETIRED:e=0:i=0:c=0:t=0:u=1:k=0:mg=0:mh=1"
   StringRef getPfmEventString() const;
 
-protected:
-  PerfEvent() = default;
-  std::string EventString;
+private:
+  const std::string EventString;
   std::string FullQualifiedEventString;
   perf_event_attr *Attr;
 };
@@ -88,17 +87,11 @@ class Counter {
   int64_t read() const;
 
   /// Returns the current value of the counter or error if it cannot be read.
-  /// FunctionBytes: The benchmark function being executed.
-  /// This is used to filter out the measurements to ensure they are only
-  /// within the benchmarked code.
-  /// If empty (or not specified), then no filtering will be done.
-  /// Not all counters choose to use this.
-  virtual llvm::Expected<llvm::SmallVector<int64_t, 4>>
-  readOrError(StringRef FunctionBytes = StringRef()) const;
+  virtual llvm::Expected<llvm::SmallVector<int64_t, 4>> readOrError() const;
 
   virtual int numValues() const;
 
-protected:
+private:
   PerfEvent Event;
 #ifdef HAVE_LIBPFM
   int FileDescriptor = -1;

diff  --git a/llvm/tools/llvm-exegesis/lib/X86/CMakeLists.txt b/llvm/tools/llvm-exegesis/lib/X86/CMakeLists.txt
index ce3bbd5908a8..912877dd6ed1 100644
--- a/llvm/tools/llvm-exegesis/lib/X86/CMakeLists.txt
+++ b/llvm/tools/llvm-exegesis/lib/X86/CMakeLists.txt
@@ -6,7 +6,6 @@ include_directories(
 add_library(LLVMExegesisX86
   STATIC
   Target.cpp
-  X86Counter.cpp
   )
 
 llvm_update_compile_flags(LLVMExegesisX86)

diff  --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
index 327cddccb30f..7a84f936e0d0 100644
--- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
@@ -14,40 +14,15 @@
 #include "MCTargetDesc/X86BaseInfo.h"
 #include "MCTargetDesc/X86MCTargetDesc.h"
 #include "X86.h"
-#include "X86Counter.h"
 #include "X86RegisterInfo.h"
 #include "X86Subtarget.h"
 #include "llvm/ADT/Sequence.h"
 #include "llvm/MC/MCInstBuilder.h"
-#include "llvm/Support/Errc.h"
-#include "llvm/Support/Error.h"
 #include "llvm/Support/FormatVariadic.h"
 
-#include <memory>
-#include <string>
-#include <vector>
-
 namespace llvm {
 namespace exegesis {
 
-static cl::OptionCategory
-    BenchmarkOptions("llvm-exegesis benchmark x86-options");
-
-// If a positive value is specified, we are going to use the LBR in
-// latency-mode.
-//
-// Note:
-//  -  A small value is preferred, but too low a value could result in
-//     throttling.
-//  -  A prime number is preferred to avoid always skipping certain blocks.
-//
-static cl::opt<unsigned> LbrSamplingPeriod(
-    "x86-lbr-sample-period",
-    cl::desc("The sample period (nbranches/sample), used for LBR sampling"),
-    cl::cat(BenchmarkOptions), cl::init(0));
-
-// FIXME: Validates that repetition-mode is loop if LBR is requested.
-
 // Returns a non-null reason if we cannot handle the memory references in this
 // instruction.
 static const char *isInvalidMemoryInstr(const Instruction &Instr) {
@@ -593,29 +568,10 @@ void ConstantInliner::initStack(unsigned Bytes) {
 #include "X86GenExegesis.inc"
 
 namespace {
-
 class ExegesisX86Target : public ExegesisTarget {
 public:
   ExegesisX86Target() : ExegesisTarget(X86CpuPfmCounters) {}
 
-  Expected<std::unique_ptr<pfm::Counter>>
-  createCounter(StringRef CounterName, const LLVMState &State) const override {
-    // If LbrSamplingPeriod was provided, then ignore the
-    // CounterName because we only have one for LBR.
-    if (LbrSamplingPeriod > 0) {
-      // Can't use LBR without HAVE_LIBPFM, or __linux__ (for now)
-#if defined(HAVE_LIBPFM) && defined(__linux__)
-      return std::make_unique<X86LbrCounter>(
-          X86LbrPerfEvent(LbrSamplingPeriod));
-#else
-      return llvm::make_error<llvm::StringError>(
-          "LBR counter requested without HAVE_LIBPFM or running on Linux.",
-          llvm::errc::invalid_argument);
-#endif
-    }
-    return ExegesisTarget::createCounter(CounterName, State);
-  }
-
 private:
   void addTargetSpecificPasses(PassManagerBase &PM) const override;
 

diff  --git a/llvm/tools/llvm-exegesis/lib/X86/X86Counter.cpp b/llvm/tools/llvm-exegesis/lib/X86/X86Counter.cpp
deleted file mode 100644
index c9f9264d7d2a..000000000000
--- a/llvm/tools/llvm-exegesis/lib/X86/X86Counter.cpp
+++ /dev/null
@@ -1,218 +0,0 @@
-//===-- X86Counter.cpp ------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "X86Counter.h"
-
-// FIXME: Use appropriate wrappers for poll.h and mman.h
-// to support Windows and remove this linux-only guard.
-#ifdef __linux__
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Errc.h"
-
-#ifdef HAVE_LIBPFM
-#include "perfmon/perf_event.h"
-#include "perfmon/pfmlib.h"
-#include "perfmon/pfmlib_perf_event.h"
-#endif // HAVE_LIBPFM
-
-#include <atomic>
-#include <cstddef>
-#include <cstdint>
-#include <limits>
-#include <memory>
-#include <vector>
-
-#include <poll.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-#ifdef HAVE_LIBPFM
-namespace llvm {
-namespace exegesis {
-
-static constexpr size_t kBufferPages = 8;
-static const size_t kDataBufferSize = kBufferPages * getpagesize();
-
-// Waits for the LBR perf events.
-static int pollLbrPerfEvent(const int FileDescriptor) {
-  struct pollfd PollFd;
-  PollFd.fd = FileDescriptor;
-  PollFd.events = POLLIN;
-  PollFd.revents = 0;
-  return poll(&PollFd, 1 /* num of fds */, 10000 /* timeout in ms */);
-}
-
-// Copies the data-buffer into Buf, given the pointer to MMapped.
-static void copyDataBuffer(void *MMappedBuffer, char *Buf, uint64_t Tail,
-                           size_t DataSize) {
-  // First page is reserved for perf_event_mmap_page. Data buffer starts on
-  // the next page.
-  char *Start = reinterpret_cast<char *>(MMappedBuffer) + getpagesize();
-  // The LBR buffer is a cyclic buffer, we copy data to another buffer.
-  uint64_t Offset = Tail % kDataBufferSize;
-  size_t CopySize = kDataBufferSize - Offset;
-  memcpy(Buf, Start + Offset, CopySize);
-  if (CopySize >= DataSize)
-    return;
-
-  memcpy(Buf + CopySize, Start, Offset);
-  return;
-}
-
-// Parses the given data-buffer for stats and fill the CycleArray.
-// If data has been extracted successfully, also modifies the code to jump
-// out the benchmark loop.
-static llvm::Error parseDataBuffer(const char *DataBuf, size_t DataSize,
-                                   const void *From, const void *To,
-                                   llvm::SmallVector<int64_t, 4> *CycleArray) {
-  assert(From != nullptr && To != nullptr);
-  const char *DataPtr = DataBuf;
-  while (DataPtr < DataBuf + DataSize) {
-    struct perf_event_header Header;
-    memcpy(&Header, DataPtr, sizeof(struct perf_event_header));
-    if (Header.type != PERF_RECORD_SAMPLE) {
-      // Ignores non-sample records.
-      DataPtr += Header.size;
-      continue;
-    }
-    DataPtr += sizeof(Header);
-    uint64_t Count = llvm::support::endian::read64(DataPtr, support::native);
-    DataPtr += sizeof(Count);
-
-    struct perf_branch_entry Entry;
-    memcpy(&Entry, DataPtr, sizeof(struct perf_branch_entry));
-    // Read the perf_branch_entry array.
-    for (uint64_t i = 0; i < Count; ++i) {
-      const uint64_t BlockStart = From == nullptr
-                                      ? std::numeric_limits<uint64_t>::min()
-                                      : reinterpret_cast<uint64_t>(From);
-      const uint64_t BlockEnd = To == nullptr
-                                    ? std::numeric_limits<uint64_t>::max()
-                                    : reinterpret_cast<uint64_t>(To);
-
-      if (BlockStart <= Entry.from && BlockEnd >= Entry.to)
-        CycleArray->push_back(Entry.cycles);
-
-      if (i == Count - 1)
-        // We've reached the last entry.
-        return llvm::Error::success();
-
-      // Advance to next entry
-      DataPtr += sizeof(Entry);
-      memcpy(&Entry, DataPtr, sizeof(struct perf_branch_entry));
-    }
-  }
-  return llvm::make_error<llvm::StringError>("Unable to parse databuffer.",
-                                             llvm::errc::io_error);
-}
-
-#ifdef HAVE_LIBPFM
-X86LbrPerfEvent::X86LbrPerfEvent(unsigned SamplingPeriod) {
-  assert(SamplingPeriod > 0 && "SamplingPeriod must be positive");
-  EventString = "BR_INST_RETIRED.NEAR_TAKEN";
-  Attr = new perf_event_attr();
-  Attr->size = sizeof(*Attr);
-  Attr->type = PERF_TYPE_RAW;
-  // FIXME This is SKL's encoding. Not sure if it'll change.
-  Attr->config = 0x20c4; // BR_INST_RETIRED.NEAR_TAKEN
-  Attr->sample_type = PERF_SAMPLE_BRANCH_STACK;
-  // Don't need to specify "USER" because we've already excluded HV and Kernel.
-  Attr->branch_sample_type = PERF_SAMPLE_BRANCH_ANY;
-  Attr->sample_period = SamplingPeriod;
-  Attr->wakeup_events = 1; // We need this even when using ioctl REFRESH.
-  Attr->disabled = 1;
-  Attr->exclude_kernel = 1;
-  Attr->exclude_hv = 1;
-  Attr->read_format = PERF_FORMAT_GROUP;
-
-  FullQualifiedEventString = EventString;
-}
-#else
-X86LbrPerfEvent::X86LbrPerfEvent(unsigned SamplingPeriod) {
-  EventString = "";
-  Attr = nullptr;
-}
-#endif
-
-X86LbrCounter::X86LbrCounter(pfm::PerfEvent &&NewEvent)
-    : Counter(std::move(NewEvent)) {
-  // First page is reserved for perf_event_mmap_page. Data buffer starts on
-  // the next page, so we allocate one more page.
-  MMappedBuffer = mmap(nullptr, (kBufferPages + 1) * getpagesize(),
-                       PROT_READ | PROT_WRITE, MAP_SHARED, FileDescriptor, 0);
-  if (MMappedBuffer == MAP_FAILED)
-    llvm::errs() << "Failed to mmap buffer.";
-}
-
-X86LbrCounter::~X86LbrCounter() { close(FileDescriptor); }
-
-void X86LbrCounter::start() {
-  ioctl(FileDescriptor, PERF_EVENT_IOC_REFRESH, 1024 /* kMaxPollsPerFd */);
-}
-
-llvm::Expected<llvm::SmallVector<int64_t, 4>>
-X86LbrCounter::readOrError(StringRef FunctionBytes) const {
-  // The max number of time-outs/retries before we give up.
-  static constexpr int kMaxTimeouts = 160;
-
-  // Disable the event before reading
-  ioctl(FileDescriptor, PERF_EVENT_IOC_DISABLE, 0);
-
-  // Parses the LBR buffer and fills CycleArray with the sequence of cycle
-  // counts from the buffer.
-  llvm::SmallVector<int64_t, 4> CycleArray;
-  std::unique_ptr<char[]> DataBuf(new char[kDataBufferSize]);
-  int NumTimeouts = 0;
-  int PollResult = 0;
-
-  // Find the boundary of the function so that we could filter the LBRs
-  // to keep only the relevant records.
-  if (FunctionBytes.empty())
-    return llvm::make_error<llvm::StringError>("Empty function bytes",
-                                               llvm::errc::invalid_argument);
-  const void *From = reinterpret_cast<const void *>(FunctionBytes.data());
-  const void *To = reinterpret_cast<const void *>(FunctionBytes.data() +
-                                                  FunctionBytes.size());
-  while (PollResult <= 0) {
-    PollResult = pollLbrPerfEvent(FileDescriptor);
-    if (PollResult > 0)
-      break;
-    if (PollResult == -1)
-      return llvm::make_error<llvm::StringError>("Cannot poll LBR perf event.",
-                                                 llvm::errc::io_error);
-    if (NumTimeouts++ >= kMaxTimeouts)
-      return llvm::make_error<llvm::StringError>(
-          "LBR polling still timed out after max number of attempts.",
-          llvm::errc::device_or_resource_busy);
-  }
-
-  struct perf_event_mmap_page Page;
-  memcpy(&Page, MMappedBuffer, sizeof(struct perf_event_mmap_page));
-
-  const uint64_t DataTail = Page.data_tail;
-  const uint64_t DataHead = Page.data_head;
-  // We're supposed to use a barrier after reading data_head.
-  std::atomic_thread_fence(std::memory_order_acq_rel);
-  const size_t DataSize = DataHead - DataTail;
-  if (DataSize > kDataBufferSize)
-    return llvm::make_error<llvm::StringError>(
-        "DataSize larger than buffer size.", llvm::errc::invalid_argument);
-
-  copyDataBuffer(MMappedBuffer, DataBuf.get(), DataTail, DataSize);
-  llvm::Error error =
-      parseDataBuffer(DataBuf.get(), DataSize, From, To, &CycleArray);
-  if (!error)
-    return CycleArray;
-  return std::move(error);
-}
-
-} // namespace exegesis
-} // namespace llvm
-
-#endif // HAVE_LIBPFM
-#endif // __linux__

diff  --git a/llvm/tools/llvm-exegesis/lib/X86/X86Counter.h b/llvm/tools/llvm-exegesis/lib/X86/X86Counter.h
deleted file mode 100644
index 4409d7c93a03..000000000000
--- a/llvm/tools/llvm-exegesis/lib/X86/X86Counter.h
+++ /dev/null
@@ -1,53 +0,0 @@
-//===-- X86Counter.h --------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// Perf counter that reads the LBRs for measuring the benchmarked block's
-/// throughput.
-///
-/// More info at: https://lwn.net/Articles/680985
-//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_EXEGESIS_LIB_X86_X86COUNTER_H
-#define LLVM_TOOLS_LLVM_EXEGESIS_LIB_X86_X86COUNTER_H
-
-#include "../PerfHelper.h"
-#include "llvm/Support/Error.h"
-
-// FIXME: Use appropriate wrappers for poll.h and mman.h
-// to support Windows and remove this linux-only guard.
-#if defined(__linux__) && defined(HAVE_LIBPFM)
-
-namespace llvm {
-namespace exegesis {
-
-class X86LbrPerfEvent : public pfm::PerfEvent {
-public:
-  X86LbrPerfEvent(unsigned SamplingPeriod);
-};
-
-class X86LbrCounter : public pfm::Counter {
-public:
-  explicit X86LbrCounter(pfm::PerfEvent &&Event);
-
-  virtual ~X86LbrCounter();
-
-  void start() override;
-
-  llvm::Expected<llvm::SmallVector<int64_t, 4>>
-  readOrError(StringRef FunctionBytes) const override;
-
-private:
-  void *MMappedBuffer = nullptr;
-};
-
-} // namespace exegesis
-} // namespace llvm
-
-#endif // defined(__linux__) && defined(HAVE_LIBPFM)
-
-#endif // LLVM_TOOLS_LLVM_EXEGESIS_LIB_X86_X86COUNTER_H

diff  --git a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
index 8eeda4882385..507015b97472 100644
--- a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
+++ b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
@@ -160,12 +160,6 @@ static cl::opt<std::string>
                                       cl::desc(""), cl::cat(AnalysisOptions),
                                       cl::init(""));
 
-static cl::list<std::string>
-    AllowedHostCpus("allowed-host-cpu",
-                    cl::desc("If specified, only run the benchmark if the host "
-                             "CPU matches the names"),
-                    cl::cat(Options), cl::ZeroOrMore);
-
 static cl::opt<bool> AnalysisDisplayUnstableOpcodes(
     "analysis-display-unstable-clusters",
     cl::desc("if there is more than one benchmark for an opcode, said "
@@ -302,13 +296,6 @@ void benchmarkMain() {
 
   const LLVMState State(CpuName);
 
-  llvm::StringRef ActualCpu = State.getTargetMachine().getTargetCPU();
-  for (auto Begin = AllowedHostCpus.begin(); Begin != AllowedHostCpus.end();
-       ++Begin) {
-    if (ActualCpu != *Begin)
-      ExitWithError(llvm::Twine("Unexpected host CPU ").concat(ActualCpu));
-  }
-
   const std::unique_ptr<BenchmarkRunner> Runner =
       ExitOnErr(State.getExegesisTarget().createBenchmarkRunner(
           BenchmarkMode, State, ResultAggMode));


        


More information about the llvm-commits mailing list