1f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===- TypeBasedAliasAnalysis.h - Type-Based Alias Analysis -----*- C++ -*-===// 2f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// 3f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// The LLVM Compiler Infrastructure 4f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// 5f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 6f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// License. See LICENSE.TXT for details. 7f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// 8f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 9f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// \file 10f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// This is the interface for a metadata-based TBAA. See the source file for 11f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// details on the algorithm. 12f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// 13f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 15f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#ifndef LLVM_ANALYSIS_TYPEBASEDALIASANALYSIS_H 16f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#define LLVM_ANALYSIS_TYPEBASEDALIASANALYSIS_H 17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/AliasAnalysis.h" 19f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/IR/Function.h" 20f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/IR/Metadata.h" 21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Pass.h" 22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarnamespace llvm { 24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// A simple AA result that uses TBAA metadata to answer queries. 26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass TypeBasedAAResult : public AAResultBase<TypeBasedAAResult> { 27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar friend AAResultBase<TypeBasedAAResult>; 28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic: 30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar explicit TypeBasedAAResult() {} 31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar TypeBasedAAResult(TypeBasedAAResult &&Arg) : AAResultBase(std::move(Arg)) {} 32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// Handle invalidation events from the new pass manager. 34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// 35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// By definition, this result is stateless and so remains valid. 36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool invalidate(Function &, const PreservedAnalyses &) { return false; } 37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB); 39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal); 40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar FunctionModRefBehavior getModRefBehavior(ImmutableCallSite CS); 41f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar FunctionModRefBehavior getModRefBehavior(const Function *F); 42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar ModRefInfo getModRefInfo(ImmutableCallSite CS, const MemoryLocation &Loc); 43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar ModRefInfo getModRefInfo(ImmutableCallSite CS1, ImmutableCallSite CS2); 44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarprivate: 46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool Aliases(const MDNode *A, const MDNode *B) const; 47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool PathAliases(const MDNode *A, const MDNode *B) const; 48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}; 49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// Analysis pass providing a never-invalidated alias analysis result. 51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass TypeBasedAA : public AnalysisInfoMixin<TypeBasedAA> { 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar friend AnalysisInfoMixin<TypeBasedAA>; 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static char PassID; 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic: 56f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar typedef TypeBasedAAResult Result; 57f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TypeBasedAAResult run(Function &F, AnalysisManager<Function> &AM); 59f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}; 60f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// Legacy wrapper pass to provide the TypeBasedAAResult object. 62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass TypeBasedAAWrapperPass : public ImmutablePass { 63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar std::unique_ptr<TypeBasedAAResult> Result; 64f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic: 66f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static char ID; 67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 68f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar TypeBasedAAWrapperPass(); 69f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar TypeBasedAAResult &getResult() { return *Result; } 71f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const TypeBasedAAResult &getResult() const { return *Result; } 72f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 73f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool doInitialization(Module &M) override; 74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool doFinalization(Module &M) override; 75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar void getAnalysisUsage(AnalysisUsage &AU) const override; 76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}; 77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 78f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===--------------------------------------------------------------------===// 79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// 80f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// createTypeBasedAAWrapperPass - This pass implements metadata-based 81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// type-based alias analysis. 82f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// 83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarImmutablePass *createTypeBasedAAWrapperPass(); 84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 85f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 86f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif 87