Skip to content

Commit 56fc9f4

Browse files
committed
AMDGPU/NewPM: Port AMDGPULateCodeGenPrepare to new pass manager
1 parent 0a6b6ee commit 56fc9f4

File tree

5 files changed

+88
-47
lines changed

5 files changed

+88
-47
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
namespace llvm {
1919

2020
class AMDGPUTargetMachine;
21+
class GCNTargetMachine;
2122
class TargetMachine;
2223

2324
// GlobalISel passes
@@ -54,7 +55,7 @@ FunctionPass *createSIPostRABundlerPass();
5455
FunctionPass *createAMDGPUImageIntrinsicOptimizerPass(const TargetMachine *);
5556
ModulePass *createAMDGPURemoveIncompatibleFunctionsPass(const TargetMachine *);
5657
FunctionPass *createAMDGPUCodeGenPreparePass();
57-
FunctionPass *createAMDGPULateCodeGenPreparePass();
58+
FunctionPass *createAMDGPULateCodeGenPrepareLegacyPass();
5859
FunctionPass *createAMDGPUMachineCFGStructurizerPass();
5960
FunctionPass *createAMDGPURewriteOutArgumentsPass();
6061
ModulePass *
@@ -273,6 +274,16 @@ class AMDGPUCodeGenPreparePass
273274
PreservedAnalyses run(Function &, FunctionAnalysisManager &);
274275
};
275276

277+
class AMDGPULateCodeGenPreparePass
278+
: public PassInfoMixin<AMDGPULateCodeGenPreparePass> {
279+
private:
280+
const GCNTargetMachine &TM;
281+
282+
public:
283+
AMDGPULateCodeGenPreparePass(const GCNTargetMachine &TM) : TM(TM) {};
284+
PreservedAnalyses run(Function &, FunctionAnalysisManager &);
285+
};
286+
276287
class AMDGPULowerKernelArgumentsPass
277288
: public PassInfoMixin<AMDGPULowerKernelArgumentsPass> {
278289
private:
@@ -329,8 +340,8 @@ extern char &AMDGPUCodeGenPrepareID;
329340
void initializeAMDGPURemoveIncompatibleFunctionsPass(PassRegistry &);
330341
extern char &AMDGPURemoveIncompatibleFunctionsID;
331342

332-
void initializeAMDGPULateCodeGenPreparePass(PassRegistry &);
333-
extern char &AMDGPULateCodeGenPrepareID;
343+
void initializeAMDGPULateCodeGenPrepareLegacyPass(PassRegistry &);
344+
extern char &AMDGPULateCodeGenPrepareLegacyID;
334345

335346
FunctionPass *createAMDGPURewriteUndefForPHILegacyPass();
336347
void initializeAMDGPURewriteUndefForPHILegacyPass(PassRegistry &);

llvm/lib/Target/AMDGPU/AMDGPULateCodeGenPrepare.cpp

Lines changed: 68 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -42,35 +42,21 @@ static cl::opt<bool>
4242
namespace {
4343

4444
class AMDGPULateCodeGenPrepare
45-
: public FunctionPass,
46-
public InstVisitor<AMDGPULateCodeGenPrepare, bool> {
45+
: public InstVisitor<AMDGPULateCodeGenPrepare, bool> {
4746
Module *Mod = nullptr;
4847
const DataLayout *DL = nullptr;
48+
const GCNSubtarget &ST;
4949

5050
AssumptionCache *AC = nullptr;
5151
UniformityInfo *UA = nullptr;
5252

5353
SmallVector<WeakTrackingVH, 8> DeadInsts;
5454

5555
public:
56-
static char ID;
57-
58-
AMDGPULateCodeGenPrepare() : FunctionPass(ID) {}
59-
60-
StringRef getPassName() const override {
61-
return "AMDGPU IR late optimizations";
62-
}
63-
64-
void getAnalysisUsage(AnalysisUsage &AU) const override {
65-
AU.addRequired<TargetPassConfig>();
66-
AU.addRequired<AssumptionCacheTracker>();
67-
AU.addRequired<UniformityInfoWrapperPass>();
68-
AU.setPreservesAll();
69-
}
70-
71-
bool doInitialization(Module &M) override;
72-
bool runOnFunction(Function &F) override;
73-
56+
AMDGPULateCodeGenPrepare(Module &M, const GCNSubtarget &ST,
57+
AssumptionCache *AC, UniformityInfo *UA)
58+
: Mod(&M), DL(&M.getDataLayout()), ST(ST), AC(AC), UA(UA) {}
59+
bool run(Function &F);
7460
bool visitInstruction(Instruction &) { return false; }
7561

7662
// Check if the specified value is at least DWORD aligned.
@@ -148,23 +134,7 @@ class LiveRegOptimizer {
148134

149135
} // end anonymous namespace
150136

151-
bool AMDGPULateCodeGenPrepare::doInitialization(Module &M) {
152-
Mod = &M;
153-
DL = &Mod->getDataLayout();
154-
return false;
155-
}
156-
157-
bool AMDGPULateCodeGenPrepare::runOnFunction(Function &F) {
158-
if (skipFunction(F))
159-
return false;
160-
161-
const TargetPassConfig &TPC = getAnalysis<TargetPassConfig>();
162-
const TargetMachine &TM = TPC.getTM<TargetMachine>();
163-
const GCNSubtarget &ST = TM.getSubtarget<GCNSubtarget>(F);
164-
165-
AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
166-
UA = &getAnalysis<UniformityInfoWrapperPass>().getUniformityInfo();
167-
137+
bool AMDGPULateCodeGenPrepare::run(Function &F) {
168138
// "Optimize" the virtual regs that cross basic block boundaries. When
169139
// building the SelectionDAG, vectors of illegal types that cross basic blocks
170140
// will be scalarized and widened, with each scalar living in its
@@ -505,16 +475,72 @@ bool AMDGPULateCodeGenPrepare::visitLoadInst(LoadInst &LI) {
505475
return true;
506476
}
507477

508-
INITIALIZE_PASS_BEGIN(AMDGPULateCodeGenPrepare, DEBUG_TYPE,
478+
PreservedAnalyses
479+
AMDGPULateCodeGenPreparePass::run(Function &F, FunctionAnalysisManager &FAM) {
480+
const GCNSubtarget &ST = TM.getSubtarget<GCNSubtarget>(F);
481+
482+
AssumptionCache &AC = FAM.getResult<AssumptionAnalysis>(F);
483+
UniformityInfo &UI = FAM.getResult<UniformityInfoAnalysis>(F);
484+
485+
AMDGPULateCodeGenPrepare Impl(*F.getParent(), ST, &AC, &UI);
486+
487+
bool Changed = Impl.run(F);
488+
489+
PreservedAnalyses PA = PreservedAnalyses::none();
490+
if (!Changed)
491+
return PA;
492+
PA.preserveSet<CFGAnalyses>();
493+
return PA;
494+
}
495+
496+
class AMDGPULateCodeGenPrepareLegacy : public FunctionPass {
497+
public:
498+
static char ID;
499+
500+
AMDGPULateCodeGenPrepareLegacy() : FunctionPass(ID) {}
501+
502+
StringRef getPassName() const override {
503+
return "AMDGPU IR late optimizations";
504+
}
505+
506+
void getAnalysisUsage(AnalysisUsage &AU) const override {
507+
AU.addRequired<TargetPassConfig>();
508+
AU.addRequired<AssumptionCacheTracker>();
509+
AU.addRequired<UniformityInfoWrapperPass>();
510+
AU.setPreservesAll();
511+
}
512+
513+
bool runOnFunction(Function &F) override;
514+
};
515+
516+
bool AMDGPULateCodeGenPrepareLegacy::runOnFunction(Function &F) {
517+
if (skipFunction(F))
518+
return false;
519+
520+
const TargetPassConfig &TPC = getAnalysis<TargetPassConfig>();
521+
const TargetMachine &TM = TPC.getTM<TargetMachine>();
522+
const GCNSubtarget &ST = TM.getSubtarget<GCNSubtarget>(F);
523+
524+
AssumptionCache &AC =
525+
getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
526+
UniformityInfo &UI =
527+
getAnalysis<UniformityInfoWrapperPass>().getUniformityInfo();
528+
529+
AMDGPULateCodeGenPrepare Impl(*F.getParent(), ST, &AC, &UI);
530+
531+
return Impl.run(F);
532+
}
533+
534+
INITIALIZE_PASS_BEGIN(AMDGPULateCodeGenPrepareLegacy, DEBUG_TYPE,
509535
"AMDGPU IR late optimizations", false, false)
510536
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
511537
INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
512538
INITIALIZE_PASS_DEPENDENCY(UniformityInfoWrapperPass)
513-
INITIALIZE_PASS_END(AMDGPULateCodeGenPrepare, DEBUG_TYPE,
539+
INITIALIZE_PASS_END(AMDGPULateCodeGenPrepareLegacy, DEBUG_TYPE,
514540
"AMDGPU IR late optimizations", false, false)
515541

516-
char AMDGPULateCodeGenPrepare::ID = 0;
542+
char AMDGPULateCodeGenPrepareLegacy::ID = 0;
517543

518-
FunctionPass *llvm::createAMDGPULateCodeGenPreparePass() {
519-
return new AMDGPULateCodeGenPrepare();
544+
FunctionPass *llvm::createAMDGPULateCodeGenPrepareLegacyPass() {
545+
return new AMDGPULateCodeGenPrepareLegacy();
520546
}

llvm/lib/Target/AMDGPU/AMDGPUPassRegistry.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ MODULE_PASS("amdgpu-unify-metadata", AMDGPUUnifyMetadataPass())
3535
FUNCTION_PASS("amdgpu-codegenprepare", AMDGPUCodeGenPreparePass(*this))
3636
FUNCTION_PASS("amdgpu-image-intrinsic-opt",
3737
AMDGPUImageIntrinsicOptimizerPass(*this))
38+
FUNCTION_PASS("amdgpu-late-codegenprepare",
39+
AMDGPULateCodeGenPreparePass(
40+
*static_cast<const GCNTargetMachine *>(this)))
3841
FUNCTION_PASS("amdgpu-lower-kernel-arguments",
3942
AMDGPULowerKernelArgumentsPass(*this))
4043
FUNCTION_PASS("amdgpu-lower-kernel-attributes",

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUTarget() {
432432
initializeAMDGPUPromoteAllocaPass(*PR);
433433
initializeAMDGPUPromoteAllocaToVectorPass(*PR);
434434
initializeAMDGPUCodeGenPreparePass(*PR);
435-
initializeAMDGPULateCodeGenPreparePass(*PR);
435+
initializeAMDGPULateCodeGenPrepareLegacyPass(*PR);
436436
initializeAMDGPURemoveIncompatibleFunctionsPass(*PR);
437437
initializeAMDGPULowerModuleLDSLegacyPass(*PR);
438438
initializeAMDGPULowerBufferFatPointersPass(*PR);
@@ -1207,7 +1207,7 @@ bool GCNPassConfig::addPreISel() {
12071207
addPass(createSinkingPass());
12081208

12091209
if (TM->getOptLevel() > CodeGenOptLevel::None)
1210-
addPass(createAMDGPULateCodeGenPreparePass());
1210+
addPass(createAMDGPULateCodeGenPrepareLegacyPass());
12111211

12121212
// Merge divergent exit nodes. StructurizeCFG won't recognize the multi-exit
12131213
// regions formed by them.

llvm/test/CodeGen/AMDGPU/amdgpu-late-codegenprepare.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -amdgpu-late-codegenprepare %s | FileCheck %s -check-prefix=GFX9
33
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -amdgpu-late-codegenprepare %s | FileCheck %s -check-prefix=GFX12
4+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -passes=amdgpu-late-codegenprepare %s | FileCheck %s -check-prefix=GFX9
45

56
; Make sure we don't crash when trying to create a bitcast between
67
; address spaces

0 commit comments

Comments
 (0)