xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h (revision fcaf7f8644a9988098ac6be2165bce3ea4786e91)
10b57cec5SDimitry Andric //===- AMDGPUPerfHintAnalysis.h ---- analysis of memory traffic -*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric /// \file
100b57cec5SDimitry Andric /// \brief Analyzes if a function potentially memory bound and if a kernel
110b57cec5SDimitry Andric /// kernel may benefit from limiting number of waves to reduce cache thrashing.
120b57cec5SDimitry Andric ///
130b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_MDGPUPERFHINTANALYSIS_H
160b57cec5SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_MDGPUPERFHINTANALYSIS_H
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric #include "llvm/Analysis/CallGraphSCCPass.h"
190b57cec5SDimitry Andric #include "llvm/IR/ValueMap.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric namespace llvm {
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric struct AMDGPUPerfHintAnalysis : public CallGraphSCCPass {
240b57cec5SDimitry Andric   static char ID;
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric public:
AMDGPUPerfHintAnalysisAMDGPUPerfHintAnalysis270b57cec5SDimitry Andric   AMDGPUPerfHintAnalysis() : CallGraphSCCPass(ID) {}
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric   bool runOnSCC(CallGraphSCC &SCC) override;
300b57cec5SDimitry Andric 
getAnalysisUsageAMDGPUPerfHintAnalysis310b57cec5SDimitry Andric   void getAnalysisUsage(AnalysisUsage &AU) const override {
320b57cec5SDimitry Andric     AU.setPreservesAll();
330b57cec5SDimitry Andric   }
340b57cec5SDimitry Andric 
350b57cec5SDimitry Andric   bool isMemoryBound(const Function *F) const;
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric   bool needsWaveLimiter(const Function *F) const;
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric   struct FuncInfo {
40fe6060f1SDimitry Andric     unsigned MemInstCost;
41fe6060f1SDimitry Andric     unsigned InstCost;
42fe6060f1SDimitry Andric     unsigned IAMInstCost; // Indirect access memory instruction count
43fe6060f1SDimitry Andric     unsigned LSMInstCost; // Large stride memory instruction count
44*fcaf7f86SDimitry Andric     bool HasDenseGlobalMemAcc; // Set if at least 1 basic block has relatively
45*fcaf7f86SDimitry Andric                                // high global memory access
FuncInfoAMDGPUPerfHintAnalysis::FuncInfo46*fcaf7f86SDimitry Andric     FuncInfo()
47*fcaf7f86SDimitry Andric         : MemInstCost(0), InstCost(0), IAMInstCost(0), LSMInstCost(0),
48*fcaf7f86SDimitry Andric           HasDenseGlobalMemAcc(false) {}
490b57cec5SDimitry Andric   };
500b57cec5SDimitry Andric 
510b57cec5SDimitry Andric   typedef ValueMap<const Function*, FuncInfo> FuncInfoMap;
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric private:
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric   FuncInfoMap FIM;
560b57cec5SDimitry Andric };
570b57cec5SDimitry Andric } // namespace llvm
580b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_AMDGPU_MDGPUPERFHINTANALYSIS_H
59