LLVM 20.0.0git
RegAllocScore.cpp
Go to the documentation of this file.
1//===- RegAllocScore.cpp - evaluate regalloc policy quality ---------------===//
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#include "RegAllocScore.h"
22#include "llvm/MC/MCInstrDesc.h"
24
25using namespace llvm;
26cl::opt<double> CopyWeight("regalloc-copy-weight", cl::init(0.2), cl::Hidden);
27cl::opt<double> LoadWeight("regalloc-load-weight", cl::init(4.0), cl::Hidden);
28cl::opt<double> StoreWeight("regalloc-store-weight", cl::init(1.0), cl::Hidden);
29cl::opt<double> CheapRematWeight("regalloc-cheap-remat-weight", cl::init(0.2),
31cl::opt<double> ExpensiveRematWeight("regalloc-expensive-remat-weight",
32 cl::init(1.0), cl::Hidden);
33#define DEBUG_TYPE "regalloc-score"
34
36 CopyCounts += Other.copyCounts();
37 LoadCounts += Other.loadCounts();
38 StoreCounts += Other.storeCounts();
39 LoadStoreCounts += Other.loadStoreCounts();
40 CheapRematCounts += Other.cheapRematCounts();
41 ExpensiveRematCounts += Other.expensiveRematCounts();
42 return *this;
43}
44
46 return copyCounts() == Other.copyCounts() &&
47 loadCounts() == Other.loadCounts() &&
48 storeCounts() == Other.storeCounts() &&
49 loadStoreCounts() == Other.loadStoreCounts() &&
50 cheapRematCounts() == Other.cheapRematCounts() &&
51 expensiveRematCounts() == Other.expensiveRematCounts();
52}
53
55 return !(*this == Other);
56}
57
59 double Ret = 0.0;
60 Ret += CopyWeight * copyCounts();
61 Ret += LoadWeight * loadCounts();
62 Ret += StoreWeight * storeCounts();
66
67 return Ret;
68}
69
72 const MachineBlockFrequencyInfo &MBFI) {
74 MF,
75 [&](const MachineBasicBlock &MBB) {
77 },
78 [&](const MachineInstr &MI) {
80 MI);
81 });
82}
83
85 const MachineFunction &MF,
86 llvm::function_ref<double(const MachineBasicBlock &)> GetBBFreq,
87 llvm::function_ref<bool(const MachineInstr &)>
88 IsTriviallyRematerializable) {
90
91 for (const MachineBasicBlock &MBB : MF) {
92 double BlockFreqRelativeToEntrypoint = GetBBFreq(MBB);
93 RegAllocScore MBBScore;
94
95 for (const MachineInstr &MI : MBB) {
96 if (MI.isDebugInstr() || MI.isKill() || MI.isInlineAsm()) {
97 continue;
98 }
99 if (MI.isCopy()) {
100 MBBScore.onCopy(BlockFreqRelativeToEntrypoint);
101 } else if (IsTriviallyRematerializable(MI)) {
102 if (MI.getDesc().isAsCheapAsAMove()) {
103 MBBScore.onCheapRemat(BlockFreqRelativeToEntrypoint);
104 } else {
105 MBBScore.onExpensiveRemat(BlockFreqRelativeToEntrypoint);
106 }
107 } else if (MI.mayLoad() && MI.mayStore()) {
108 MBBScore.onLoadStore(BlockFreqRelativeToEntrypoint);
109 } else if (MI.mayLoad()) {
110 MBBScore.onLoad(BlockFreqRelativeToEntrypoint);
111 } else if (MI.mayStore()) {
112 MBBScore.onStore(BlockFreqRelativeToEntrypoint);
113 }
114 }
115 Total += MBBScore;
116 }
117 return Total;
118}
MachineBasicBlock & MBB
std::optional< std::vector< StOtherPiece > > Other
Definition: ELFYAML.cpp:1313
IRTranslator LLVM IR MI
cl::opt< double > CheapRematWeight("regalloc-cheap-remat-weight", cl::init(0.2), cl::Hidden)
cl::opt< double > StoreWeight("regalloc-store-weight", cl::init(1.0), cl::Hidden)
cl::opt< double > CopyWeight("regalloc-copy-weight", cl::init(0.2), cl::Hidden)
cl::opt< double > ExpensiveRematWeight("regalloc-expensive-remat-weight", cl::init(1.0), cl::Hidden)
cl::opt< double > LoadWeight("regalloc-load-weight", cl::init(4.0), cl::Hidden)
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
double getBlockFreqRelativeToEntryBlock(const MachineBasicBlock *MBB) const
Compute the frequency of the block, relative to the entry block.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Representation of each machine instruction.
Definition: MachineInstr.h:69
Regalloc score.
Definition: RegAllocScore.h:28
bool operator==(const RegAllocScore &Other) const
double copyCounts() const
Definition: RegAllocScore.h:40
void onLoadStore(double Freq)
Definition: RegAllocScore.h:50
RegAllocScore & operator+=(const RegAllocScore &Other)
void onCheapRemat(double Freq)
Definition: RegAllocScore.h:52
bool operator!=(const RegAllocScore &Other) const
double cheapRematCounts() const
Definition: RegAllocScore.h:45
void onStore(double Freq)
Definition: RegAllocScore.h:49
double storeCounts() const
Definition: RegAllocScore.h:42
double getScore() const
void onExpensiveRemat(double Freq)
Definition: RegAllocScore.h:51
double expensiveRematCounts() const
Definition: RegAllocScore.h:44
void onCopy(double Freq)
Definition: RegAllocScore.h:47
double loadStoreCounts() const
Definition: RegAllocScore.h:43
void onLoad(double Freq)
Definition: RegAllocScore.h:48
double loadCounts() const
Definition: RegAllocScore.h:41
bool isTriviallyReMaterializable(const MachineInstr &MI) const
Return true if the instruction is trivially rematerializable, meaning it has no side effects and requ...
virtual const TargetInstrInfo * getInstrInfo() const
An efficient, type-erasing, non-owning reference to a callable.
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
RegAllocScore calculateRegAllocScore(const MachineFunction &MF, const MachineBlockFrequencyInfo &MBFI)
Calculate a score.
@ Other
Any other memory.