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#include "llvm/Pass.h" 21 22namespace llvm { 23 24struct AMDGPUPerfHintAnalysis : public CallGraphSCCPass { 25 static char ID; 26 27public: 28 AMDGPUPerfHintAnalysis() : CallGraphSCCPass(ID) {} 29 30 bool runOnSCC(CallGraphSCC &SCC) override; 31 32 void getAnalysisUsage(AnalysisUsage &AU) const override { 33 AU.setPreservesAll(); 34 } 35 36 bool isMemoryBound(const Function *F) const; 37 38 bool needsWaveLimiter(const Function *F) const; 39 40 struct FuncInfo { 41 unsigned MemInstCount; 42 unsigned InstCount; 43 unsigned IAMInstCount; // Indirect access memory instruction count 44 unsigned LSMInstCount; // Large stride memory instruction count 45 FuncInfo() : MemInstCount(0), InstCount(0), IAMInstCount(0), 46 LSMInstCount(0) {} 47 }; 48 49 typedef ValueMap<const Function*, FuncInfo> FuncInfoMap; 50 51private: 52 53 FuncInfoMap FIM; 54}; 55} // namespace llvm 56#endif // LLVM_LIB_TARGET_AMDGPU_MDGPUPERFHINTANALYSIS_H 57