summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
diff options
context:
space:
mode:
authorClement Courbet <courbet@google.com>2018-05-17 07:38:21 +0000
committerClement Courbet <courbet@google.com>2018-05-17 07:38:21 +0000
commitee110fb735651d63252f70104d39c5a0376ee20d (patch)
tree56191aacb80508141d669128159f56b5afef5879 /llvm/tools/llvm-exegesis/llvm-exegesis.cpp
parentf4b09a3a30875842ea4f8e8fce22936a2a29164e (diff)
downloadbcm5719-llvm-ee110fb735651d63252f70104d39c5a0376ee20d.tar.gz
bcm5719-llvm-ee110fb735651d63252f70104d39c5a0376ee20d.zip
[llvm-exegesis] Update to cover latency through another opcode.
Restructuring the code to measure latency and uops. The end goal is to have this program spawn another process to deal with SIGILL and other malformed programs. It is not yet the case in this redesign, it is still the main program that runs the code (and may crash). It now uses BitVector instead of Graph for performance reasons. https://reviews.llvm.org/D46821 Authored by Guillaume Chatelet llvm-svn: 332579
Diffstat (limited to 'llvm/tools/llvm-exegesis/llvm-exegesis.cpp')
-rw-r--r--llvm/tools/llvm-exegesis/llvm-exegesis.cpp42
1 files changed, 20 insertions, 22 deletions
diff --git a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
index a872c759093..2b77288d288 100644
--- a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
+++ b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
@@ -76,14 +76,23 @@ static llvm::cl::opt<std::string> AnalysisClustersFile("analysis-clusters-file",
namespace exegesis {
+static unsigned GetOpcodeOrDie(const llvm::MCInstrInfo &MCInstrInfo) {
+ if (OpcodeName.empty() && (OpcodeIndex == 0))
+ llvm::report_fatal_error(
+ "please provide one and only one of 'opcode-index' or 'opcode-name'");
+ if (OpcodeIndex > 0)
+ return OpcodeIndex;
+ // Resolve opcode name -> opcode.
+ for (unsigned I = 0, E = MCInstrInfo.getNumOpcodes(); I < E; ++I)
+ if (MCInstrInfo.getName(I) == OpcodeName)
+ return I;
+ llvm::report_fatal_error(llvm::Twine("unknown opcode ").concat(OpcodeName));
+}
+
void benchmarkMain() {
if (exegesis::pfm::pfmInitialize())
llvm::report_fatal_error("cannot initialize libpfm");
- if (OpcodeName.empty() == (OpcodeIndex == 0))
- llvm::report_fatal_error(
- "please provide one and only one of 'opcode-index' or 'opcode-name'");
-
llvm::InitializeNativeTarget();
llvm::InitializeNativeTargetAsmPrinter();
@@ -92,37 +101,26 @@ void benchmarkMain() {
const LLVMState State;
+ // FIXME: Do not require SchedModel for latency.
if (!State.getSubtargetInfo().getSchedModel().hasExtraProcessorInfo())
llvm::report_fatal_error("sched model is missing extra processor info!");
- unsigned Opcode = OpcodeIndex;
- if (Opcode == 0) {
- // Resolve opcode name -> opcode.
- for (unsigned I = 0, E = State.getInstrInfo().getNumOpcodes(); I < E; ++I) {
- if (State.getInstrInfo().getName(I) == OpcodeName) {
- Opcode = I;
- break;
- }
- }
- if (Opcode == 0) {
- llvm::report_fatal_error(
- llvm::Twine("unknown opcode ").concat(OpcodeName));
- }
- }
-
std::unique_ptr<BenchmarkRunner> Runner;
switch (BenchmarkMode) {
case BenchmarkModeE::Latency:
- Runner = llvm::make_unique<LatencyBenchmarkRunner>();
+ Runner = llvm::make_unique<LatencyBenchmarkRunner>(State);
break;
case BenchmarkModeE::Uops:
- Runner = llvm::make_unique<UopsBenchmarkRunner>();
+ Runner = llvm::make_unique<UopsBenchmarkRunner>(State);
break;
case BenchmarkModeE::Analysis:
llvm_unreachable("not a benchmark");
}
- Runner->run(State, Opcode, NumRepetitions > 0 ? NumRepetitions : 1, Filter)
+ if (NumRepetitions == 0)
+ llvm::report_fatal_error("--num-repetitions must be greater than zero");
+
+ Runner->run(GetOpcodeOrDie(State.getInstrInfo()), Filter, NumRepetitions)
.writeYamlOrDie(BenchmarkFile);
exegesis::pfm::pfmTerminate();
}
OpenPOWER on IntegriCloud