AliasAnalysis.h revision f12c2c28bd72091f2d7fff5718265c5ad52e7af8
14df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner//===- llvm/Analysis/AliasAnalysis.h - Alias Analysis Interface -*- C++ -*-===//
24df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner//
34df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner// This file defines the generic AliasAnalysis interface, which is used as the
44df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner// common interface used by all clients of alias analysis information, and
54df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner// implemented by all alias analysis implementations.
64df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner//
74df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner// Implementations of this interface must implement the various virtual methods,
84df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner// which automatically provides functionality for the entire suite of client
94df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner// APIs.
104df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner//
114df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner//===----------------------------------------------------------------------===//
124df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
134df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner#ifndef LLVM_ANALYSIS_ALIAS_ANALYSIS_H
144df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner#define LLVM_ANALYSIS_ALIAS_ANALYSIS_H
154df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
164df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattnerclass Value;
174df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattnerclass CallInst;
184df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattnerclass InvokeInst;
194df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattnerclass BasicBlock;
204df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattnerclass Instruction;
214df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
224df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattnerstruct AliasAnalysis {
234df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
24f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// Alias analysis result - Either we know for sure that it does not alias, we
25f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// know for sure it must alias, or we don't know anything: The two pointers
26f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// _might_ alias.  This enum is designed so you can do things like:
27f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  ///     if (AA.alias(P1, P2)) { ... }
28f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// to check to see if two pointers might alias.
29f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  ///
304df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner  enum Result { NoAlias = 0, MayAlias = 1, MustAlias = 2 };
314df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
32f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// alias - The main low level interface to the alias analysis implementation.
33f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// Returns a Result indicating whether the two pointers are aliased to each
34f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// other.  This is the interface that must be implemented by specific alias
35f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// analysis implementations.
36f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  ///
374df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner  virtual Result alias(const Value *V1, const Value *V2) const = 0;
384df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
39f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// canCallModify - Return a Result that indicates whether the specified
40f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// function call can modify the memory location pointed to by Ptr.
41f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  ///
424df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner  virtual Result canCallModify(const CallInst &CI, const Value *Ptr) const = 0;
434df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
44f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// canInvokeModify - Return a Result that indicates whether the specified
45f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// function invoke can modify the memory location pointed to by Ptr.
46f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  ///
474df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner  virtual Result canInvokeModify(const InvokeInst &I, const Value *Ptr) const=0;
484df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
49f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// canBasicBlockModify - Return true if it is possible for execution of the
50f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// specified basic block to modify the value pointed to by Ptr.
51f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  ///
524df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner  bool canBasicBlockModify(const BasicBlock &BB, const Value *Ptr) const;
534df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
54f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// canInstructionRangeModify - Return true if it is possible for the
55f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// execution of the specified instructions to modify the value pointed to by
56f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// Ptr.  The instructions to consider are all of the instructions in the
57f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  /// range of [I1,I2] INCLUSIVE.  I1 and I2 must be in the same basic block.
58f12c2c28bd72091f2d7fff5718265c5ad52e7af8Chris Lattner  ///
594df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner  bool canInstructionRangeModify(const Instruction &I1, const Instruction &I2,
604df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner                                 const Value *Ptr) const;
614df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
624df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner  virtual ~AliasAnalysis();  // We want to be subclassed
634df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner};
644df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner
654df22c0100fe27f19e6f4874f24eedd0742b9cf4Chris Lattner#endif
66