xref: /llvm-project/llvm/lib/CodeGen/RegAllocScore.h (revision 8d0383eb694e13a999c9c95adc4b56771429e551)
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