#include "AMDGPUPerfHintAnalysis.h"
#include "AMDGPU.h"
#include "AMDGPUTargetMachine.h"
#include "Utils/AMDGPUBaseInfo.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/CallGraph.h"
#include "llvm/Analysis/CallGraphSCCPass.h"
#include "llvm/Analysis/LazyCallGraph.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Target/TargetMachine.h"
usingnamespacellvm;
#define DEBUG_TYPE …
static cl::opt<unsigned>
MemBoundThresh("amdgpu-membound-threshold", cl::init(50), cl::Hidden,
cl::desc("Function mem bound threshold in %"));
static cl::opt<unsigned>
LimitWaveThresh("amdgpu-limit-wave-threshold", cl::init(50), cl::Hidden,
cl::desc("Kernel limit wave threshold in %"));
static cl::opt<unsigned>
IAWeight("amdgpu-indirect-access-weight", cl::init(1000), cl::Hidden,
cl::desc("Indirect access memory instruction weight"));
static cl::opt<unsigned>
LSWeight("amdgpu-large-stride-weight", cl::init(1000), cl::Hidden,
cl::desc("Large stride memory access weight"));
static cl::opt<unsigned>
LargeStrideThresh("amdgpu-large-stride-threshold", cl::init(64), cl::Hidden,
cl::desc("Large stride memory access threshold"));
STATISTIC(NumMemBound, "Number of functions marked as memory bound");
STATISTIC(NumLimitWave, "Number of functions marked as needing limit wave");
namespace {
struct AMDGPUPerfHint { … };
static std::pair<const Value *, const Type *> getMemoryInstrPtrAndType(
const Instruction *Inst) { … }
bool AMDGPUPerfHint::isIndirectAccess(const Instruction *Inst) const { … }
bool AMDGPUPerfHint::isGlobalLoadUsedInBB(const Instruction &I) const { … }
AMDGPUPerfHintAnalysis::FuncInfo *AMDGPUPerfHint::visit(const Function &F) { … }
bool AMDGPUPerfHint::runOnFunction(Function &F) { … }
bool AMDGPUPerfHint::isMemBound(const AMDGPUPerfHintAnalysis::FuncInfo &FI) { … }
bool AMDGPUPerfHint::needLimitWave(const AMDGPUPerfHintAnalysis::FuncInfo &FI) { … }
bool AMDGPUPerfHint::isGlobalAddr(const Value *V) const { … }
bool AMDGPUPerfHint::isLocalAddr(const Value *V) const { … }
bool AMDGPUPerfHint::isLargeStride(const Instruction *Inst) { … }
AMDGPUPerfHint::MemAccessInfo
AMDGPUPerfHint::makeMemAccessInfo(Instruction *Inst) const { … }
bool AMDGPUPerfHint::MemAccessInfo::isLargeStride(
MemAccessInfo &Reference) const { … }
class AMDGPUPerfHintAnalysisLegacy : public CallGraphSCCPass { … };
}
bool AMDGPUPerfHintAnalysis::isMemoryBound(const Function *F) const { … }
bool AMDGPUPerfHintAnalysis::needsWaveLimiter(const Function *F) const { … }
bool AMDGPUPerfHintAnalysis::runOnSCC(const GCNTargetMachine &TM,
CallGraphSCC &SCC) { … }
bool AMDGPUPerfHintAnalysis::run(const GCNTargetMachine &TM,
LazyCallGraph &CG) { … }
char AMDGPUPerfHintAnalysisLegacy::ID = …;
char &llvm::AMDGPUPerfHintAnalysisLegacyID = …;
INITIALIZE_PASS(…)
bool AMDGPUPerfHintAnalysisLegacy::runOnSCC(CallGraphSCC &SCC) { … }
PreservedAnalyses AMDGPUPerfHintAnalysisPass::run(Module &M,
ModuleAnalysisManager &AM) { … }