summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-exegesis/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib')
-rw-r--r--llvm/tools/llvm-exegesis/lib/Latency.h2
-rw-r--r--llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp6
-rw-r--r--llvm/tools/llvm-exegesis/lib/SnippetGenerator.h7
-rw-r--r--llvm/tools/llvm-exegesis/lib/Target.cpp22
-rw-r--r--llvm/tools/llvm-exegesis/lib/Target.h7
-rw-r--r--llvm/tools/llvm-exegesis/lib/Uops.h2
-rw-r--r--llvm/tools/llvm-exegesis/lib/X86/Target.cpp14
7 files changed, 36 insertions, 24 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/Latency.h b/llvm/tools/llvm-exegesis/lib/Latency.h
index 503f91daf89..0ad0c2cea9b 100644
--- a/llvm/tools/llvm-exegesis/lib/Latency.h
+++ b/llvm/tools/llvm-exegesis/lib/Latency.h
@@ -24,7 +24,7 @@ namespace exegesis {
class LatencySnippetGenerator : public SnippetGenerator {
public:
- LatencySnippetGenerator(const LLVMState &State) : SnippetGenerator(State) {}
+ using SnippetGenerator::SnippetGenerator;
~LatencySnippetGenerator() override;
llvm::Expected<std::vector<CodeTemplate>>
diff --git a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
index 879962001e6..1b16259b8e6 100644
--- a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
+++ b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.cpp
@@ -33,7 +33,8 @@ std::vector<CodeTemplate> getSingleton(CodeTemplate &&CT) {
SnippetGeneratorFailure::SnippetGeneratorFailure(const llvm::Twine &S)
: llvm::StringError(S, llvm::inconvertibleErrorCode()) {}
-SnippetGenerator::SnippetGenerator(const LLVMState &State) : State(State) {}
+SnippetGenerator::SnippetGenerator(const LLVMState &State, const Options &Opts)
+ : State(State), Opts(Opts) {}
SnippetGenerator::~SnippetGenerator() = default;
@@ -81,6 +82,9 @@ SnippetGenerator::generateConfigurations(
computeRegisterInitialValues(CT.Instructions);
BC.Key.Config = CT.Config;
Output.push_back(std::move(BC));
+ if (Output.size() >= Opts.MaxConfigsPerOpcode)
+ return Output; // Early exit if we exceeded the number of allowed
+ // configs.
}
}
return Output;
diff --git a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.h b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.h
index c2ea1c12473..8e8cd6fcb99 100644
--- a/llvm/tools/llvm-exegesis/lib/SnippetGenerator.h
+++ b/llvm/tools/llvm-exegesis/lib/SnippetGenerator.h
@@ -51,7 +51,11 @@ public:
// Common code for all benchmark modes.
class SnippetGenerator {
public:
- explicit SnippetGenerator(const LLVMState &State);
+ struct Options {
+ unsigned MaxConfigsPerOpcode = 1;
+ };
+
+ explicit SnippetGenerator(const LLVMState &State, const Options &Opts);
virtual ~SnippetGenerator();
@@ -66,6 +70,7 @@ public:
protected:
const LLVMState &State;
+ const Options Opts;
private:
// API to be implemented by subclasses.
diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp
index a5ba24c20f2..7e27627c98c 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Target.cpp
@@ -36,17 +36,17 @@ void ExegesisTarget::registerTarget(ExegesisTarget *Target) {
FirstTarget = Target;
}
-std::unique_ptr<SnippetGenerator>
-ExegesisTarget::createSnippetGenerator(InstructionBenchmark::ModeE Mode,
- const LLVMState &State) const {
+std::unique_ptr<SnippetGenerator> ExegesisTarget::createSnippetGenerator(
+ InstructionBenchmark::ModeE Mode, const LLVMState &State,
+ const SnippetGenerator::Options &Opts) const {
switch (Mode) {
case InstructionBenchmark::Unknown:
return nullptr;
case InstructionBenchmark::Latency:
- return createLatencySnippetGenerator(State);
+ return createLatencySnippetGenerator(State, Opts);
case InstructionBenchmark::Uops:
case InstructionBenchmark::InverseThroughput:
- return createUopsSnippetGenerator(State);
+ return createUopsSnippetGenerator(State, Opts);
}
return nullptr;
}
@@ -66,14 +66,14 @@ ExegesisTarget::createBenchmarkRunner(InstructionBenchmark::ModeE Mode,
return nullptr;
}
-std::unique_ptr<SnippetGenerator>
-ExegesisTarget::createLatencySnippetGenerator(const LLVMState &State) const {
- return std::make_unique<LatencySnippetGenerator>(State);
+std::unique_ptr<SnippetGenerator> ExegesisTarget::createLatencySnippetGenerator(
+ const LLVMState &State, const SnippetGenerator::Options &Opts) const {
+ return std::make_unique<LatencySnippetGenerator>(State, Opts);
}
-std::unique_ptr<SnippetGenerator>
-ExegesisTarget::createUopsSnippetGenerator(const LLVMState &State) const {
- return std::make_unique<UopsSnippetGenerator>(State);
+std::unique_ptr<SnippetGenerator> ExegesisTarget::createUopsSnippetGenerator(
+ const LLVMState &State, const SnippetGenerator::Options &Opts) const {
+ return std::make_unique<UopsSnippetGenerator>(State, Opts);
}
std::unique_ptr<BenchmarkRunner> ExegesisTarget::createLatencyBenchmarkRunner(
diff --git a/llvm/tools/llvm-exegesis/lib/Target.h b/llvm/tools/llvm-exegesis/lib/Target.h
index 70313a7a2f7..511104d5947 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.h
+++ b/llvm/tools/llvm-exegesis/lib/Target.h
@@ -125,7 +125,8 @@ public:
// Creates a snippet generator for the given mode.
std::unique_ptr<SnippetGenerator>
createSnippetGenerator(InstructionBenchmark::ModeE Mode,
- const LLVMState &State) const;
+ const LLVMState &State,
+ const SnippetGenerator::Options &Opts) const;
// Creates a benchmark runner for the given mode.
std::unique_ptr<BenchmarkRunner>
createBenchmarkRunner(InstructionBenchmark::ModeE Mode,
@@ -151,9 +152,9 @@ private:
// Targets can implement their own snippet generators/benchmarks runners by
// implementing these.
std::unique_ptr<SnippetGenerator> virtual createLatencySnippetGenerator(
- const LLVMState &State) const;
+ const LLVMState &State, const SnippetGenerator::Options &Opts) const;
std::unique_ptr<SnippetGenerator> virtual createUopsSnippetGenerator(
- const LLVMState &State) const;
+ const LLVMState &State, const SnippetGenerator::Options &Opts) const;
std::unique_ptr<BenchmarkRunner> virtual createLatencyBenchmarkRunner(
const LLVMState &State, InstructionBenchmark::ModeE Mode) const;
std::unique_ptr<BenchmarkRunner> virtual createUopsBenchmarkRunner(
diff --git a/llvm/tools/llvm-exegesis/lib/Uops.h b/llvm/tools/llvm-exegesis/lib/Uops.h
index 23caff26658..fcfeabe99ee 100644
--- a/llvm/tools/llvm-exegesis/lib/Uops.h
+++ b/llvm/tools/llvm-exegesis/lib/Uops.h
@@ -22,7 +22,7 @@ namespace exegesis {
class UopsSnippetGenerator : public SnippetGenerator {
public:
- UopsSnippetGenerator(const LLVMState &State) : SnippetGenerator(State) {}
+ using SnippetGenerator::SnippetGenerator;
~UopsSnippetGenerator() override;
llvm::Expected<std::vector<CodeTemplate>>
diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
index ce66610891d..1532af8ddec 100644
--- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
@@ -462,14 +462,16 @@ private:
sizeof(kUnavailableRegisters[0]));
}
- std::unique_ptr<SnippetGenerator>
- createLatencySnippetGenerator(const LLVMState &State) const override {
- return std::make_unique<X86LatencySnippetGenerator>(State);
+ std::unique_ptr<SnippetGenerator> createLatencySnippetGenerator(
+ const LLVMState &State,
+ const SnippetGenerator::Options &Opts) const override {
+ return std::make_unique<X86LatencySnippetGenerator>(State, Opts);
}
- std::unique_ptr<SnippetGenerator>
- createUopsSnippetGenerator(const LLVMState &State) const override {
- return std::make_unique<X86UopsSnippetGenerator>(State);
+ std::unique_ptr<SnippetGenerator> createUopsSnippetGenerator(
+ const LLVMState &State,
+ const SnippetGenerator::Options &Opts) const override {
+ return std::make_unique<X86UopsSnippetGenerator>(State, Opts);
}
bool matchesArch(llvm::Triple::ArchType Arch) const override {
OpenPOWER on IntegriCloud