| //===-- SnippetGenerator.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 |
| /// Defines the abstract SnippetGenerator class for generating code that allows |
| /// measuring a certain property of instructions (e.g. latency). |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_TOOLS_LLVM_EXEGESIS_SNIPPETGENERATOR_H |
| #define LLVM_TOOLS_LLVM_EXEGESIS_SNIPPETGENERATOR_H |
| |
| #include "Assembler.h" |
| #include "BenchmarkCode.h" |
| #include "CodeTemplate.h" |
| #include "LlvmState.h" |
| #include "MCInstrDescView.h" |
| #include "RegisterAliasing.h" |
| #include "llvm/ADT/CombinationGenerator.h" |
| #include "llvm/MC/MCInst.h" |
| #include "llvm/Support/Error.h" |
| #include <cstdlib> |
| #include <memory> |
| #include <vector> |
| |
| namespace llvm { |
| namespace exegesis { |
| |
| std::vector<CodeTemplate> getSingleton(CodeTemplate &&CT); |
| |
| // Generates code templates that has a self-dependency. |
| Expected<std::vector<CodeTemplate>> |
| generateSelfAliasingCodeTemplates(InstructionTemplate Variant); |
| |
| // Generates code templates without assignment constraints. |
| Expected<std::vector<CodeTemplate>> |
| generateUnconstrainedCodeTemplates(const InstructionTemplate &Variant, |
| StringRef Msg); |
| |
| // A class representing failures that happened during Benchmark, they are used |
| // to report informations to the user. |
| class SnippetGeneratorFailure : public StringError { |
| public: |
| SnippetGeneratorFailure(const Twine &S); |
| }; |
| |
| // Common code for all benchmark modes. |
| class SnippetGenerator { |
| public: |
| struct Options { |
| unsigned MaxConfigsPerOpcode = 1; |
| }; |
| |
| explicit SnippetGenerator(const LLVMState &State, const Options &Opts); |
| |
| virtual ~SnippetGenerator(); |
| |
| // Calls generateCodeTemplate and expands it into one or more BenchmarkCode. |
| Error generateConfigurations(const InstructionTemplate &Variant, |
| std::vector<BenchmarkCode> &Benchmarks, |
| const BitVector &ExtraForbiddenRegs) const; |
| |
| // Given a snippet, computes which registers the setup code needs to define. |
| std::vector<RegisterValue> computeRegisterInitialValues( |
| const std::vector<InstructionTemplate> &Snippet) const; |
| |
| protected: |
| const LLVMState &State; |
| const Options Opts; |
| |
| private: |
| // API to be implemented by subclasses. |
| virtual Expected<std::vector<CodeTemplate>> |
| generateCodeTemplates(InstructionTemplate Variant, |
| const BitVector &ForbiddenRegisters) const = 0; |
| }; |
| |
| // A global Random Number Generator to randomize configurations. |
| // FIXME: Move random number generation into an object and make it seedable for |
| // unit tests. |
| std::mt19937 &randomGenerator(); |
| |
| // Picks a random unsigned integer from 0 to Max (inclusive). |
| size_t randomIndex(size_t Max); |
| |
| // Picks a random bit among the bits set in Vector and returns its index. |
| // Precondition: Vector must have at least one bit set. |
| size_t randomBit(const BitVector &Vector); |
| |
| // Picks a random configuration, then selects a random def and a random use from |
| // it and finally set the selected values in the provided InstructionInstances. |
| void setRandomAliasing(const AliasingConfigurations &AliasingConfigurations, |
| InstructionTemplate &DefIB, InstructionTemplate &UseIB); |
| |
| // Assigns a Random Value to all Variables in IT that are still Invalid. |
| // Do not use any of the registers in `ForbiddenRegs`. |
| Error randomizeUnsetVariables(const LLVMState &State, |
| const BitVector &ForbiddenRegs, |
| InstructionTemplate &IT); |
| |
| } // namespace exegesis |
| } // namespace llvm |
| |
| #endif // LLVM_TOOLS_LLVM_EXEGESIS_SNIPPETGENERATOR_H |