14
14
#include " AMDGPU.h"
15
15
#include " GCNSubtarget.h"
16
16
#include " llvm/ADT/StringExtras.h"
17
+ #include " llvm/Analysis/CallGraph.h"
17
18
#include " llvm/Analysis/ValueTracking.h"
18
19
#include " llvm/CodeGen/TargetPassConfig.h"
19
20
#include " llvm/IR/IRBuilder.h"
@@ -252,11 +253,21 @@ class PreloadKernelArgInfo {
252
253
};
253
254
254
255
class AMDGPULowerKernelArguments {
255
- const TargetMachine &TM;
256
- SmallVector<Function *> FunctionsToErase;
256
+ private:
257
+ SmallVector<Function *, 4 > FunctionsToErase;
257
258
258
259
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
+ }
260
271
261
272
// skip allocas
262
273
static BasicBlock::iterator getInsertPt (BasicBlock &BB) {
@@ -273,7 +284,7 @@ class AMDGPULowerKernelArguments {
273
284
return InsPt;
274
285
}
275
286
276
- bool lowerKernelArguments (Function &F) {
287
+ bool lowerKernelArguments (Function &F, const TargetMachine &TM ) {
277
288
CallingConv::ID CC = F.getCallingConv ();
278
289
if (CC != CallingConv::AMDGPU_KERNEL || F.arg_empty ())
279
290
return false ;
@@ -474,34 +485,53 @@ class AMDGPULowerKernelArguments {
474
485
return true ;
475
486
}
476
487
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) {
478
502
bool Changed = false ;
479
503
480
504
for (Function &F : M)
481
- Changed |= lowerKernelArguments (F);
505
+ Changed |= lowerKernelArguments (F, TM );
482
506
483
- for (Function *F : FunctionsToErase)
484
- F->eraseFromParent ();
507
+ Changed |= eraseTaggedFunctions ();
485
508
486
509
return Changed;
487
510
}
488
511
};
489
512
490
- class AMDGPULowerKernelArgumentsLegacy : public ModulePass {
513
+ class AMDGPULowerKernelArgumentsLegacy : public CallGraphSCCPass {
514
+ private:
515
+ AMDGPULowerKernelArguments Impl;
516
+
491
517
public:
492
518
static char ID;
493
519
const TargetMachine *TM;
494
520
495
521
AMDGPULowerKernelArgumentsLegacy (const TargetMachine *TM = nullptr )
496
- : ModulePass (ID), TM(TM) {}
522
+ : CallGraphSCCPass (ID), TM(TM) {}
497
523
498
- bool runOnModule (Module &M ) override {
524
+ bool runOnSCC (CallGraphSCC &SCC ) override {
499
525
if (!TM) {
500
526
auto &TPC = getAnalysis<TargetPassConfig>();
501
527
TM = &TPC.getTM <TargetMachine>();
502
528
}
503
529
504
- return AMDGPULowerKernelArguments (*TM).runOnModule (M);
530
+ return Impl.runOnSCC (SCC, *TM);
531
+ }
532
+
533
+ bool doFinalization (CallGraph &CG) override {
534
+ return Impl.eraseTaggedFunctions ();
505
535
}
506
536
507
537
void getAnalysisUsage (AnalysisUsage &AU) const override {
@@ -521,14 +551,14 @@ INITIALIZE_PASS_END(AMDGPULowerKernelArgumentsLegacy, DEBUG_TYPE,
521
551
522
552
char AMDGPULowerKernelArgumentsLegacy::ID = 0;
523
553
524
- ModulePass *
554
+ CallGraphSCCPass *
525
555
llvm::createAMDGPULowerKernelArgumentsLegacyPass (const TargetMachine *TM) {
526
556
return new AMDGPULowerKernelArgumentsLegacy (TM);
527
557
}
528
558
529
559
PreservedAnalyses
530
560
AMDGPULowerKernelArgumentsPass::run (Module &M, ModuleAnalysisManager &AM) {
531
- return AMDGPULowerKernelArguments (TM ).runOnModule (M)
561
+ return AMDGPULowerKernelArguments ().runOnModule (M, TM )
532
562
? PreservedAnalyses::none ()
533
563
: PreservedAnalyses::all ();
534
564
}
0 commit comments