Skip to content

Commit f4a57a0

Browse files
committed
[CodeGen] Add MachineRegisterClassInfo analysis pass
Which is a wrapper of `RegisterClassInfo`. This can cache the result of `RegisterClassInfo` and hence we can reduce compile time.
1 parent f421a7a commit f4a57a0

15 files changed

+130
-4
lines changed

Diff for: llvm/include/llvm/CodeGen/MachineRegisterClassInfo.h

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//=- MachineRegisterClassInfo.h - Machine Register Class Info -----*- 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+
//
9+
// This analysis calculates register class info via RegisterClassInfo.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef LLVM_CODEGEN_MACHINEREGISTERCLASSINFO_H
14+
#define LLVM_CODEGEN_MACHINEREGISTERCLASSINFO_H
15+
16+
#include "llvm/CodeGen/MachineFunctionPass.h"
17+
#include "llvm/CodeGen/MachinePassManager.h"
18+
#include "llvm/CodeGen/RegisterClassInfo.h"
19+
#include "llvm/Pass.h"
20+
21+
namespace llvm {
22+
23+
class MachineRegisterClassInfoAnalysis
24+
: public AnalysisInfoMixin<MachineRegisterClassInfoAnalysis> {
25+
friend AnalysisInfoMixin<MachineRegisterClassInfoAnalysis>;
26+
27+
static AnalysisKey Key;
28+
29+
public:
30+
using Result = RegisterClassInfo;
31+
32+
Result run(MachineFunction &, MachineFunctionAnalysisManager &);
33+
};
34+
35+
class MachineRegisterClassInfoWrapperPass : public MachineFunctionPass {
36+
virtual void anchor();
37+
38+
RegisterClassInfo RCI;
39+
40+
public:
41+
static char ID;
42+
43+
MachineRegisterClassInfoWrapperPass();
44+
45+
void getAnalysisUsage(AnalysisUsage &AU) const override {
46+
AU.setPreservesAll();
47+
MachineFunctionPass::getAnalysisUsage(AU);
48+
}
49+
50+
bool runOnMachineFunction(MachineFunction &MF) override;
51+
52+
RegisterClassInfo &getRCI() { return RCI; }
53+
const RegisterClassInfo &getMBPI() const { return RCI; }
54+
};
55+
} // namespace llvm
56+
57+
#endif

Diff for: llvm/include/llvm/InitializePasses.h

+1
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ void initializeMachineOutlinerPass(PassRegistry &);
208208
void initializeMachinePipelinerPass(PassRegistry &);
209209
void initializeMachinePostDominatorTreeWrapperPassPass(PassRegistry &);
210210
void initializeMachineRegionInfoPassPass(PassRegistry &);
211+
void initializeMachineRegisterClassInfoWrapperPassPass(PassRegistry &);
211212
void initializeMachineSanitizerBinaryMetadataPass(PassRegistry &);
212213
void initializeMachineSchedulerPass(PassRegistry &);
213214
void initializeMachineSinkingPass(PassRegistry &);

Diff for: llvm/include/llvm/Passes/MachinePassRegistry.def

+2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ MACHINE_FUNCTION_ANALYSIS("machine-opt-remark-emitter",
112112
MachineOptimizationRemarkEmitterAnalysis())
113113
MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree",
114114
MachinePostDominatorTreeAnalysis())
115+
MACHINE_FUNCTION_ANALYSIS("machine-reg-class-info",
116+
MachineRegisterClassInfoAnalysis())
115117
MACHINE_FUNCTION_ANALYSIS("machine-trace-metrics", MachineTraceMetricsAnalysis())
116118
MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC))
117119
MACHINE_FUNCTION_ANALYSIS("slot-indexes", SlotIndexesAnalysis())

Diff for: llvm/lib/CodeGen/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ add_llvm_component_library(LLVMCodeGen
142142
MachinePipeliner.cpp
143143
MachinePostDominators.cpp
144144
MachineRegionInfo.cpp
145+
MachineRegisterClassInfo.cpp
145146
MachineRegisterInfo.cpp
146147
MachineScheduler.cpp
147148
MachineSink.cpp

Diff for: llvm/lib/CodeGen/MachineLICM.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "llvm/CodeGen/MachineLoopInfo.h"
3434
#include "llvm/CodeGen/MachineMemOperand.h"
3535
#include "llvm/CodeGen/MachineOperand.h"
36+
#include "llvm/CodeGen/MachineRegisterClassInfo.h"
3637
#include "llvm/CodeGen/MachineRegisterInfo.h"
3738
#include "llvm/CodeGen/PseudoSourceValue.h"
3839
#include "llvm/CodeGen/TargetInstrInfo.h"

Diff for: llvm/lib/CodeGen/MachineRegisterClassInfo.cpp

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//===- MachineRegisterClassInfo.cpp - Machine Register Class Info ---------===//
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+
//
9+
// This analysis calculates register class info via RegisterClassInfo.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#include "llvm/CodeGen/MachineRegisterClassInfo.h"
14+
#include "llvm/CodeGen/RegisterClassInfo.h"
15+
#include "llvm/InitializePasses.h"
16+
17+
using namespace llvm;
18+
19+
INITIALIZE_PASS_BEGIN(MachineRegisterClassInfoWrapperPass,
20+
"machine-reg-class-info",
21+
"Machine Register Class Info Analysis", false, true)
22+
INITIALIZE_PASS_END(MachineRegisterClassInfoWrapperPass,
23+
"machine-reg-class-info",
24+
"Machine Register Class Info Analysis", false, true)
25+
26+
MachineRegisterClassInfoAnalysis::Result
27+
MachineRegisterClassInfoAnalysis::run(MachineFunction &MF,
28+
MachineFunctionAnalysisManager &) {
29+
RegisterClassInfo RCI;
30+
RCI.runOnMachineFunction(MF);
31+
return RCI;
32+
}
33+
34+
char MachineRegisterClassInfoWrapperPass::ID = 0;
35+
36+
MachineRegisterClassInfoWrapperPass::MachineRegisterClassInfoWrapperPass()
37+
: MachineFunctionPass(ID), RCI() {
38+
PassRegistry &Registry = *PassRegistry::getPassRegistry();
39+
initializeMachineRegisterClassInfoWrapperPassPass(Registry);
40+
}
41+
42+
bool MachineRegisterClassInfoWrapperPass::runOnMachineFunction(
43+
MachineFunction &MF) {
44+
RCI.runOnMachineFunction(MF);
45+
return false;
46+
}
47+
48+
void MachineRegisterClassInfoWrapperPass::anchor() {}
49+
50+
AnalysisKey MachineRegisterClassInfoAnalysis::Key;

Diff for: llvm/lib/CodeGen/MachineSink.cpp

+7-4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "llvm/CodeGen/MachineLoopInfo.h"
3939
#include "llvm/CodeGen/MachineOperand.h"
4040
#include "llvm/CodeGen/MachinePostDominators.h"
41+
#include "llvm/CodeGen/MachineRegisterClassInfo.h"
4142
#include "llvm/CodeGen/MachineRegisterInfo.h"
4243
#include "llvm/CodeGen/MachineSizeOpts.h"
4344
#include "llvm/CodeGen/RegisterClassInfo.h"
@@ -127,7 +128,7 @@ class MachineSinking : public MachineFunctionPass {
127128
MachineBlockFrequencyInfo *MBFI = nullptr;
128129
const MachineBranchProbabilityInfo *MBPI = nullptr;
129130
AliasAnalysis *AA = nullptr;
130-
RegisterClassInfo RegClassInfo;
131+
RegisterClassInfo *RegClassInfo = nullptr;
131132

132133
// Remember which edges have been considered for breaking.
133134
SmallSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>, 8>
@@ -200,6 +201,7 @@ class MachineSinking : public MachineFunctionPass {
200201
AU.addRequired<MachineBranchProbabilityInfoWrapperPass>();
201202
AU.addPreserved<MachineCycleInfoWrapperPass>();
202203
AU.addPreserved<MachineLoopInfoWrapperPass>();
204+
AU.addRequired<MachineRegisterClassInfoWrapperPass>();
203205
AU.addRequired<ProfileSummaryInfoWrapperPass>();
204206
if (UseBlockFreqInfo)
205207
AU.addRequired<MachineBlockFrequencyInfoWrapperPass>();
@@ -290,6 +292,7 @@ INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
290292
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
291293
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
292294
INITIALIZE_PASS_DEPENDENCY(MachineCycleInfoWrapperPass)
295+
INITIALIZE_PASS_DEPENDENCY(MachineRegisterClassInfoWrapperPass)
293296
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
294297
INITIALIZE_PASS_END(MachineSinking, DEBUG_TYPE, "Machine code sinking", false,
295298
false)
@@ -731,7 +734,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
731734
: nullptr;
732735
MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
733736
AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
734-
RegClassInfo.runOnMachineFunction(MF);
737+
RegClassInfo = &getAnalysis<MachineRegisterClassInfoWrapperPass>().getRCI();
735738
TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
736739
EnableSinkAndFold = PassConfig->getEnableSinkAndFold();
737740

@@ -1068,7 +1071,7 @@ MachineSinking::getBBRegisterPressure(const MachineBasicBlock &MBB) {
10681071
RegPressureTracker RPTracker(Pressure);
10691072

10701073
// Initialize the register pressure tracker.
1071-
RPTracker.init(MBB.getParent(), &RegClassInfo, nullptr, &MBB, MBB.end(),
1074+
RPTracker.init(MBB.getParent(), RegClassInfo, nullptr, &MBB, MBB.end(),
10721075
/*TrackLaneMasks*/ false, /*TrackUntiedDefs=*/true);
10731076

10741077
for (MachineBasicBlock::const_iterator MII = MBB.instr_end(),
@@ -1098,7 +1101,7 @@ bool MachineSinking::registerPressureSetExceedsLimit(
10981101
std::vector<unsigned> BBRegisterPressure = getBBRegisterPressure(MBB);
10991102
for (; *PS != -1; PS++)
11001103
if (Weight + BBRegisterPressure[*PS] >=
1101-
RegClassInfo.getRegPressureSetLimit(*PS))
1104+
RegClassInfo->getRegPressureSetLimit(*PS))
11021105
return true;
11031106
return false;
11041107
}

Diff for: llvm/lib/Passes/PassBuilder.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
117117
#include "llvm/CodeGen/MachinePassManager.h"
118118
#include "llvm/CodeGen/MachinePostDominators.h"
119+
#include "llvm/CodeGen/MachineRegisterClassInfo.h"
119120
#include "llvm/CodeGen/MachineRegisterInfo.h"
120121
#include "llvm/CodeGen/MachineTraceMetrics.h"
121122
#include "llvm/CodeGen/MachineVerifier.h"

Diff for: llvm/test/CodeGen/AArch64/O3-pipeline.ll

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
; CHECK-NEXT: Machine Common Subexpression Elimination
155155
; CHECK-NEXT: MachinePostDominator Tree Construction
156156
; CHECK-NEXT: Machine Cycle Info Analysis
157+
; CHECK-NEXT: Machine Register Class Info Analysis
157158
; CHECK-NEXT: Machine code sinking
158159
; CHECK-NEXT: Peephole Optimizations
159160
; CHECK-NEXT: Remove dead machine instructions

Diff for: llvm/test/CodeGen/AMDGPU/llc-pipeline.ll

+4
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@
322322
; GCN-O1-NEXT: Machine Common Subexpression Elimination
323323
; GCN-O1-NEXT: MachinePostDominator Tree Construction
324324
; GCN-O1-NEXT: Machine Cycle Info Analysis
325+
; GCN-O1-NEXT: Machine Register Class Info Analysis
325326
; GCN-O1-NEXT: Machine code sinking
326327
; GCN-O1-NEXT: Peephole Optimizations
327328
; GCN-O1-NEXT: Remove dead machine instructions
@@ -622,6 +623,7 @@
622623
; GCN-O1-OPTS-NEXT: Machine Common Subexpression Elimination
623624
; GCN-O1-OPTS-NEXT: MachinePostDominator Tree Construction
624625
; GCN-O1-OPTS-NEXT: Machine Cycle Info Analysis
626+
; GCN-O1-OPTS-NEXT: Machine Register Class Info Analysis
625627
; GCN-O1-OPTS-NEXT: Machine code sinking
626628
; GCN-O1-OPTS-NEXT: Peephole Optimizations
627629
; GCN-O1-OPTS-NEXT: Remove dead machine instructions
@@ -935,6 +937,7 @@
935937
; GCN-O2-NEXT: Machine Common Subexpression Elimination
936938
; GCN-O2-NEXT: MachinePostDominator Tree Construction
937939
; GCN-O2-NEXT: Machine Cycle Info Analysis
940+
; GCN-O2-NEXT: Machine Register Class Info Analysis
938941
; GCN-O2-NEXT: Machine code sinking
939942
; GCN-O2-NEXT: Peephole Optimizations
940943
; GCN-O2-NEXT: Remove dead machine instructions
@@ -1262,6 +1265,7 @@
12621265
; GCN-O3-NEXT: Machine Common Subexpression Elimination
12631266
; GCN-O3-NEXT: MachinePostDominator Tree Construction
12641267
; GCN-O3-NEXT: Machine Cycle Info Analysis
1268+
; GCN-O3-NEXT: Machine Register Class Info Analysis
12651269
; GCN-O3-NEXT: Machine code sinking
12661270
; GCN-O3-NEXT: Peephole Optimizations
12671271
; GCN-O3-NEXT: Remove dead machine instructions

Diff for: llvm/test/CodeGen/ARM/O3-pipeline.ll

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
; CHECK-NEXT: Machine Common Subexpression Elimination
9898
; CHECK-NEXT: MachinePostDominator Tree Construction
9999
; CHECK-NEXT: Machine Cycle Info Analysis
100+
; CHECK-NEXT: Machine Register Class Info Analysis
100101
; CHECK-NEXT: Machine code sinking
101102
; CHECK-NEXT: Peephole Optimizations
102103
; CHECK-NEXT: Remove dead machine instructions

Diff for: llvm/test/CodeGen/LoongArch/opt-pipeline.ll

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
; LAXX-NEXT: Machine Common Subexpression Elimination
103103
; LAXX-NEXT: MachinePostDominator Tree Construction
104104
; LAXX-NEXT: Machine Cycle Info Analysis
105+
; LAXX-NEXT: Machine Register Class Info Analysis
105106
; LAXX-NEXT: Machine code sinking
106107
; LAXX-NEXT: Peephole Optimizations
107108
; LAXX-NEXT: Remove dead machine instructions

Diff for: llvm/test/CodeGen/PowerPC/O3-pipeline.ll

+1
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
; CHECK-NEXT: Machine Common Subexpression Elimination
122122
; CHECK-NEXT: MachinePostDominator Tree Construction
123123
; CHECK-NEXT: Machine Cycle Info Analysis
124+
; CHECK-NEXT: Machine Register Class Info Analysis
124125
; CHECK-NEXT: Machine code sinking
125126
; CHECK-NEXT: Peephole Optimizations
126127
; CHECK-NEXT: Remove dead machine instructions

Diff for: llvm/test/CodeGen/RISCV/O3-pipeline.ll

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
; CHECK-NEXT: Machine Common Subexpression Elimination
111111
; CHECK-NEXT: MachinePostDominator Tree Construction
112112
; CHECK-NEXT: Machine Cycle Info Analysis
113+
; CHECK-NEXT: Machine Register Class Info Analysis
113114
; CHECK-NEXT: Machine code sinking
114115
; CHECK-NEXT: Peephole Optimizations
115116
; CHECK-NEXT: Remove dead machine instructions

Diff for: llvm/test/CodeGen/X86/opt-pipeline.ll

+1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
; CHECK-NEXT: Machine Common Subexpression Elimination
115115
; CHECK-NEXT: MachinePostDominator Tree Construction
116116
; CHECK-NEXT: Machine Cycle Info Analysis
117+
; CHECK-NEXT: Machine Register Class Info Analysis
117118
; CHECK-NEXT: Machine code sinking
118119
; CHECK-NEXT: Peephole Optimizations
119120
; CHECK-NEXT: Remove dead machine instructions

0 commit comments

Comments
 (0)