1 //===- AMDGPUPerfHintAnalysis.h ---- analysis of memory traffic -*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 /// \file 10 /// \brief Analyzes if a function potentially memory bound and if a kernel 11 /// kernel may benefit from limiting number of waves to reduce cache thrashing. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_LIB_TARGET_AMDGPU_MDGPUPERFHINTANALYSIS_H 16 #define LLVM_LIB_TARGET_AMDGPU_MDGPUPERFHINTANALYSIS_H 17 18 #include "llvm/Analysis/CallGraphSCCPass.h" 19 #include "llvm/IR/ValueMap.h" 20 21 namespace llvm { 22 23 struct AMDGPUPerfHintAnalysis : public CallGraphSCCPass { 24 static char ID; 25 26 public: 27 AMDGPUPerfHintAnalysis() : CallGraphSCCPass(ID) {} 28 29 bool runOnSCC(CallGraphSCC &SCC) override; 30 31 void getAnalysisUsage(AnalysisUsage &AU) const override { 32 AU.setPreservesAll(); 33 } 34 35 bool isMemoryBound(const Function *F) const; 36 37 bool needsWaveLimiter(const Function *F) const; 38 39 struct FuncInfo { 40 unsigned MemInstCount; 41 unsigned InstCount; 42 unsigned IAMInstCount; // Indirect access memory instruction count 43 unsigned LSMInstCount; // Large stride memory instruction count 44 FuncInfo() : MemInstCount(0), InstCount(0), IAMInstCount(0), 45 LSMInstCount(0) {} 46 }; 47 48 typedef ValueMap<const Function*, FuncInfo> FuncInfoMap; 49 50 private: 51 52 FuncInfoMap FIM; 53 }; 54 } // namespace llvm 55 #endif // LLVM_LIB_TARGET_AMDGPU_MDGPUPERFHINTANALYSIS_H 56