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 21namespace llvm { 22 23struct AMDGPUPerfHintAnalysis : public CallGraphSCCPass { 24 static char ID; 25 26public: 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 MemInstCost; 41 unsigned InstCost; 42 unsigned IAMInstCost; // Indirect access memory instruction count 43 unsigned LSMInstCost; // Large stride memory instruction count 44 bool HasDenseGlobalMemAcc; // Set if at least 1 basic block has relatively 45 // high global memory access 46 FuncInfo() 47 : MemInstCost(0), InstCost(0), IAMInstCost(0), LSMInstCost(0), 48 HasDenseGlobalMemAcc(false) {} 49 }; 50 51 typedef ValueMap<const Function*, FuncInfo> FuncInfoMap; 52 53private: 54 55 FuncInfoMap FIM; 56}; 57} // namespace llvm 58#endif // LLVM_LIB_TARGET_AMDGPU_MDGPUPERFHINTANALYSIS_H 59