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