AliasAnalysis.h revision 4df22c0100fe27f19e6f4874f24eedd0742b9cf4
1c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh//===- llvm/Analysis/AliasAnalysis.h - Alias Analysis Interface -*- C++ -*-===//
20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang//
3f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh// This file defines the generic AliasAnalysis interface, which is used as the
4c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh// common interface used by all clients of alias analysis information, and
5c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh// implemented by all alias analysis implementations.
60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang//
7c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh// Implementations of this interface must implement the various virtual methods,
8c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh// which automatically provides functionality for the entire suite of client
90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang// APIs.
10c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh//
11c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh//===----------------------------------------------------------------------===//
12c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef LLVM_ANALYSIS_ALIAS_ANALYSIS_H
140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define LLVM_ANALYSIS_ALIAS_ANALYSIS_H
150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangclass Value;
17c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehclass CallInst;
180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangclass InvokeInst;
19c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehclass BasicBlock;
20c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehclass Instruction;
21c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh
220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct AliasAnalysis {
230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // Alias analysis result - Either we know for sure that it does not alias, we
250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // know for sure it must alias, or we don't know anything: The two pointers
260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // _might_ alias.  This enum is designed so you can do things like:
270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  //     if (AA.alias(P1, P2)) { ... }
280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // to check to see if two pointers might alias.
290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  //
300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  enum Result { NoAlias = 0, MayAlias = 1, MustAlias = 2 };
310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
32c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh  // alias - The main low level interface to the alias analysis implementation.
330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // Returns a Result indicating whether the two pointers are aliased to each
340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // other.  This is the interface that must be implemented by specific alias
350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // analysis implementations.
360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  //
370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  virtual Result alias(const Value *V1, const Value *V2) const = 0;
380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // canCallModify - Return a Result that indicates whether the specified
400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // function call can modify the memory location pointed to by Ptr.
410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  //
420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  virtual Result canCallModify(const CallInst &CI, const Value *Ptr) const = 0;
430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // canInvokeModify - Return a Result that indicates whether the specified
450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // function invoke can modify the memory location pointed to by Ptr.
460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  //
470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  virtual Result canInvokeModify(const InvokeInst &I, const Value *Ptr) const=0;
480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // canBasicBlockModify - Return true if it is possible for execution of the
500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // specified basic block to modify the value pointed to by Ptr.
510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  //
520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  bool canBasicBlockModify(const BasicBlock &BB, const Value *Ptr) const;
530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // canInstructionRangeModify - Return true if it is possible for the execution
550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // of the specified instructions to modify the value pointed to by Ptr.  The
560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // instructions to consider are all of the instructions in the range of
570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  // [I1,I2] INCLUSIVE.  I1 and I2 must be in the same basic block.
580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  //
590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  bool canInstructionRangeModify(const Instruction &I1, const Instruction &I2,
600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang                                 const Value *Ptr) const;
610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang  virtual ~AliasAnalysis();  // We want to be subclassed
630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang