Skip to content

Commit 3a6de1e

Browse files
committed
Move to CGSCC pass.
1 parent c6c4293 commit 3a6de1e

File tree

3 files changed

+51
-20
lines changed

3 files changed

+51
-20
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "llvm/CodeGen/MachinePassManager.h"
1414
#include "llvm/IR/PassManager.h"
1515
#include "llvm/Pass.h"
16+
#include "llvm/Analysis/CallGraphSCCPass.h"
1617
#include "llvm/Support/AMDGPUAddrSpace.h"
1718
#include "llvm/Support/CodeGen.h"
1819

@@ -111,7 +112,7 @@ ModulePass *createAMDGPUCtorDtorLoweringLegacyPass();
111112
void initializeAMDGPUCtorDtorLoweringLegacyPass(PassRegistry &);
112113
extern char &AMDGPUCtorDtorLoweringLegacyPassID;
113114

114-
ModulePass *createAMDGPULowerKernelArgumentsLegacyPass(const TargetMachine *TM);
115+
CallGraphSCCPass *createAMDGPULowerKernelArgumentsLegacyPass(const TargetMachine *TM);
115116
void initializeAMDGPULowerKernelArgumentsLegacyPass(PassRegistry &);
116117
extern char &AMDGPULowerKernelArgumentsLegacyPassID;
117118

llvm/lib/Target/AMDGPU/AMDGPULowerKernelArguments.cpp

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "AMDGPU.h"
1515
#include "GCNSubtarget.h"
1616
#include "llvm/ADT/StringExtras.h"
17+
#include "llvm/Analysis/CallGraph.h"
1718
#include "llvm/Analysis/ValueTracking.h"
1819
#include "llvm/CodeGen/TargetPassConfig.h"
1920
#include "llvm/IR/IRBuilder.h"
@@ -252,11 +253,21 @@ class PreloadKernelArgInfo {
252253
};
253254

254255
class AMDGPULowerKernelArguments {
255-
const TargetMachine &TM;
256-
SmallVector<Function *> FunctionsToErase;
256+
private:
257+
SmallVector<Function *, 4> FunctionsToErase;
257258

258259
public:
259-
AMDGPULowerKernelArguments(const TargetMachine &TM) : TM(TM) {}
260+
AMDGPULowerKernelArguments() {}
261+
262+
bool eraseTaggedFunctions() {
263+
if (FunctionsToErase.empty())
264+
return false;
265+
266+
for (Function *F : FunctionsToErase)
267+
F->eraseFromParent();
268+
269+
return true;
270+
}
260271

261272
// skip allocas
262273
static BasicBlock::iterator getInsertPt(BasicBlock &BB) {
@@ -273,7 +284,7 @@ class AMDGPULowerKernelArguments {
273284
return InsPt;
274285
}
275286

276-
bool lowerKernelArguments(Function &F) {
287+
bool lowerKernelArguments(Function &F, const TargetMachine &TM) {
277288
CallingConv::ID CC = F.getCallingConv();
278289
if (CC != CallingConv::AMDGPU_KERNEL || F.arg_empty())
279290
return false;
@@ -474,34 +485,53 @@ class AMDGPULowerKernelArguments {
474485
return true;
475486
}
476487

477-
bool runOnModule(Module &M) {
488+
bool runOnSCC(CallGraphSCC &SCC, const TargetMachine &TM) {
489+
bool Changed = false;
490+
for (CallGraphNode *I : SCC) {
491+
Function *F = I->getFunction();
492+
if (!F || F->isDeclaration())
493+
continue;
494+
495+
Changed |= lowerKernelArguments(*F, TM);
496+
}
497+
498+
return Changed;
499+
}
500+
501+
bool runOnModule(Module &M, const TargetMachine &TM) {
478502
bool Changed = false;
479503

480504
for (Function &F : M)
481-
Changed |= lowerKernelArguments(F);
505+
Changed |= lowerKernelArguments(F, TM);
482506

483-
for (Function *F : FunctionsToErase)
484-
F->eraseFromParent();
507+
Changed |= eraseTaggedFunctions();
485508

486509
return Changed;
487510
}
488511
};
489512

490-
class AMDGPULowerKernelArgumentsLegacy : public ModulePass {
513+
class AMDGPULowerKernelArgumentsLegacy : public CallGraphSCCPass {
514+
private:
515+
AMDGPULowerKernelArguments Impl;
516+
491517
public:
492518
static char ID;
493519
const TargetMachine *TM;
494520

495521
AMDGPULowerKernelArgumentsLegacy(const TargetMachine *TM = nullptr)
496-
: ModulePass(ID), TM(TM) {}
522+
: CallGraphSCCPass(ID), TM(TM) {}
497523

498-
bool runOnModule(Module &M) override {
524+
bool runOnSCC(CallGraphSCC &SCC) override {
499525
if (!TM) {
500526
auto &TPC = getAnalysis<TargetPassConfig>();
501527
TM = &TPC.getTM<TargetMachine>();
502528
}
503529

504-
return AMDGPULowerKernelArguments(*TM).runOnModule(M);
530+
return Impl.runOnSCC(SCC, *TM);
531+
}
532+
533+
bool doFinalization(CallGraph &CG) override {
534+
return Impl.eraseTaggedFunctions();
505535
}
506536

507537
void getAnalysisUsage(AnalysisUsage &AU) const override {
@@ -521,14 +551,14 @@ INITIALIZE_PASS_END(AMDGPULowerKernelArgumentsLegacy, DEBUG_TYPE,
521551

522552
char AMDGPULowerKernelArgumentsLegacy::ID = 0;
523553

524-
ModulePass *
554+
CallGraphSCCPass *
525555
llvm::createAMDGPULowerKernelArgumentsLegacyPass(const TargetMachine *TM) {
526556
return new AMDGPULowerKernelArgumentsLegacy(TM);
527557
}
528558

529559
PreservedAnalyses
530560
AMDGPULowerKernelArgumentsPass::run(Module &M, ModuleAnalysisManager &AM) {
531-
return AMDGPULowerKernelArguments(TM).runOnModule(M)
561+
return AMDGPULowerKernelArguments().runOnModule(M, TM)
532562
? PreservedAnalyses::none()
533563
: PreservedAnalyses::all();
534564
}

llvm/test/CodeGen/AMDGPU/llc-pipeline.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
; GCN-O0-NEXT: CallGraph Construction
5151
; GCN-O0-NEXT: Call Graph SCC Pass Manager
5252
; GCN-O0-NEXT: AMDGPU Annotate Kernel Features
53-
; GCN-O0-NEXT: AMDGPU Lower Kernel Arguments
53+
; GCN-O0-NEXT: AMDGPU Lower Kernel Arguments
5454
; GCN-O0-NEXT: Lower buffer fat pointer operations to buffer resources
5555
; GCN-O0-NEXT: CallGraph Construction
5656
; GCN-O0-NEXT: Call Graph SCC Pass Manager
@@ -229,7 +229,7 @@
229229
; GCN-O1-NEXT: CallGraph Construction
230230
; GCN-O1-NEXT: Call Graph SCC Pass Manager
231231
; GCN-O1-NEXT: AMDGPU Annotate Kernel Features
232-
; GCN-O1-NEXT: AMDGPU Lower Kernel Arguments
232+
; GCN-O1-NEXT: AMDGPU Lower Kernel Arguments
233233
; GCN-O1-NEXT: Lower buffer fat pointer operations to buffer resources
234234
; GCN-O1-NEXT: CallGraph Construction
235235
; GCN-O1-NEXT: Call Graph SCC Pass Manager
@@ -522,7 +522,7 @@
522522
; GCN-O1-OPTS-NEXT: CallGraph Construction
523523
; GCN-O1-OPTS-NEXT: Call Graph SCC Pass Manager
524524
; GCN-O1-OPTS-NEXT: AMDGPU Annotate Kernel Features
525-
; GCN-O1-OPTS-NEXT: AMDGPU Lower Kernel Arguments
525+
; GCN-O1-OPTS-NEXT: AMDGPU Lower Kernel Arguments
526526
; GCN-O1-OPTS-NEXT: Lower buffer fat pointer operations to buffer resources
527527
; GCN-O1-OPTS-NEXT: CallGraph Construction
528528
; GCN-O1-OPTS-NEXT: Call Graph SCC Pass Manager
@@ -833,7 +833,7 @@
833833
; GCN-O2-NEXT: CallGraph Construction
834834
; GCN-O2-NEXT: Call Graph SCC Pass Manager
835835
; GCN-O2-NEXT: AMDGPU Annotate Kernel Features
836-
; GCN-O2-NEXT: AMDGPU Lower Kernel Arguments
836+
; GCN-O2-NEXT: AMDGPU Lower Kernel Arguments
837837
; GCN-O2-NEXT: Lower buffer fat pointer operations to buffer resources
838838
; GCN-O2-NEXT: CallGraph Construction
839839
; GCN-O2-NEXT: Call Graph SCC Pass Manager
@@ -1159,7 +1159,7 @@
11591159
; GCN-O3-NEXT: CallGraph Construction
11601160
; GCN-O3-NEXT: Call Graph SCC Pass Manager
11611161
; GCN-O3-NEXT: AMDGPU Annotate Kernel Features
1162-
; GCN-O3-NEXT: AMDGPU Lower Kernel Arguments
1162+
; GCN-O3-NEXT: AMDGPU Lower Kernel Arguments
11631163
; GCN-O3-NEXT: Lower buffer fat pointer operations to buffer resources
11641164
; GCN-O3-NEXT: CallGraph Construction
11651165
; GCN-O3-NEXT: Call Graph SCC Pass Manager

0 commit comments

Comments
 (0)