#ifndef LLVM_ANALYSIS_SCOPEDNOALIASAA_H
#define LLVM_ANALYSIS_SCOPEDNOALIASAA_H
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/Pass.h"
namespace llvm {
class ScopedNoAliasAAResult : public AAResultBase<ScopedNoAliasAAResult> {
friend AAResultBase<ScopedNoAliasAAResult>;
public:
explicit ScopedNoAliasAAResult(const TargetLibraryInfo &TLI)
: AAResultBase(TLI) {}
ScopedNoAliasAAResult(ScopedNoAliasAAResult &&Arg)
: AAResultBase(std::move(Arg)) {}
bool invalidate(Function &, const PreservedAnalyses &) { return false; }
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB);
ModRefInfo getModRefInfo(ImmutableCallSite CS, const MemoryLocation &Loc);
ModRefInfo getModRefInfo(ImmutableCallSite CS1, ImmutableCallSite CS2);
private:
bool mayAliasInScopes(const MDNode *Scopes, const MDNode *NoAlias) const;
void collectMDInDomain(const MDNode *List, const MDNode *Domain,
SmallPtrSetImpl<const MDNode *> &Nodes) const;
};
class ScopedNoAliasAA {
public:
typedef ScopedNoAliasAAResult Result;
static void *ID() { return (void *)&PassID; }
ScopedNoAliasAAResult run(Function &F, AnalysisManager<Function> *AM);
static StringRef name() { return "ScopedNoAliasAA"; }
private:
static char PassID;
};
class ScopedNoAliasAAWrapperPass : public ImmutablePass {
std::unique_ptr<ScopedNoAliasAAResult> Result;
public:
static char ID;
ScopedNoAliasAAWrapperPass();
ScopedNoAliasAAResult &getResult() { return *Result; }
const ScopedNoAliasAAResult &getResult() const { return *Result; }
bool doInitialization(Module &M) override;
bool doFinalization(Module &M) override;
void getAnalysisUsage(AnalysisUsage &AU) const override;
};
ImmutablePass *createScopedNoAliasAAWrapperPass();
}
#endif