1fa99cb64SMircea Trofin //==- RegAllocScore.h - evaluate regalloc policy quality ----------*-C++-*-==// 2fa99cb64SMircea Trofin // 3fa99cb64SMircea Trofin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fa99cb64SMircea Trofin // See https://llvm.org/LICENSE.txt for license information. 5fa99cb64SMircea Trofin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fa99cb64SMircea Trofin // 7fa99cb64SMircea Trofin //===----------------------------------------------------------------------===// 8fa99cb64SMircea Trofin /// Calculate a measure of the register allocation policy quality. This is used 9fa99cb64SMircea Trofin /// to construct a reward for the training of the ML-driven allocation policy. 10fa99cb64SMircea Trofin /// Currently, the score is the sum of the machine basic block frequency-weighed 11fa99cb64SMircea Trofin /// number of loads, stores, copies, and remat instructions, each factored with 12fa99cb64SMircea Trofin /// a relative weight. 13fa99cb64SMircea Trofin //===----------------------------------------------------------------------===// 14fa99cb64SMircea Trofin 15fa99cb64SMircea Trofin #ifndef LLVM_CODEGEN_REGALLOCSCORE_H_ 16fa99cb64SMircea Trofin #define LLVM_CODEGEN_REGALLOCSCORE_H_ 17fa99cb64SMircea Trofin 18989f1c72Sserge-sans-paille #include "llvm/ADT/STLFunctionalExtras.h" 19fa99cb64SMircea Trofin 20fa99cb64SMircea Trofin namespace llvm { 21fa99cb64SMircea Trofin 22989f1c72Sserge-sans-paille class MachineBasicBlock; 23989f1c72Sserge-sans-paille class MachineBlockFrequencyInfo; 24989f1c72Sserge-sans-paille class MachineFunction; 25989f1c72Sserge-sans-paille class MachineInstr; 26989f1c72Sserge-sans-paille 27fa99cb64SMircea Trofin /// Regalloc score. 28fa99cb64SMircea Trofin class RegAllocScore final { 29fa99cb64SMircea Trofin double CopyCounts = 0.0; 30fa99cb64SMircea Trofin double LoadCounts = 0.0; 31fa99cb64SMircea Trofin double StoreCounts = 0.0; 32fa99cb64SMircea Trofin double CheapRematCounts = 0.0; 33fa99cb64SMircea Trofin double LoadStoreCounts = 0.0; 34fa99cb64SMircea Trofin double ExpensiveRematCounts = 0.0; 35fa99cb64SMircea Trofin 36fa99cb64SMircea Trofin public: 37fa99cb64SMircea Trofin RegAllocScore() = default; 38fa99cb64SMircea Trofin RegAllocScore(const RegAllocScore &) = default; 39fa99cb64SMircea Trofin copyCounts()40fa99cb64SMircea Trofin double copyCounts() const { return CopyCounts; } loadCounts()41fa99cb64SMircea Trofin double loadCounts() const { return LoadCounts; } storeCounts()42fa99cb64SMircea Trofin double storeCounts() const { return StoreCounts; } loadStoreCounts()43fa99cb64SMircea Trofin double loadStoreCounts() const { return LoadStoreCounts; } expensiveRematCounts()44fa99cb64SMircea Trofin double expensiveRematCounts() const { return ExpensiveRematCounts; } cheapRematCounts()45fa99cb64SMircea Trofin double cheapRematCounts() const { return CheapRematCounts; } 46fa99cb64SMircea Trofin onCopy(double Freq)47fa99cb64SMircea Trofin void onCopy(double Freq) { CopyCounts += Freq; } onLoad(double Freq)48fa99cb64SMircea Trofin void onLoad(double Freq) { LoadCounts += Freq; } onStore(double Freq)49fa99cb64SMircea Trofin void onStore(double Freq) { StoreCounts += Freq; } onLoadStore(double Freq)50fa99cb64SMircea Trofin void onLoadStore(double Freq) { LoadStoreCounts += Freq; } onExpensiveRemat(double Freq)51fa99cb64SMircea Trofin void onExpensiveRemat(double Freq) { ExpensiveRematCounts += Freq; } onCheapRemat(double Freq)52fa99cb64SMircea Trofin void onCheapRemat(double Freq) { CheapRematCounts += Freq; } 53fa99cb64SMircea Trofin 54fa99cb64SMircea Trofin RegAllocScore &operator+=(const RegAllocScore &Other); 55fa99cb64SMircea Trofin bool operator==(const RegAllocScore &Other) const; 56fa99cb64SMircea Trofin bool operator!=(const RegAllocScore &Other) const; 57fa99cb64SMircea Trofin double getScore() const; 58fa99cb64SMircea Trofin }; 59fa99cb64SMircea Trofin 60fa99cb64SMircea Trofin /// Calculate a score. When comparing 2 scores for the same function but 61fa99cb64SMircea Trofin /// different policies, the better policy would have a smaller score. 62fa99cb64SMircea Trofin /// The implementation is the overload below (which is also easily unittestable) 63fa99cb64SMircea Trofin RegAllocScore calculateRegAllocScore(const MachineFunction &MF, 64*8d0383ebSMatt Arsenault const MachineBlockFrequencyInfo &MBFI); 65fa99cb64SMircea Trofin 66fa99cb64SMircea Trofin /// Implementation of the above, which is also more easily unittestable. 67fa99cb64SMircea Trofin RegAllocScore calculateRegAllocScore( 68fa99cb64SMircea Trofin const MachineFunction &MF, 69fa99cb64SMircea Trofin llvm::function_ref<double(const MachineBasicBlock &)> GetBBFreq, 70fa99cb64SMircea Trofin llvm::function_ref<bool(const MachineInstr &)> IsTriviallyRematerializable); 71fa99cb64SMircea Trofin } // end namespace llvm 72fa99cb64SMircea Trofin 73fa99cb64SMircea Trofin #endif // LLVM_CODEGEN_REGALLOCSCORE_H_ 74