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*82d56013SjoergUopsBenchmarkRunner::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