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
254255class AMDGPULowerKernelArguments {
255- const TargetMachine &TM;
256- SmallVector<Function *> FunctionsToErase;
256+ private:
257+ SmallVector<Function *, 4 > FunctionsToErase;
257258
258259public:
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+
491517public:
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
522552char AMDGPULowerKernelArgumentsLegacy::ID = 0;
523553
524- ModulePass *
554+ CallGraphSCCPass *
525555llvm::createAMDGPULowerKernelArgumentsLegacyPass (const TargetMachine *TM) {
526556 return new AMDGPULowerKernelArgumentsLegacy (TM);
527557}
528558
529559PreservedAnalyses
530560AMDGPULowerKernelArgumentsPass::run (Module &M, ModuleAnalysisManager &AM) {
531- return AMDGPULowerKernelArguments (TM ).runOnModule (M)
561+ return AMDGPULowerKernelArguments ().runOnModule (M, TM )
532562 ? PreservedAnalyses::none ()
533563 : PreservedAnalyses::all ();
534564}
0 commit comments