xref: /freebsd/contrib/llvm-project/llvm/include/llvm/Analysis/ScopedNoAliasAA.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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