//===-- 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, const BitVector &ForbiddenRegisters); // 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 { … }; // Common code for all benchmark modes. class SnippetGenerator { … }; // 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 first bit that is common to these two vectors. std::optional<int> getFirstCommonBit(const BitVector &A, const BitVector &B); // 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); // Sanity check generated instruction. Error validateGeneratedInstruction(const LLVMState &State, const MCInst &Inst); } // namespace exegesis } // namespace llvm #endif // LLVM_TOOLS_LLVM_EXEGESIS_SNIPPETGENERATOR_H