mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-19 06:31:18 +00:00
Make the AliasAnalysis interface more precise for common cases.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18956 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5b2103405b
commit
248e8ebeff
@ -100,6 +100,93 @@ public:
|
|||||||
///
|
///
|
||||||
virtual bool pointsToConstantMemory(const Value *P);
|
virtual bool pointsToConstantMemory(const Value *P);
|
||||||
|
|
||||||
|
//===--------------------------------------------------------------------===//
|
||||||
|
/// Simple mod/ref information...
|
||||||
|
///
|
||||||
|
|
||||||
|
/// ModRefResult - Represent the result of a mod/ref query. Mod and Ref are
|
||||||
|
/// 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
|
||||||
|
/// invocation without having to report it through these interfaces.
|
||||||
|
enum ModRefBehavior {
|
||||||
|
// DoesNotAccessMemory - This function does not perform any non-local loads
|
||||||
|
// or stores to memory.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// Clients may call getArgumentAccesses 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
|
||||||
|
// does not access any other memory.
|
||||||
|
//
|
||||||
|
// Clients may call getArgumentAccesses to get specific information about
|
||||||
|
// how pointer arguments and globals 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 {
|
||||||
|
/// V - The value this record corresponds to. This may be an Argument for
|
||||||
|
/// 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
|
||||||
|
/// record is not returned for a particular argument, the argument is never
|
||||||
|
/// dead and never dereferenced.
|
||||||
|
enum AccessType {
|
||||||
|
/// 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,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/// 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
|
/// doesNotAccessMemory - If the specified function is known to never read or
|
||||||
/// write memory, return true. If the function only reads from known-constant
|
/// 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
|
/// memory, it is also legal to return true. Functions that unwind the stack
|
||||||
@ -111,7 +198,9 @@ public:
|
|||||||
///
|
///
|
||||||
/// This property corresponds to the GCC 'const' attribute.
|
/// This property corresponds to the GCC 'const' attribute.
|
||||||
///
|
///
|
||||||
virtual bool doesNotAccessMemory(Function *F);
|
bool doesNotAccessMemory(Function *F) {
|
||||||
|
return getModRefBehavior(F, CallSite()) == DoesNotAccessMemory;
|
||||||
|
}
|
||||||
|
|
||||||
/// onlyReadsMemory - If the specified function is known to only read from
|
/// onlyReadsMemory - If the specified function is known to only read from
|
||||||
/// non-volatile memory (or not access memory at all), return true. Functions
|
/// non-volatile memory (or not access memory at all), return true. Functions
|
||||||
@ -122,18 +211,12 @@ public:
|
|||||||
///
|
///
|
||||||
/// This property corresponds to the GCC 'pure' attribute.
|
/// This property corresponds to the GCC 'pure' attribute.
|
||||||
///
|
///
|
||||||
virtual bool onlyReadsMemory(Function *F);
|
bool onlyReadsMemory(Function *F) {
|
||||||
|
/// FIXME: If the analysis returns more precise info, we can reduce it to this.
|
||||||
|
return getModRefBehavior(F, CallSite()) == OnlyReadsMemory;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
|
||||||
/// Simple mod/ref information...
|
|
||||||
///
|
|
||||||
|
|
||||||
/// ModRefResult - Represent the result of a mod/ref query. Mod and Ref are
|
|
||||||
/// bits which may be or'd together.
|
|
||||||
///
|
|
||||||
enum ModRefResult { NoModRef = 0, Ref = 1, Mod = 2, ModRef = 3 };
|
|
||||||
|
|
||||||
/// getModRefInfo - Return information about whether or not an instruction may
|
/// getModRefInfo - Return information about whether or not an instruction may
|
||||||
/// read or write memory specified by the pointer operand. An instruction
|
/// read or write memory specified by the pointer operand. An instruction
|
||||||
/// that doesn't read or write memory may be trivially LICM'd for example.
|
/// that doesn't read or write memory may be trivially LICM'd for example.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user