Skip to content

Commit 86c55df

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 c5a491e commit 86c55df

26 files changed

+267
-68
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class MachinePipeliner : public MachineFunctionPass {
7474
const MachineDominatorTree *MDT = nullptr;
7575
const InstrItineraryData *InstrItins = nullptr;
7676
const TargetInstrInfo *TII = nullptr;
77-
RegisterClassInfo RegClassInfo;
77+
RegisterClassInfo *RegClassInfo = nullptr;
7878
bool disabledByPragma = false;
7979
unsigned II_setByPragma = 0;
8080

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 &getRCI() const { return RCI; }
54+
};
55+
} // namespace llvm
56+
57+
#endif

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

-6
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,7 @@ struct MachineSchedContext {
146146
const TargetMachine *TM = nullptr;
147147
AAResults *AA = nullptr;
148148
LiveIntervals *LIS = nullptr;
149-
150149
RegisterClassInfo *RegClassInfo;
151-
152-
MachineSchedContext();
153-
MachineSchedContext &operator=(const MachineSchedContext &other) = delete;
154-
MachineSchedContext(const MachineSchedContext &other) = delete;
155-
virtual ~MachineSchedContext();
156150
};
157151

158152
/// MachineSchedRegistry provides a selection of available machine instruction

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

+1
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ void initializeMachineOutlinerPass(PassRegistry &);
206206
void initializeMachinePipelinerPass(PassRegistry &);
207207
void initializeMachinePostDominatorTreeWrapperPassPass(PassRegistry &);
208208
void initializeMachineRegionInfoPassPass(PassRegistry &);
209+
void initializeMachineRegisterClassInfoWrapperPassPass(PassRegistry &);
209210
void initializeMachineSanitizerBinaryMetadataPass(PassRegistry &);
210211
void initializeMachineSchedulerLegacyPass(PassRegistry &);
211212
void initializeMachineSinkingLegacyPass(PassRegistry &);

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

+2
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ MACHINE_FUNCTION_ANALYSIS("machine-opt-remark-emitter",
113113
MachineOptimizationRemarkEmitterAnalysis())
114114
MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree",
115115
MachinePostDominatorTreeAnalysis())
116+
MACHINE_FUNCTION_ANALYSIS("machine-reg-class-info",
117+
MachineRegisterClassInfoAnalysis())
116118
MACHINE_FUNCTION_ANALYSIS("machine-trace-metrics", MachineTraceMetricsAnalysis())
117119
MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC))
118120
MACHINE_FUNCTION_ANALYSIS("regalloc-evict", RegAllocEvictionAdvisorAnalysis())

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

+8-5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "llvm/ADT/DepthFirstIterator.h"
2121
#include "llvm/CodeGen/LivePhysRegs.h"
2222
#include "llvm/CodeGen/MachineFunctionPass.h"
23+
#include "llvm/CodeGen/MachineRegisterClassInfo.h"
2324
#include "llvm/CodeGen/ReachingDefAnalysis.h"
2425
#include "llvm/CodeGen/RegisterClassInfo.h"
2526
#include "llvm/CodeGen/TargetInstrInfo.h"
@@ -38,7 +39,7 @@ class BreakFalseDeps : public MachineFunctionPass {
3839
MachineFunction *MF = nullptr;
3940
const TargetInstrInfo *TII = nullptr;
4041
const TargetRegisterInfo *TRI = nullptr;
41-
RegisterClassInfo RegClassInfo;
42+
RegisterClassInfo *RegClassInfo = nullptr;
4243

4344
/// List of undefined register reads in this block in forward order.
4445
std::vector<std::pair<MachineInstr *, unsigned>> UndefReads;
@@ -57,6 +58,7 @@ class BreakFalseDeps : public MachineFunctionPass {
5758

5859
void getAnalysisUsage(AnalysisUsage &AU) const override {
5960
AU.setPreservesAll();
61+
AU.addRequired<MachineRegisterClassInfoWrapperPass>();
6062
AU.addRequired<ReachingDefAnalysis>();
6163
MachineFunctionPass::getAnalysisUsage(AU);
6264
}
@@ -101,7 +103,9 @@ class BreakFalseDeps : public MachineFunctionPass {
101103
#define DEBUG_TYPE "break-false-deps"
102104

103105
char BreakFalseDeps::ID = 0;
104-
INITIALIZE_PASS_BEGIN(BreakFalseDeps, DEBUG_TYPE, "BreakFalseDeps", false, false)
106+
INITIALIZE_PASS_BEGIN(BreakFalseDeps, DEBUG_TYPE, "BreakFalseDeps", false,
107+
false)
108+
INITIALIZE_PASS_DEPENDENCY(MachineRegisterClassInfoWrapperPass)
105109
INITIALIZE_PASS_DEPENDENCY(ReachingDefAnalysis)
106110
INITIALIZE_PASS_END(BreakFalseDeps, DEBUG_TYPE, "BreakFalseDeps", false, false)
107111

@@ -153,7 +157,7 @@ bool BreakFalseDeps::pickBestRegisterForUndef(MachineInstr *MI, unsigned OpIdx,
153157
// max clearance or clearance higher than Pref.
154158
unsigned MaxClearance = 0;
155159
unsigned MaxClearanceReg = OriginalReg;
156-
ArrayRef<MCPhysReg> Order = RegClassInfo.getOrder(OpRC);
160+
ArrayRef<MCPhysReg> Order = RegClassInfo->getOrder(OpRC);
157161
for (MCPhysReg Reg : Order) {
158162
unsigned Clearance = RDA->getClearance(MI, Reg);
159163
if (Clearance <= MaxClearance)
@@ -285,8 +289,7 @@ bool BreakFalseDeps::runOnMachineFunction(MachineFunction &mf) {
285289
TII = MF->getSubtarget().getInstrInfo();
286290
TRI = MF->getSubtarget().getRegisterInfo();
287291
RDA = &getAnalysis<ReachingDefAnalysis>();
288-
289-
RegClassInfo.runOnMachineFunction(mf);
292+
RegClassInfo = &getAnalysis<MachineRegisterClassInfoWrapperPass>().getRCI();
290293

291294
LLVM_DEBUG(dbgs() << "********** BREAK FALSE DEPENDENCIES **********\n");
292295

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/MachineCombiner.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/CodeGen/MachineFunction.h"
2020
#include "llvm/CodeGen/MachineFunctionPass.h"
2121
#include "llvm/CodeGen/MachineLoopInfo.h"
22+
#include "llvm/CodeGen/MachineRegisterClassInfo.h"
2223
#include "llvm/CodeGen/MachineRegisterInfo.h"
2324
#include "llvm/CodeGen/MachineSizeOpts.h"
2425
#include "llvm/CodeGen/MachineTraceMetrics.h"
@@ -73,7 +74,7 @@ class MachineCombiner : public MachineFunctionPass {
7374
MachineTraceMetrics::Ensemble *TraceEnsemble = nullptr;
7475
MachineBlockFrequencyInfo *MBFI = nullptr;
7576
ProfileSummaryInfo *PSI = nullptr;
76-
RegisterClassInfo RegClassInfo;
77+
RegisterClassInfo *RegClassInfo = nullptr;
7778

7879
TargetSchedModel TSchedModel;
7980

@@ -130,6 +131,7 @@ char &llvm::MachineCombinerID = MachineCombiner::ID;
130131
INITIALIZE_PASS_BEGIN(MachineCombiner, DEBUG_TYPE,
131132
"Machine InstCombiner", false, false)
132133
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
134+
INITIALIZE_PASS_DEPENDENCY(MachineRegisterClassInfoWrapperPass)
133135
INITIALIZE_PASS_DEPENDENCY(MachineTraceMetricsWrapperPass)
134136
INITIALIZE_PASS_END(MachineCombiner, DEBUG_TYPE, "Machine InstCombiner",
135137
false, false)
@@ -139,6 +141,8 @@ void MachineCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
139141
AU.addPreserved<MachineDominatorTreeWrapperPass>();
140142
AU.addRequired<MachineLoopInfoWrapperPass>();
141143
AU.addPreserved<MachineLoopInfoWrapperPass>();
144+
AU.addRequired<MachineRegisterClassInfoWrapperPass>();
145+
AU.addPreserved<MachineRegisterClassInfoWrapperPass>();
142146
AU.addRequired<MachineTraceMetricsWrapperPass>();
143147
AU.addPreserved<MachineTraceMetricsWrapperPass>();
144148
AU.addRequired<LazyMachineBlockFrequencyInfoPass>();
@@ -571,7 +575,7 @@ bool MachineCombiner::combineInstructions(MachineBasicBlock *MBB) {
571575
bool OptForSize = llvm::shouldOptimizeForSize(MBB, PSI, MBFI);
572576

573577
bool DoRegPressureReduce =
574-
TII->shouldReduceRegisterPressure(MBB, &RegClassInfo);
578+
TII->shouldReduceRegisterPressure(MBB, RegClassInfo);
575579

576580
while (BlockIter != MBB->end()) {
577581
auto &MI = *BlockIter++;
@@ -730,7 +734,7 @@ bool MachineCombiner::runOnMachineFunction(MachineFunction &MF) {
730734
&getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI() :
731735
nullptr;
732736
TraceEnsemble = nullptr;
733-
RegClassInfo.runOnMachineFunction(MF);
737+
RegClassInfo = &getAnalysis<MachineRegisterClassInfoWrapperPass>().getRCI();
734738

735739
LLVM_DEBUG(dbgs() << getPassName() << ": " << MF.getName() << '\n');
736740
if (!TII->useMachineCombiner()) {

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

+8-3
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
#include "llvm/CodeGen/MachineLoopInfo.h"
5959
#include "llvm/CodeGen/MachineMemOperand.h"
6060
#include "llvm/CodeGen/MachineOperand.h"
61+
#include "llvm/CodeGen/MachineRegisterClassInfo.h"
6162
#include "llvm/CodeGen/MachineRegisterInfo.h"
6263
#include "llvm/CodeGen/ModuloSchedule.h"
6364
#include "llvm/CodeGen/Register.h"
@@ -234,6 +235,7 @@ INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
234235
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
235236
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
236237
INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass)
238+
INITIALIZE_PASS_DEPENDENCY(MachineRegisterClassInfoWrapperPass)
237239
INITIALIZE_PASS_END(MachinePipeliner, DEBUG_TYPE,
238240
"Modulo Software Pipelining", false, false)
239241

@@ -263,8 +265,8 @@ bool MachinePipeliner::runOnMachineFunction(MachineFunction &mf) {
263265
MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
264266
MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
265267
ORE = &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
268+
RegClassInfo = &getAnalysis<MachineRegisterClassInfoWrapperPass>().getRCI();
266269
TII = MF->getSubtarget().getInstrInfo();
267-
RegClassInfo.runOnMachineFunction(*MF);
268270

269271
for (const auto &L : *MLI)
270272
scheduleLoop(*L);
@@ -471,7 +473,7 @@ bool MachinePipeliner::swingModuloScheduler(MachineLoop &L) {
471473
assert(L.getBlocks().size() == 1 && "SMS works on single blocks only.");
472474

473475
SwingSchedulerDAG SMS(
474-
*this, L, getAnalysis<LiveIntervalsWrapperPass>().getLIS(), RegClassInfo,
476+
*this, L, getAnalysis<LiveIntervalsWrapperPass>().getLIS(), *RegClassInfo,
475477
II_setByPragma, LI.LoopPipelinerInfo.get());
476478

477479
MachineBasicBlock *MBB = L.getHeader();
@@ -502,6 +504,8 @@ void MachinePipeliner::getAnalysisUsage(AnalysisUsage &AU) const {
502504
AU.addRequired<MachineDominatorTreeWrapperPass>();
503505
AU.addRequired<LiveIntervalsWrapperPass>();
504506
AU.addRequired<MachineOptimizationRemarkEmitterPass>();
507+
AU.addRequired<MachineRegisterClassInfoWrapperPass>();
508+
AU.addPreserved<MachineRegisterClassInfoWrapperPass>();
505509
AU.addRequired<TargetPassConfig>();
506510
MachineFunctionPass::getAnalysisUsage(AU);
507511
}
@@ -514,7 +518,8 @@ bool MachinePipeliner::runWindowScheduler(MachineLoop &L) {
514518
Context.TM = &getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
515519
Context.AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
516520
Context.LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
517-
Context.RegClassInfo->runOnMachineFunction(*MF);
521+
Context.RegClassInfo =
522+
&getAnalysis<MachineRegisterClassInfoWrapperPass>().getRCI();
518523
WindowScheduler WS(&Context, L);
519524
return WS.run();
520525
}

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

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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(MachineRegisterClassInfoWrapperPass, "machine-reg-class-info",
20+
"Machine Register Class Info Analysis", true, true)
21+
22+
MachineRegisterClassInfoAnalysis::Result
23+
MachineRegisterClassInfoAnalysis::run(MachineFunction &MF,
24+
MachineFunctionAnalysisManager &) {
25+
RegisterClassInfo RCI;
26+
RCI.runOnMachineFunction(MF);
27+
return RCI;
28+
}
29+
30+
char MachineRegisterClassInfoWrapperPass::ID = 0;
31+
32+
MachineRegisterClassInfoWrapperPass::MachineRegisterClassInfoWrapperPass()
33+
: MachineFunctionPass(ID), RCI() {
34+
PassRegistry &Registry = *PassRegistry::getPassRegistry();
35+
initializeMachineRegisterClassInfoWrapperPassPass(Registry);
36+
}
37+
38+
bool MachineRegisterClassInfoWrapperPass::runOnMachineFunction(
39+
MachineFunction &MF) {
40+
RCI.runOnMachineFunction(MF);
41+
return false;
42+
}
43+
44+
void MachineRegisterClassInfoWrapperPass::anchor() {}
45+
46+
AnalysisKey MachineRegisterClassInfoAnalysis::Key;

0 commit comments

Comments
 (0)