brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · 1ef0beb Raw
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