xref: /netbsd-src/external/apache2/llvm/dist/llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.cpp (revision 82d56013d7b633d116a93943de88e08335357a7c)
1*82d56013Sjoerg //===-- UopsBenchmarkRunner.cpp ---------------------------------*- C++ -*-===//
2*82d56013Sjoerg //
3*82d56013Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*82d56013Sjoerg // See https://llvm.org/LICENSE.txt for license information.
5*82d56013Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*82d56013Sjoerg //
7*82d56013Sjoerg //===----------------------------------------------------------------------===//
8*82d56013Sjoerg 
9*82d56013Sjoerg #include "UopsBenchmarkRunner.h"
10*82d56013Sjoerg 
11*82d56013Sjoerg #include "Target.h"
12*82d56013Sjoerg 
13*82d56013Sjoerg namespace llvm {
14*82d56013Sjoerg namespace exegesis {
15*82d56013Sjoerg 
16*82d56013Sjoerg UopsBenchmarkRunner::~UopsBenchmarkRunner() = default;
17*82d56013Sjoerg 
18*82d56013Sjoerg Expected<std::vector<BenchmarkMeasure>>
runMeasurements(const FunctionExecutor & Executor) const19*82d56013Sjoerg UopsBenchmarkRunner::runMeasurements(const FunctionExecutor &Executor) const {
20*82d56013Sjoerg   std::vector<BenchmarkMeasure> Result;
21*82d56013Sjoerg   const PfmCountersInfo &PCI = State.getPfmCounters();
22*82d56013Sjoerg   // Uops per port.
23*82d56013Sjoerg   for (const auto *IssueCounter = PCI.IssueCounters,
24*82d56013Sjoerg                   *IssueCounterEnd = PCI.IssueCounters + PCI.NumIssueCounters;
25*82d56013Sjoerg        IssueCounter != IssueCounterEnd; ++IssueCounter) {
26*82d56013Sjoerg     if (!IssueCounter->Counter)
27*82d56013Sjoerg       continue;
28*82d56013Sjoerg     auto ExpectedCounterValue = Executor.runAndMeasure(IssueCounter->Counter);
29*82d56013Sjoerg     if (!ExpectedCounterValue)
30*82d56013Sjoerg       return ExpectedCounterValue.takeError();
31*82d56013Sjoerg     Result.push_back(BenchmarkMeasure::Create(IssueCounter->ProcResName,
32*82d56013Sjoerg                                               *ExpectedCounterValue));
33*82d56013Sjoerg   }
34*82d56013Sjoerg   // NumMicroOps.
35*82d56013Sjoerg   if (const char *const UopsCounter = PCI.UopsCounter) {
36*82d56013Sjoerg     auto ExpectedCounterValue = Executor.runAndMeasure(UopsCounter);
37*82d56013Sjoerg     if (!ExpectedCounterValue)
38*82d56013Sjoerg       return ExpectedCounterValue.takeError();
39*82d56013Sjoerg     Result.push_back(
40*82d56013Sjoerg         BenchmarkMeasure::Create("NumMicroOps", *ExpectedCounterValue));
41*82d56013Sjoerg   }
42*82d56013Sjoerg   return std::move(Result);
43*82d56013Sjoerg }
44*82d56013Sjoerg 
45*82d56013Sjoerg } // namespace exegesis
46*82d56013Sjoerg } // namespace llvm
47