Skip to content

Commit 20d5538

Browse files
committed
AMDGPU/NewPM: Port AMDGPULateCodeGenPrepare to new pass manager
1 parent 27fade6 commit 20d5538

File tree

5 files changed

+87
-47
lines changed

5 files changed

+87
-47
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.h

+13-3
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ FunctionPass *createSIPostRABundlerPass();
5656
FunctionPass *createAMDGPUImageIntrinsicOptimizerPass(const TargetMachine *);
5757
ModulePass *createAMDGPURemoveIncompatibleFunctionsPass(const TargetMachine *);
5858
FunctionPass *createAMDGPUCodeGenPreparePass();
59-
FunctionPass *createAMDGPULateCodeGenPreparePass();
59+
FunctionPass *createAMDGPULateCodeGenPrepareLegacyPass();
6060
FunctionPass *createAMDGPUMachineCFGStructurizerPass();
6161
FunctionPass *createAMDGPURewriteOutArgumentsPass();
6262
ModulePass *
@@ -282,6 +282,16 @@ class AMDGPUCodeGenPreparePass
282282
PreservedAnalyses run(Function &, FunctionAnalysisManager &);
283283
};
284284

285+
class AMDGPULateCodeGenPreparePass
286+
: public PassInfoMixin<AMDGPULateCodeGenPreparePass> {
287+
private:
288+
const GCNTargetMachine &TM;
289+
290+
public:
291+
AMDGPULateCodeGenPreparePass(const GCNTargetMachine &TM) : TM(TM) {};
292+
PreservedAnalyses run(Function &, FunctionAnalysisManager &);
293+
};
294+
285295
class AMDGPULowerKernelArgumentsPass
286296
: public PassInfoMixin<AMDGPULowerKernelArgumentsPass> {
287297
private:
@@ -352,8 +362,8 @@ extern char &AMDGPUCodeGenPrepareID;
352362
void initializeAMDGPURemoveIncompatibleFunctionsPass(PassRegistry &);
353363
extern char &AMDGPURemoveIncompatibleFunctionsID;
354364

355-
void initializeAMDGPULateCodeGenPreparePass(PassRegistry &);
356-
extern char &AMDGPULateCodeGenPrepareID;
365+
void initializeAMDGPULateCodeGenPrepareLegacyPass(PassRegistry &);
366+
extern char &AMDGPULateCodeGenPrepareLegacyID;
357367

358368
FunctionPass *createAMDGPURewriteUndefForPHILegacyPass();
359369
void initializeAMDGPURewriteUndefForPHILegacyPass(PassRegistry &);

llvm/lib/Target/AMDGPU/AMDGPULateCodeGenPrepare.cpp

+68-42
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

+3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ FUNCTION_PASS("amdgpu-annotate-uniform", AMDGPUAnnotateUniformValuesPass())
4646
FUNCTION_PASS("amdgpu-codegenprepare", AMDGPUCodeGenPreparePass(*this))
4747
FUNCTION_PASS("amdgpu-image-intrinsic-opt",
4848
AMDGPUImageIntrinsicOptimizerPass(*this))
49+
FUNCTION_PASS("amdgpu-late-codegenprepare",
50+
AMDGPULateCodeGenPreparePass(
51+
*static_cast<const GCNTargetMachine *>(this)))
4952
FUNCTION_PASS("amdgpu-lower-kernel-arguments",
5053
AMDGPULowerKernelArgumentsPass(*this))
5154
FUNCTION_PASS("amdgpu-lower-kernel-attributes",

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUTarget() {
428428
initializeAMDGPUPromoteAllocaPass(*PR);
429429
initializeAMDGPUPromoteAllocaToVectorPass(*PR);
430430
initializeAMDGPUCodeGenPreparePass(*PR);
431-
initializeAMDGPULateCodeGenPreparePass(*PR);
431+
initializeAMDGPULateCodeGenPrepareLegacyPass(*PR);
432432
initializeAMDGPURemoveIncompatibleFunctionsPass(*PR);
433433
initializeAMDGPULowerModuleLDSLegacyPass(*PR);
434434
initializeAMDGPULowerBufferFatPointersPass(*PR);
@@ -1227,7 +1227,7 @@ bool GCNPassConfig::addPreISel() {
12271227
addPass(createSinkingPass());
12281228

12291229
if (TM->getOptLevel() > CodeGenOptLevel::None)
1230-
addPass(createAMDGPULateCodeGenPreparePass());
1230+
addPass(createAMDGPULateCodeGenPrepareLegacyPass());
12311231

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

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

+1
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)