123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- //===- MLRegAllocEvictAdvisor.cpp - ML eviction advisor -------------------===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- //
- // Function declarations of utilities related to feature extraction for unit
- // testing.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CODEGEN_MLREGALLOCEVICTIONADVISOR_H
- #define LLVM_CODEGEN_MLREGALLOCEVICTIONADVISOR_H
- #include "llvm/Analysis/MLModelRunner.h"
- #include "llvm/CodeGen/MachineBasicBlock.h"
- #include "llvm/CodeGen/SlotIndexes.h"
- using namespace llvm;
- // LRStartEndInfo contains the start and end of a specific live range as
- // slot indices as well as storing the index of the physical register it
- // is assigned to (or 1 above the phys reg count if its the candidate).
- // Used when extracting per-instruction features in the context of a
- // specific eviction problem.
- struct LRStartEndInfo {
- SlotIndex Begin;
- SlotIndex End;
- size_t Pos = 0;
- };
- void extractInstructionFeatures(
- llvm::SmallVectorImpl<LRStartEndInfo> &LRPosInfo,
- MLModelRunner *RegallocRunner, function_ref<int(SlotIndex)> GetOpcode,
- function_ref<float(SlotIndex)> GetMBBFreq,
- function_ref<MachineBasicBlock *(SlotIndex)> GetMBBReference,
- const int InstructionsIndex, const int InstructionsMappingIndex,
- const int MBBFreqIndex, const int MBBMappingIndex,
- const SlotIndex LastIndex);
- void extractMBBFrequency(const SlotIndex CurrentIndex,
- const size_t CurrentInstructionIndex,
- std::map<MachineBasicBlock *, size_t> &VisitedMBBs,
- function_ref<float(SlotIndex)> GetMBBFreq,
- MachineBasicBlock *CurrentMBBReference,
- MLModelRunner *RegallocRunner, const int MBBFreqIndex,
- const int MBBMappingIndex);
- // This is the maximum number of interfererring ranges. That's the number of
- // distinct AllocationOrder values, which comes from MCRegisterClass::RegsSize.
- // For X86, that's 32.
- // TODO: find a way to get this, statically, in a programmatic way.
- static const int64_t MaxInterferences = 32;
- // Logically, we can think of the feature set given to the evaluator as a 2D
- // matrix. The rows are the features (see next). The columns correspond to the
- // interferences. We treat the candidate virt reg as an 'interference', too, as
- // its feature set is the same as that of the interferring ranges. So we'll have
- // MaxInterferences + 1 columns and by convention, we will use the last column
- // for the virt reg seeking allocation.
- static const int64_t CandidateVirtRegPos = MaxInterferences;
- static const int64_t NumberOfInterferences = CandidateVirtRegPos + 1;
- // The number of instructions that a specific live range might have is variable,
- // but we're passing in a single matrix of instructions and tensorflow saved
- // models only support a fixed input size, so we have to cap the number of
- // instructions that can be passed along. The specific value was derived from
- // experimentation such that the majority of eviction problems would be
- // completely covered.
- static const int ModelMaxSupportedInstructionCount = 300;
- // When extracting per-instruction features, the advisor will currently create
- // a vector of size ModelMaxSupportedInstructionCount to hold the opcodes of the
- // instructions relevant to the eviction problem, and a NumberOfInterferences *
- // ModelMaxSupportedInstructionCount matrix that maps LRs to the instructions
- // that they span.
- static const std::vector<int64_t> InstructionsShape{
- 1, ModelMaxSupportedInstructionCount};
- static const std::vector<int64_t> InstructionsMappingShape{
- 1, NumberOfInterferences, ModelMaxSupportedInstructionCount};
- // When extracting mappings between MBBs and individual instructions, we create
- // a vector of MBB frequencies, currently of size 100, which was a value
- // determined through experimentation to encompass the vast majority of eviction
- // problems. The actual mapping is the same shape as the instruction opcodes
- // vector.
- static const int64_t ModelMaxSupportedMBBCount = 100;
- static const std::vector<int64_t> MBBFrequencyShape{1,
- ModelMaxSupportedMBBCount};
- #endif // LLVM_CODEGEN_MLREGALLOCEVICTIONADVISOR_H
|