10b57cec5SDimitry Andric //===- ScopedNoAliasAA.h - Scoped No-Alias Alias Analysis -------*- 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 /// This is the interface for a metadata-based scoped no-alias analysis. 110b57cec5SDimitry Andric // 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #ifndef LLVM_ANALYSIS_SCOPEDNOALIASAA_H 150b57cec5SDimitry Andric #define LLVM_ANALYSIS_SCOPEDNOALIASAA_H 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric #include "llvm/Analysis/AliasAnalysis.h" 180b57cec5SDimitry Andric #include "llvm/IR/PassManager.h" 190b57cec5SDimitry Andric #include "llvm/Pass.h" 200b57cec5SDimitry Andric #include <memory> 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric namespace llvm { 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric class Function; 250b57cec5SDimitry Andric class MDNode; 260b57cec5SDimitry Andric class MemoryLocation; 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric /// A simple AA result which uses scoped-noalias metadata to answer queries. 29*bdd1243dSDimitry Andric class ScopedNoAliasAAResult : public AAResultBase { 300b57cec5SDimitry Andric public: 310b57cec5SDimitry Andric /// Handle invalidation events from the new pass manager. 320b57cec5SDimitry Andric /// 330b57cec5SDimitry Andric /// By definition, this result is stateless and so remains valid. invalidate(Function &,const PreservedAnalyses &,FunctionAnalysisManager::Invalidator &)340b57cec5SDimitry Andric bool invalidate(Function &, const PreservedAnalyses &, 350b57cec5SDimitry Andric FunctionAnalysisManager::Invalidator &) { 360b57cec5SDimitry Andric return false; 370b57cec5SDimitry Andric } 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, 40*bdd1243dSDimitry Andric AAQueryInfo &AAQI, const Instruction *CtxI); 410b57cec5SDimitry Andric ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, 420b57cec5SDimitry Andric AAQueryInfo &AAQI); 430b57cec5SDimitry Andric ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2, 440b57cec5SDimitry Andric AAQueryInfo &AAQI); 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric private: 470b57cec5SDimitry Andric bool mayAliasInScopes(const MDNode *Scopes, const MDNode *NoAlias) const; 480b57cec5SDimitry Andric }; 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric /// Analysis pass providing a never-invalidated alias analysis result. 510b57cec5SDimitry Andric class ScopedNoAliasAA : public AnalysisInfoMixin<ScopedNoAliasAA> { 520b57cec5SDimitry Andric friend AnalysisInfoMixin<ScopedNoAliasAA>; 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric static AnalysisKey Key; 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric public: 570b57cec5SDimitry Andric using Result = ScopedNoAliasAAResult; 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric ScopedNoAliasAAResult run(Function &F, FunctionAnalysisManager &AM); 600b57cec5SDimitry Andric }; 610b57cec5SDimitry Andric 620b57cec5SDimitry Andric /// Legacy wrapper pass to provide the ScopedNoAliasAAResult object. 630b57cec5SDimitry Andric class ScopedNoAliasAAWrapperPass : public ImmutablePass { 640b57cec5SDimitry Andric std::unique_ptr<ScopedNoAliasAAResult> Result; 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric public: 670b57cec5SDimitry Andric static char ID; 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric ScopedNoAliasAAWrapperPass(); 700b57cec5SDimitry Andric getResult()710b57cec5SDimitry Andric ScopedNoAliasAAResult &getResult() { return *Result; } getResult()720b57cec5SDimitry Andric const ScopedNoAliasAAResult &getResult() const { return *Result; } 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric bool doInitialization(Module &M) override; 750b57cec5SDimitry Andric bool doFinalization(Module &M) override; 760b57cec5SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override; 770b57cec5SDimitry Andric }; 780b57cec5SDimitry Andric 790b57cec5SDimitry Andric //===--------------------------------------------------------------------===// 800b57cec5SDimitry Andric // 810b57cec5SDimitry Andric // createScopedNoAliasAAWrapperPass - This pass implements metadata-based 820b57cec5SDimitry Andric // scoped noalias analysis. 830b57cec5SDimitry Andric // 840b57cec5SDimitry Andric ImmutablePass *createScopedNoAliasAAWrapperPass(); 850b57cec5SDimitry Andric 860b57cec5SDimitry Andric } // end namespace llvm 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric #endif // LLVM_ANALYSIS_SCOPEDNOALIASAA_H 89