//===- AMDGPUPerfHintAnalysis.h ---- analysis of memory traffic -*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // /// \file /// \brief Analyzes if a function potentially memory bound and if a kernel /// kernel may benefit from limiting number of waves to reduce cache thrashing. /// //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUPERFHINTANALYSIS_H #define LLVM_LIB_TARGET_AMDGPU_AMDGPUPERFHINTANALYSIS_H #include "llvm/IR/PassManager.h" #include "llvm/IR/ValueMap.h" #include "llvm/Analysis/CGSCCPassManager.h" #include "llvm/Analysis/LazyCallGraph.h" namespace llvm { class AMDGPUPerfHintAnalysis; class CallGraphSCC; class GCNTargetMachine; class LazyCallGraph; class AMDGPUPerfHintAnalysis { public: struct FuncInfo { unsigned MemInstCost; unsigned InstCost; unsigned IAMInstCost; // Indirect access memory instruction count unsigned LSMInstCost; // Large stride memory instruction count bool HasDenseGlobalMemAcc; // Set if at least 1 basic block has relatively // high global memory access FuncInfo() : MemInstCost(0), InstCost(0), IAMInstCost(0), LSMInstCost(0), HasDenseGlobalMemAcc(false) {} }; typedef ValueMap FuncInfoMap; private: FuncInfoMap FIM; public: AMDGPUPerfHintAnalysis() {} // OldPM bool runOnSCC(const GCNTargetMachine &TM, CallGraphSCC &SCC); // NewPM bool run(const GCNTargetMachine &TM, LazyCallGraph &CG); bool isMemoryBound(const Function *F) const; bool needsWaveLimiter(const Function *F) const; }; struct AMDGPUPerfHintAnalysisPass : public PassInfoMixin { const GCNTargetMachine &TM; std::unique_ptr Impl; AMDGPUPerfHintAnalysisPass(const GCNTargetMachine &TM) : TM(TM), Impl(std::make_unique()) {} PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); }; } // namespace llvm #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUPERFHINTANALYSIS_H