Path: blob/main/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUAliasAnalysis.h
35268 views
//===- AMDGPUAliasAnalysis --------------------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7/// \file8/// This is the AMGPU address space based alias analysis pass.9//===----------------------------------------------------------------------===//1011#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H12#define LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H1314#include "llvm/Analysis/AliasAnalysis.h"15#include "llvm/IR/Module.h"1617namespace llvm {1819class DataLayout;20class MemoryLocation;2122/// A simple AA result that uses TBAA metadata to answer queries.23class AMDGPUAAResult : public AAResultBase {24const DataLayout &DL;2526public:27explicit AMDGPUAAResult(const DataLayout &DL) : DL(DL) {}28AMDGPUAAResult(AMDGPUAAResult &&Arg)29: AAResultBase(std::move(Arg)), DL(Arg.DL) {}3031/// Handle invalidation events from the new pass manager.32///33/// By definition, this result is stateless and so remains valid.34bool invalidate(Function &, const PreservedAnalyses &,35FunctionAnalysisManager::Invalidator &Inv) {36return false;37}3839AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB,40AAQueryInfo &AAQI, const Instruction *CtxI);41ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI,42bool IgnoreLocals);43};4445/// Analysis pass providing a never-invalidated alias analysis result.46class AMDGPUAA : public AnalysisInfoMixin<AMDGPUAA> {47friend AnalysisInfoMixin<AMDGPUAA>;4849static AnalysisKey Key;5051public:52using Result = AMDGPUAAResult;5354AMDGPUAAResult run(Function &F, AnalysisManager<Function> &AM) {55return AMDGPUAAResult(F.getDataLayout());56}57};5859/// Legacy wrapper pass to provide the AMDGPUAAResult object.60class AMDGPUAAWrapperPass : public ImmutablePass {61std::unique_ptr<AMDGPUAAResult> Result;6263public:64static char ID;6566AMDGPUAAWrapperPass();6768AMDGPUAAResult &getResult() { return *Result; }69const AMDGPUAAResult &getResult() const { return *Result; }7071bool doInitialization(Module &M) override {72Result.reset(new AMDGPUAAResult(M.getDataLayout()));73return false;74}7576bool doFinalization(Module &M) override {77Result.reset();78return false;79}8081void getAnalysisUsage(AnalysisUsage &AU) const override;82};8384// Wrapper around ExternalAAWrapperPass so that the default constructor gets the85// callback.86class AMDGPUExternalAAWrapper : public ExternalAAWrapperPass {87public:88static char ID;8990AMDGPUExternalAAWrapper() : ExternalAAWrapperPass(91[](Pass &P, Function &, AAResults &AAR) {92if (auto *WrapperPass = P.getAnalysisIfAvailable<AMDGPUAAWrapperPass>())93AAR.addAAResult(WrapperPass->getResult());94}) {}95};9697} // end namespace llvm9899#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUALIASANALYSIS_H100101102