Skip to content

Commit 663db5c

Browse files
authored
[AMDGPU][NewPM] Port GCNNSAReassign pass to new pass manager (#125034)
tests to be added while porting virtregrewrite and greedy regalloc
1 parent ef9f0b3 commit 663db5c

File tree

6 files changed

+93
-39
lines changed

6 files changed

+93
-39
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ ModulePass *createAMDGPUOpenCLEnqueuedBlockLoweringLegacyPass();
448448
void initializeAMDGPUOpenCLEnqueuedBlockLoweringLegacyPass(PassRegistry &);
449449
extern char &AMDGPUOpenCLEnqueuedBlockLoweringLegacyID;
450450

451-
void initializeGCNNSAReassignPass(PassRegistry &);
451+
void initializeGCNNSAReassignLegacyPass(PassRegistry &);
452452
extern char &GCNNSAReassignID;
453453

454454
void initializeGCNPreRALongBranchRegLegacyPass(PassRegistry &);

llvm/lib/Target/AMDGPU/AMDGPUPassRegistry.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ MACHINE_FUNCTION_PASS("amdgpu-isel", AMDGPUISelDAGToDAGPass(*this))
100100
MACHINE_FUNCTION_PASS("amdgpu-pre-ra-long-branch-reg", GCNPreRALongBranchRegPass())
101101
MACHINE_FUNCTION_PASS("amdgpu-rewrite-partial-reg-uses", GCNRewritePartialRegUsesPass())
102102
MACHINE_FUNCTION_PASS("amdgpu-pre-ra-optimizations", GCNPreRAOptimizationsPass())
103+
MACHINE_FUNCTION_PASS("amdgpu-nsa-reassign", GCNNSAReassignPass())
103104
MACHINE_FUNCTION_PASS("gcn-dpp-combine", GCNDPPCombinePass())
104105
MACHINE_FUNCTION_PASS("si-fix-sgpr-copies", SIFixSGPRCopiesPass())
105106
MACHINE_FUNCTION_PASS("si-fix-vgpr-copies", SIFixVGPRCopiesPass())
@@ -120,7 +121,6 @@ MACHINE_FUNCTION_PASS("si-wqm", SIWholeQuadModePass())
120121

121122
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
122123
DUMMY_MACHINE_FUNCTION_PASS("amdgpu-insert-delay-alu", AMDGPUInsertDelayAluPass())
123-
DUMMY_MACHINE_FUNCTION_PASS("amdgpu-nsa-reassign", GCNNSAReassignPass())
124124
DUMMY_MACHINE_FUNCTION_PASS("amdgpu-pre-ra-optimizations", GCNPreRAOptimizationsPass())
125125
DUMMY_MACHINE_FUNCTION_PASS("amdgpu-rewrite-partial-reg-uses", GCNRewritePartialRegUsesPass())
126126
DUMMY_MACHINE_FUNCTION_PASS("amdgpu-set-wave-priority", AMDGPUSetWavePriorityPass())

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "AMDGPUWaitSGPRHazards.h"
3333
#include "GCNDPPCombine.h"
3434
#include "GCNIterativeScheduler.h"
35+
#include "GCNNSAReassign.h"
3536
#include "GCNPreRALongBranchReg.h"
3637
#include "GCNPreRAOptimizations.h"
3738
#include "GCNRewritePartialRegUses.h"
@@ -550,7 +551,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUTarget() {
550551
initializeAMDGPUImageIntrinsicOptimizerPass(*PR);
551552
initializeAMDGPUPrintfRuntimeBindingPass(*PR);
552553
initializeAMDGPUResourceUsageAnalysisPass(*PR);
553-
initializeGCNNSAReassignPass(*PR);
554+
initializeGCNNSAReassignLegacyPass(*PR);
554555
initializeGCNPreRAOptimizationsLegacyPass(*PR);
555556
initializeGCNPreRALongBranchRegLegacyPass(*PR);
556557
initializeGCNRewritePartialRegUsesLegacyPass(*PR);
@@ -2112,6 +2113,12 @@ Error AMDGPUCodeGenPassBuilder::addInstSelector(AddMachinePass &addPass) const {
21122113
return Error::success();
21132114
}
21142115

2116+
void AMDGPUCodeGenPassBuilder::addPreRewrite(AddMachinePass &addPass) const {
2117+
if (EnableRegReassign) {
2118+
addPass(GCNNSAReassignPass());
2119+
}
2120+
}
2121+
21152122
void AMDGPUCodeGenPassBuilder::addMachineSSAOptimization(
21162123
AddMachinePass &addPass) const {
21172124
Base::addMachineSSAOptimization(addPass);

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ class AMDGPUCodeGenPassBuilder
177177
void addILPOpts(AddMachinePass &) const;
178178
void addAsmPrinter(AddMachinePass &, CreateMCStreamer) const;
179179
Error addInstSelector(AddMachinePass &) const;
180+
void addPreRewrite(AddMachinePass &) const;
180181
void addMachineSSAOptimization(AddMachinePass &) const;
181182
void addPostRegAlloc(AddMachinePass &) const;
182183

llvm/lib/Target/AMDGPU/GCNNSAReassign.cpp

Lines changed: 60 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
///
1414
//===----------------------------------------------------------------------===//
1515

16+
#include "GCNNSAReassign.h"
1617
#include "AMDGPU.h"
1718
#include "GCNSubtarget.h"
1819
#include "SIMachineFunctionInfo.h"
@@ -34,26 +35,12 @@ STATISTIC(NumNSAConverted,
3435
"Number of NSA instructions changed to sequential");
3536

3637
namespace {
37-
38-
class GCNNSAReassign : public MachineFunctionPass {
38+
class GCNNSAReassignImpl {
3939
public:
40-
static char ID;
41-
42-
GCNNSAReassign() : MachineFunctionPass(ID) {
43-
initializeGCNNSAReassignPass(*PassRegistry::getPassRegistry());
44-
}
45-
46-
bool runOnMachineFunction(MachineFunction &MF) override;
40+
GCNNSAReassignImpl(VirtRegMap *VM, LiveRegMatrix *LM, LiveIntervals *LS)
41+
: VRM(VM), LRM(LM), LIS(LS) {}
4742

48-
StringRef getPassName() const override { return "GCN NSA Reassign"; }
49-
50-
void getAnalysisUsage(AnalysisUsage &AU) const override {
51-
AU.addRequired<LiveIntervalsWrapperPass>();
52-
AU.addRequired<VirtRegMapWrapperLegacy>();
53-
AU.addRequired<LiveRegMatrixWrapperLegacy>();
54-
AU.setPreservesAll();
55-
MachineFunctionPass::getAnalysisUsage(AU);
56-
}
43+
bool run(MachineFunction &MF);
5744

5845
private:
5946
using NSA_Status = enum {
@@ -90,24 +77,43 @@ class GCNNSAReassign : public MachineFunctionPass {
9077
bool scavengeRegs(SmallVectorImpl<LiveInterval *> &Intervals) const;
9178
};
9279

80+
class GCNNSAReassignLegacy : public MachineFunctionPass {
81+
public:
82+
static char ID;
83+
84+
GCNNSAReassignLegacy() : MachineFunctionPass(ID) {
85+
initializeGCNNSAReassignLegacyPass(*PassRegistry::getPassRegistry());
86+
}
87+
88+
bool runOnMachineFunction(MachineFunction &MF) override;
89+
90+
StringRef getPassName() const override { return "GCN NSA Reassign"; };
91+
92+
void getAnalysisUsage(AnalysisUsage &AU) const override {
93+
AU.addRequired<LiveIntervalsWrapperPass>();
94+
AU.addRequired<VirtRegMapWrapperLegacy>();
95+
AU.addRequired<LiveRegMatrixWrapperLegacy>();
96+
AU.setPreservesAll();
97+
MachineFunctionPass::getAnalysisUsage(AU);
98+
}
99+
};
100+
93101
} // End anonymous namespace.
94102

95-
INITIALIZE_PASS_BEGIN(GCNNSAReassign, DEBUG_TYPE, "GCN NSA Reassign",
103+
INITIALIZE_PASS_BEGIN(GCNNSAReassignLegacy, DEBUG_TYPE, "GCN NSA Reassign",
96104
false, false)
97105
INITIALIZE_PASS_DEPENDENCY(LiveIntervalsWrapperPass)
98106
INITIALIZE_PASS_DEPENDENCY(VirtRegMapWrapperLegacy)
99107
INITIALIZE_PASS_DEPENDENCY(LiveRegMatrixWrapperLegacy)
100-
INITIALIZE_PASS_END(GCNNSAReassign, DEBUG_TYPE, "GCN NSA Reassign",
101-
false, false)
102-
108+
INITIALIZE_PASS_END(GCNNSAReassignLegacy, DEBUG_TYPE, "GCN NSA Reassign", false,
109+
false)
103110

104-
char GCNNSAReassign::ID = 0;
111+
char GCNNSAReassignLegacy::ID = 0;
105112

106-
char &llvm::GCNNSAReassignID = GCNNSAReassign::ID;
113+
char &llvm::GCNNSAReassignID = GCNNSAReassignLegacy::ID;
107114

108-
bool
109-
GCNNSAReassign::tryAssignRegisters(SmallVectorImpl<LiveInterval *> &Intervals,
110-
unsigned StartReg) const {
115+
bool GCNNSAReassignImpl::tryAssignRegisters(
116+
SmallVectorImpl<LiveInterval *> &Intervals, unsigned StartReg) const {
111117
unsigned NumRegs = Intervals.size();
112118

113119
for (unsigned N = 0; N < NumRegs; ++N)
@@ -124,7 +130,7 @@ GCNNSAReassign::tryAssignRegisters(SmallVectorImpl<LiveInterval *> &Intervals,
124130
return true;
125131
}
126132

127-
bool GCNNSAReassign::canAssign(unsigned StartReg, unsigned NumRegs) const {
133+
bool GCNNSAReassignImpl::canAssign(unsigned StartReg, unsigned NumRegs) const {
128134
for (unsigned N = 0; N < NumRegs; ++N) {
129135
unsigned Reg = StartReg + N;
130136
if (!MRI->isAllocatable(Reg))
@@ -139,8 +145,8 @@ bool GCNNSAReassign::canAssign(unsigned StartReg, unsigned NumRegs) const {
139145
return true;
140146
}
141147

142-
bool
143-
GCNNSAReassign::scavengeRegs(SmallVectorImpl<LiveInterval *> &Intervals) const {
148+
bool GCNNSAReassignImpl::scavengeRegs(
149+
SmallVectorImpl<LiveInterval *> &Intervals) const {
144150
unsigned NumRegs = Intervals.size();
145151

146152
if (NumRegs > MaxNumVGPRs)
@@ -158,8 +164,8 @@ GCNNSAReassign::scavengeRegs(SmallVectorImpl<LiveInterval *> &Intervals) const {
158164
return false;
159165
}
160166

161-
GCNNSAReassign::NSA_Status
162-
GCNNSAReassign::CheckNSA(const MachineInstr &MI, bool Fast) const {
167+
GCNNSAReassignImpl::NSA_Status
168+
GCNNSAReassignImpl::CheckNSA(const MachineInstr &MI, bool Fast) const {
163169
const AMDGPU::MIMGInfo *Info = AMDGPU::getMIMGInfo(MI.getOpcode());
164170
if (!Info)
165171
return NSA_Status::NOT_NSA;
@@ -235,16 +241,13 @@ GCNNSAReassign::CheckNSA(const MachineInstr &MI, bool Fast) const {
235241
return NSA ? NSA_Status::NON_CONTIGUOUS : NSA_Status::CONTIGUOUS;
236242
}
237243

238-
bool GCNNSAReassign::runOnMachineFunction(MachineFunction &MF) {
244+
bool GCNNSAReassignImpl::run(MachineFunction &MF) {
239245
ST = &MF.getSubtarget<GCNSubtarget>();
240246
if (!ST->hasNSAEncoding() || !ST->hasNonNSAEncoding())
241247
return false;
242248

243249
MRI = &MF.getRegInfo();
244250
TRI = ST->getRegisterInfo();
245-
VRM = &getAnalysis<VirtRegMapWrapperLegacy>().getVRM();
246-
LRM = &getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM();
247-
LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
248251

249252
const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
250253
MaxNumVGPRs = ST->getMaxNumVGPRs(MF);
@@ -367,3 +370,24 @@ bool GCNNSAReassign::runOnMachineFunction(MachineFunction &MF) {
367370

368371
return Changed;
369372
}
373+
374+
bool GCNNSAReassignLegacy::runOnMachineFunction(MachineFunction &MF) {
375+
auto *VRM = &getAnalysis<VirtRegMapWrapperLegacy>().getVRM();
376+
auto *LRM = &getAnalysis<LiveRegMatrixWrapperLegacy>().getLRM();
377+
auto *LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
378+
379+
GCNNSAReassignImpl Impl(VRM, LRM, LIS);
380+
return Impl.run(MF);
381+
}
382+
383+
PreservedAnalyses
384+
GCNNSAReassignPass::run(MachineFunction &MF,
385+
MachineFunctionAnalysisManager &MFAM) {
386+
auto &VRM = MFAM.getResult<VirtRegMapAnalysis>(MF);
387+
auto &LRM = MFAM.getResult<LiveRegMatrixAnalysis>(MF);
388+
auto &LIS = MFAM.getResult<LiveIntervalsAnalysis>(MF);
389+
390+
GCNNSAReassignImpl Impl(&VRM, &LRM, &LIS);
391+
Impl.run(MF);
392+
return PreservedAnalyses::all();
393+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//===- GCNNSAReassign.h -----------------------------------------*- 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+
#ifndef LLVM_LIB_TARGET_AMDGPU_GCNNSAREASSIGN_H
10+
#define LLVM_LIB_TARGET_AMDGPU_GCNNSAREASSIGN_H
11+
12+
#include "llvm/CodeGen/MachinePassManager.h"
13+
14+
namespace llvm {
15+
class GCNNSAReassignPass : public PassInfoMixin<GCNNSAReassignPass> {
16+
public:
17+
PreservedAnalyses run(MachineFunction &MF,
18+
MachineFunctionAnalysisManager &MFAM);
19+
};
20+
} // namespace llvm
21+
22+
#endif // LLVM_LIB_TARGET_AMDGPU_GCNNSAREASSIGN_H

0 commit comments

Comments
 (0)