Move getUniqueExitBlocks from LoopBase to Loop, since they depend on
[oota-llvm.git] / include / llvm / Analysis / AliasAnalysis.h
index 73b646d935663ac37fdca2e8214067313cd6246a..be7d5ee37b80f1b1b1ba3862a013e38aecbf56f7 100644 (file)
@@ -1,10 +1,10 @@
 //===- llvm/Analysis/AliasAnalysis.h - Alias Analysis Interface -*- C++ -*-===//
-// 
+//
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
-// 
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
 //===----------------------------------------------------------------------===//
 //
 // This file defines the generic AliasAnalysis interface, which is used as the
 #define LLVM_ANALYSIS_ALIAS_ANALYSIS_H
 
 #include "llvm/Support/CallSite.h"
-#include "llvm/Pass.h"    // Need this for IncludeFile
+#include "llvm/System/IncludeFile.h"
+#include <vector>
 
 namespace llvm {
 
 class LoadInst;
 class StoreInst;
+class VAArgInst;
 class TargetData;
+class Pass;
+class AnalysisUsage;
 
 class AliasAnalysis {
 protected:
@@ -50,21 +54,25 @@ protected:
   /// called multiple times.
   ///
   void InitializeAliasAnalysis(Pass *P);
-  
-  // getAnalysisUsage - All alias analysis implementations should invoke this
-  // directly (using AliasAnalysis::getAnalysisUsage(AU)) to make sure that
-  // TargetData is required by the pass.
+
+  /// getAnalysisUsage - All alias analysis implementations should invoke this
+  /// directly (using AliasAnalysis::getAnalysisUsage(AU)).
   virtual void getAnalysisUsage(AnalysisUsage &AU) const;
 
 public:
+  static char ID; // Class identification, replacement for typeinfo
   AliasAnalysis() : TD(0), AA(0) {}
   virtual ~AliasAnalysis();  // We want to be subclassed
 
-  /// getTargetData - Every alias analysis implementation depends on the size of
-  /// data items in the current Target.  This provides a uniform way to handle
-  /// it.
+  /// getTargetData - Return a pointer to the current TargetData object, or
+  /// null if no TargetData object is available.
+  ///
+  const TargetData *getTargetData() const { return TD; }
+
+  /// getTypeStoreSize - Return the TargetData store size for the given type,
+  /// if known, or a conservative value otherwise.
   ///
-  const TargetData &getTargetData() const { return *TD; }
+  unsigned getTypeStoreSize(const Type *Ty);
 
   //===--------------------------------------------------------------------===//
   /// Alias Queries...
@@ -108,8 +116,8 @@ public:
   /// bits which may be or'd together.
   ///
   enum ModRefResult { NoModRef = 0, Ref = 1, Mod = 2, ModRef = 3 };
-  
+
+
   /// ModRefBehavior - Summary of how a function affects memory in the program.
   /// Loads from constant globals are not considered memory accesses for this
   /// interface.  Also, functions may freely modify stack space local to their
@@ -120,33 +128,33 @@ public:
     //
     // This property corresponds to the GCC 'const' attribute.
     DoesNotAccessMemory,
-    
-    // AccessesArguments - This function accesses function arguments in
-    // non-volatile and well known ways, but does not access any other memory.
+
+    // AccessesArguments - This function accesses function arguments in well
+    // known (possibly volatile) ways, but does not access any other memory.
     //
-    // Clients may call getArgumentAccesses to get specific information about
-    // how pointer arguments are used.
+    // Clients may use the Info parameter of getModRefBehavior to get specific
+    // information about how pointer arguments are used.
     AccessesArguments,
-    
+
     // AccessesArgumentsAndGlobals - This function has accesses function
-    // arguments and global variables in non-volatile and well-known ways, but
+    // arguments and global variables well known (possibly volatile) ways, but
     // does not access any other memory.
     //
-    // Clients may call getArgumentAccesses to get specific information about
-    // how pointer arguments and globals are used.
+    // Clients may use the Info parameter of getModRefBehavior to get specific
+    // information about how pointer arguments are used.
     AccessesArgumentsAndGlobals,
-    
+
     // OnlyReadsMemory - This function does not perform any non-local stores or
     // volatile loads, but may read from any memory location.
     //
     // This property corresponds to the GCC 'pure' attribute.
     OnlyReadsMemory,
-    
+
     // UnknownModRefBehavior - This indicates that the function could not be
     // classified into one of the behaviors above.
     UnknownModRefBehavior
   };
-  
+
   /// PointerAccessInfo - This struct is used to return results for pointers,
   /// globals, and the return value of a function.
   struct PointerAccessInfo {
@@ -154,11 +162,11 @@ public:
     /// the function, a GlobalVariable, or null, corresponding to the return
     /// value for the function.
     Value *V;
-    
+
     /// ModRefInfo - Whether the pointer is loaded or stored to/from.
     ///
     ModRefResult ModRefInfo;
-    
+
     /// AccessType - Specific fine-grained access information for the argument.
     /// If none of these classifications is general enough, the
     /// getModRefBehavior method should not return AccessesArguments*.  If a
@@ -168,53 +176,71 @@ public:
       /// ScalarAccess - The pointer is dereferenced.
       ///
       ScalarAccess,
-      
+
       /// ArrayAccess - The pointer is indexed through as an array of elements.
       ///
       ArrayAccess,
-      
+
       /// ElementAccess ?? P->F only?
-      
+
       /// CallsThrough - Indirect calls are made through the specified function
       /// pointer.
-      CallsThrough,
+      CallsThrough
     };
-  }; 
-  
-  /// getModRefBehavior - Return the behavior of the specified function if
-  /// called from the specified call site.  The call site may be null in which
-  /// case the most generic behavior of this function should be returned.
-  virtual ModRefBehavior getModRefBehavior(Function *F, CallSite CS,
-                                     std::vector<PointerAccessInfo> *Info = 0);
-    
-  /// doesNotAccessMemory - If the specified function is known to never read or
-  /// write memory, return true.  If the function only reads from known-constant
-  /// memory, it is also legal to return true.  Functions that unwind the stack
-  /// are not legal for this predicate.
+  };
+
+  /// getModRefBehavior - Return the behavior when calling the given call site.
+  virtual ModRefBehavior getModRefBehavior(CallSite CS,
+                                   std::vector<PointerAccessInfo> *Info = 0);
+
+  /// getModRefBehavior - Return the behavior when calling the given function.
+  /// For use when the call site is not known.
+  virtual ModRefBehavior getModRefBehavior(Function *F,
+                                   std::vector<PointerAccessInfo> *Info = 0);
+
+  /// doesNotAccessMemory - If the specified call is known to never read or
+  /// write memory, return true.  If the call only reads from known-constant
+  /// memory, it is also legal to return true.  Calls that unwind the stack
+  /// are legal for this predicate.
   ///
-  /// Many optimizations (such as CSE and LICM) can be performed on calls to it,
-  /// without worrying about aliasing properties, and many functions have this
-  /// property (e.g. 'sin' and 'cos').
+  /// Many optimizations (such as CSE and LICM) can be performed on such calls
+  /// without worrying about aliasing properties, and many calls have this
+  /// property (e.g. calls to 'sin' and 'cos').
   ///
   /// This property corresponds to the GCC 'const' attribute.
   ///
+  bool doesNotAccessMemory(CallSite CS) {
+    return getModRefBehavior(CS) == DoesNotAccessMemory;
+  }
+
+  /// doesNotAccessMemory - If the specified function is known to never read or
+  /// write memory, return true.  For use when the call site is not known.
+  ///
   bool doesNotAccessMemory(Function *F) {
-    return getModRefBehavior(F, CallSite()) == DoesNotAccessMemory;
+    return getModRefBehavior(F) == DoesNotAccessMemory;
   }
 
-  /// onlyReadsMemory - If the specified function is known to only read from
-  /// non-volatile memory (or not access memory at all), return true.  Functions
-  /// that unwind the stack are not legal for this predicate.
+  /// onlyReadsMemory - If the specified call is known to only read from
+  /// non-volatile memory (or not access memory at all), return true.  Calls
+  /// that unwind the stack are legal for this predicate.
   ///
   /// This property allows many common optimizations to be performed in the
   /// absence of interfering store instructions, such as CSE of strlen calls.
   ///
   /// This property corresponds to the GCC 'pure' attribute.
   ///
+  bool onlyReadsMemory(CallSite CS) {
+    ModRefBehavior MRB = getModRefBehavior(CS);
+    return MRB == DoesNotAccessMemory || MRB == OnlyReadsMemory;
+  }
+
+  /// onlyReadsMemory - If the specified function is known to only read from
+  /// non-volatile memory (or not access memory at all), return true.  For use
+  /// when the call site is not known.
+  ///
   bool onlyReadsMemory(Function *F) {
-    /// FIXME: If the analysis returns more precise info, we can reduce it to
-    /// this.
-    return getModRefBehavior(F, CallSite()) == OnlyReadsMemory;
+    ModRefBehavior MRB = getModRefBehavior(F);
+    return MRB == DoesNotAccessMemory || MRB == OnlyReadsMemory;
   }
 
 
@@ -244,6 +270,7 @@ public:
   ///
   virtual bool hasNoModRefInfoForCalls() const;
 
+public:
   /// Convenience functions...
   ModRefResult getModRefInfo(LoadInst *L, Value *P, unsigned Size);
   ModRefResult getModRefInfo(StoreInst *S, Value *P, unsigned Size);
@@ -253,8 +280,12 @@ public:
   ModRefResult getModRefInfo(InvokeInst *I, Value *P, unsigned Size) {
     return getModRefInfo(CallSite(I), P, Size);
   }
+  ModRefResult getModRefInfo(VAArgInst* I, Value* P, unsigned Size) {
+    return AliasAnalysis::ModRef;
+  }
   ModRefResult getModRefInfo(Instruction *I, Value *P, unsigned Size) {
     switch (I->getOpcode()) {
+    case Instruction::VAArg:  return getModRefInfo((VAArgInst*)I, P, Size);
     case Instruction::Load:   return getModRefInfo((LoadInst*)I, P, Size);
     case Instruction::Store:  return getModRefInfo((StoreInst*)I, P, Size);
     case Instruction::Call:   return getModRefInfo((CallInst*)I, P, Size);
@@ -310,14 +341,26 @@ public:
   }
 };
 
+/// isNoAliasCall - Return true if this pointer is returned by a noalias
+/// function.
+bool isNoAliasCall(const Value *V);
+
+/// isIdentifiedObject - Return true if this pointer refers to a distinct and
+/// identifiable object.  This returns true for:
+///    Global Variables and Functions (but not Global Aliases)
+///    Allocas and Mallocs
+///    ByVal and NoAlias Arguments
+///    NoAlias returns
+///
+bool isIdentifiedObject(const Value *V);
+
+} // End llvm namespace
+
 // Because of the way .a files work, we must force the BasicAA implementation to
 // be pulled in if the AliasAnalysis header is included.  Otherwise we run
 // the risk of AliasAnalysis being used, but the default implementation not
 // being linked into the tool that uses it.
-//
-extern void BasicAAStub();
-static IncludeFile HDR_INCLUDE_BASICAA_CPP((void*)&BasicAAStub);
-
-} // End llvm namespace
+FORCE_DEFINING_FILE_TO_BE_LINKED(AliasAnalysis)
+FORCE_DEFINING_FILE_TO_BE_LINKED(BasicAliasAnalysis)
 
 #endif