116 lines · c
1//===-- SnippetGenerator.h --------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// Defines the abstract SnippetGenerator class for generating code that allows11/// measuring a certain property of instructions (e.g. latency).12///13//===----------------------------------------------------------------------===//14 15#ifndef LLVM_TOOLS_LLVM_EXEGESIS_SNIPPETGENERATOR_H16#define LLVM_TOOLS_LLVM_EXEGESIS_SNIPPETGENERATOR_H17 18#include "Assembler.h"19#include "BenchmarkCode.h"20#include "CodeTemplate.h"21#include "LlvmState.h"22#include "MCInstrDescView.h"23#include "RegisterAliasing.h"24#include "llvm/ADT/CombinationGenerator.h"25#include "llvm/MC/MCInst.h"26#include "llvm/Support/Error.h"27#include <cstdlib>28#include <vector>29 30namespace llvm {31namespace exegesis {32 33std::vector<CodeTemplate> getSingleton(CodeTemplate &&CT);34 35// Generates code templates that has a self-dependency.36Expected<std::vector<CodeTemplate>>37generateSelfAliasingCodeTemplates(InstructionTemplate Variant,38 const BitVector &ForbiddenRegisters);39 40// Generates code templates without assignment constraints.41Expected<std::vector<CodeTemplate>>42generateUnconstrainedCodeTemplates(const InstructionTemplate &Variant,43 StringRef Msg);44 45// A class representing failures that happened during Benchmark, they are used46// to report informations to the user.47class SnippetGeneratorFailure : public StringError {48public:49 SnippetGeneratorFailure(const Twine &S);50};51 52// Common code for all benchmark modes.53class SnippetGenerator {54public:55 struct Options {56 unsigned MaxConfigsPerOpcode = 1;57 };58 59 explicit SnippetGenerator(const LLVMState &State, const Options &Opts);60 61 virtual ~SnippetGenerator();62 63 // Calls generateCodeTemplate and expands it into one or more BenchmarkCode.64 Error generateConfigurations(const InstructionTemplate &Variant,65 std::vector<BenchmarkCode> &Benchmarks,66 const BitVector &ExtraForbiddenRegs) const;67 68 // Given a snippet, computes which registers the setup code needs to define.69 std::vector<RegisterValue> computeRegisterInitialValues(70 const std::vector<InstructionTemplate> &Snippet) const;71 72protected:73 const LLVMState &State;74 const Options Opts;75 76private:77 // API to be implemented by subclasses.78 virtual Expected<std::vector<CodeTemplate>>79 generateCodeTemplates(InstructionTemplate Variant,80 const BitVector &ForbiddenRegisters) const = 0;81};82 83// A global Random Number Generator to randomize configurations.84// FIXME: Move random number generation into an object and make it seedable for85// unit tests.86std::mt19937 &randomGenerator();87 88// Picks a random unsigned integer from 0 to Max (inclusive).89size_t randomIndex(size_t Max);90 91// Picks a random bit among the bits set in Vector and returns its index.92// Precondition: Vector must have at least one bit set.93size_t randomBit(const BitVector &Vector);94 95// Picks a first bit that is common to these two vectors.96std::optional<int> getFirstCommonBit(const BitVector &A, const BitVector &B);97 98// Picks a random configuration, then selects a random def and a random use from99// it and finally set the selected values in the provided InstructionInstances.100void setRandomAliasing(const AliasingConfigurations &AliasingConfigurations,101 InstructionTemplate &DefIB, InstructionTemplate &UseIB);102 103// Assigns a Random Value to all Variables in IT that are still Invalid.104// Do not use any of the registers in `ForbiddenRegs`.105Error randomizeUnsetVariables(const LLVMState &State,106 const BitVector &ForbiddenRegs,107 InstructionTemplate &IT);108 109// Sanity check generated instruction.110Error validateGeneratedInstruction(const LLVMState &State, const MCInst &Inst);111 112} // namespace exegesis113} // namespace llvm114 115#endif // LLVM_TOOLS_LLVM_EXEGESIS_SNIPPETGENERATOR_H116