diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-07-26 19:03:47 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2023-07-26 19:04:23 +0000 | 
| commit | 7fa27ce4a07f19b07799a767fc29416f3b625afb (patch) | |
| tree | 27825c83636c4de341eb09a74f49f5d38a15d165 /llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp | |
| parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) | |
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp | 65 | 
1 files changed, 28 insertions, 37 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp b/llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp index b66e761d53b0..5c9799235017 100644 --- a/llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp +++ b/llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp @@ -104,25 +104,24 @@ static cl::opt<bool>  namespace { -// The class for main data structure to promote indirect calls to conditional -// direct calls. -class ICallPromotionFunc { +// Promote indirect calls to conditional direct calls, keeping track of +// thresholds. +class IndirectCallPromoter {  private:    Function &F; -  Module *M;    // Symtab that maps indirect call profile values to function names and    // defines. -  InstrProfSymtab *Symtab; +  InstrProfSymtab *const Symtab; -  bool SamplePGO; +  const bool SamplePGO;    OptimizationRemarkEmitter &ORE;    // A struct that records the direct target and it's call count.    struct PromotionCandidate { -    Function *TargetFunction; -    uint64_t Count; +    Function *const TargetFunction; +    const uint64_t Count;      PromotionCandidate(Function *F, uint64_t C) : TargetFunction(F), Count(C) {}    }; @@ -143,11 +142,11 @@ private:                          uint64_t &TotalCount);  public: -  ICallPromotionFunc(Function &Func, Module *Modu, InstrProfSymtab *Symtab, -                     bool SamplePGO, OptimizationRemarkEmitter &ORE) -      : F(Func), M(Modu), Symtab(Symtab), SamplePGO(SamplePGO), ORE(ORE) {} -  ICallPromotionFunc(const ICallPromotionFunc &) = delete; -  ICallPromotionFunc &operator=(const ICallPromotionFunc &) = delete; +  IndirectCallPromoter(Function &Func, InstrProfSymtab *Symtab, bool SamplePGO, +                       OptimizationRemarkEmitter &ORE) +      : F(Func), Symtab(Symtab), SamplePGO(SamplePGO), ORE(ORE) {} +  IndirectCallPromoter(const IndirectCallPromoter &) = delete; +  IndirectCallPromoter &operator=(const IndirectCallPromoter &) = delete;    bool processFunction(ProfileSummaryInfo *PSI);  }; @@ -156,8 +155,8 @@ public:  // Indirect-call promotion heuristic. The direct targets are sorted based on  // the count. Stop at the first target that is not promoted. -std::vector<ICallPromotionFunc::PromotionCandidate> -ICallPromotionFunc::getPromotionCandidatesForCallSite( +std::vector<IndirectCallPromoter::PromotionCandidate> +IndirectCallPromoter::getPromotionCandidatesForCallSite(      const CallBase &CB, const ArrayRef<InstrProfValueData> &ValueDataRef,      uint64_t TotalCount, uint32_t NumCandidates) {    std::vector<PromotionCandidate> Ret; @@ -276,7 +275,7 @@ CallBase &llvm::pgo::promoteIndirectCall(CallBase &CB, Function *DirectCallee,  }  // Promote indirect-call to conditional direct-call for one callsite. -uint32_t ICallPromotionFunc::tryToPromote( +uint32_t IndirectCallPromoter::tryToPromote(      CallBase &CB, const std::vector<PromotionCandidate> &Candidates,      uint64_t &TotalCount) {    uint32_t NumPromoted = 0; @@ -295,7 +294,7 @@ uint32_t ICallPromotionFunc::tryToPromote(  // Traverse all the indirect-call callsite and get the value profile  // annotation to perform indirect-call promotion. -bool ICallPromotionFunc::processFunction(ProfileSummaryInfo *PSI) { +bool IndirectCallPromoter::processFunction(ProfileSummaryInfo *PSI) {    bool Changed = false;    ICallPromotionAnalysis ICallAnalysis;    for (auto *CB : findIndirectCalls(F)) { @@ -319,16 +318,15 @@ bool ICallPromotionFunc::processFunction(ProfileSummaryInfo *PSI) {      if (TotalCount == 0 || NumPromoted == NumVals)        continue;      // Otherwise we need update with the un-promoted records back. -    annotateValueSite(*M, *CB, ICallProfDataRef.slice(NumPromoted), TotalCount, -                      IPVK_IndirectCallTarget, NumCandidates); +    annotateValueSite(*F.getParent(), *CB, ICallProfDataRef.slice(NumPromoted), +                      TotalCount, IPVK_IndirectCallTarget, NumCandidates);    }    return Changed;  }  // A wrapper function that does the actual work. -static bool promoteIndirectCalls(Module &M, ProfileSummaryInfo *PSI, -                                 bool InLTO, bool SamplePGO, -                                 ModuleAnalysisManager *AM = nullptr) { +static bool promoteIndirectCalls(Module &M, ProfileSummaryInfo *PSI, bool InLTO, +                                 bool SamplePGO, ModuleAnalysisManager &MAM) {    if (DisableICP)      return false;    InstrProfSymtab Symtab; @@ -342,19 +340,12 @@ static bool promoteIndirectCalls(Module &M, ProfileSummaryInfo *PSI,      if (F.isDeclaration() || F.hasOptNone())        continue; -    std::unique_ptr<OptimizationRemarkEmitter> OwnedORE; -    OptimizationRemarkEmitter *ORE; -    if (AM) { -      auto &FAM = -          AM->getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); -      ORE = &FAM.getResult<OptimizationRemarkEmitterAnalysis>(F); -    } else { -      OwnedORE = std::make_unique<OptimizationRemarkEmitter>(&F); -      ORE = OwnedORE.get(); -    } +    auto &FAM = +        MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); +    auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F); -    ICallPromotionFunc ICallPromotion(F, &M, &Symtab, SamplePGO, *ORE); -    bool FuncChanged = ICallPromotion.processFunction(PSI); +    IndirectCallPromoter CallPromoter(F, &Symtab, SamplePGO, ORE); +    bool FuncChanged = CallPromoter.processFunction(PSI);      if (ICPDUMPAFTER && FuncChanged) {        LLVM_DEBUG(dbgs() << "\n== IR Dump After =="; F.print(dbgs()));        LLVM_DEBUG(dbgs() << "\n"); @@ -369,11 +360,11 @@ static bool promoteIndirectCalls(Module &M, ProfileSummaryInfo *PSI,  }  PreservedAnalyses PGOIndirectCallPromotion::run(Module &M, -                                                ModuleAnalysisManager &AM) { -  ProfileSummaryInfo *PSI = &AM.getResult<ProfileSummaryAnalysis>(M); +                                                ModuleAnalysisManager &MAM) { +  ProfileSummaryInfo *PSI = &MAM.getResult<ProfileSummaryAnalysis>(M);    if (!promoteIndirectCalls(M, PSI, InLTO | ICPLTOMode, -                            SamplePGO | ICPSamplePGOMode, &AM)) +                            SamplePGO | ICPSamplePGOMode, MAM))      return PreservedAnalyses::all();    return PreservedAnalyses::none();  | 
