//===- 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" #include <map> 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 { … }; 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 = …; // 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 = …; static const int64_t NumberOfInterferences = …; // 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 = …; // 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{ … }; static const std::vector<int64_t> InstructionsMappingShape{ … }; // 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 = …; static const std::vector<int64_t> MBBFrequencyShape{ … }; } // namespace llvm #endif // LLVM_CODEGEN_MLREGALLOCEVICTIONADVISOR_H