//===- 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<const Function *, FuncInfo> FuncInfoMap;

private:
  FuncInfoMap FIM;

public:
  AMDGPUPerfHintAnalysis() = default;

  // 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<AMDGPUPerfHintAnalysisPass> {
  const GCNTargetMachine &TM;
  std::unique_ptr<AMDGPUPerfHintAnalysis> Impl;

  AMDGPUPerfHintAnalysisPass(const GCNTargetMachine &TM)
      : TM(TM), Impl(std::make_unique<AMDGPUPerfHintAnalysis>()) {}

  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
};

} // namespace llvm
#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUPERFHINTANALYSIS_H
