| //===- 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 |