mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-23 16:19:52 +00:00
Add argmemonly attribute.
This change adds new attribute called "argmemonly". Function marked with this attribute can only access memory through it's argument pointers. This attribute directly corresponds to the "OnlyAccessesArgumentPointees" ModRef behaviour in alias analysis. Differential Revision: http://reviews.llvm.org/D10398 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241979 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -211,6 +211,8 @@ public:
|
||||
/// (if it has any) are non-volatile loads from objects pointed to by its
|
||||
/// pointer-typed arguments, with arbitrary offsets.
|
||||
///
|
||||
/// This property corresponds to the LLVM IR 'argmemonly' attribute combined
|
||||
/// with 'readonly' attribute.
|
||||
/// This property corresponds to the IntrReadArgMem LLVM intrinsic flag.
|
||||
OnlyReadsArgumentPointees = ArgumentPointees | Ref,
|
||||
|
||||
@@ -218,6 +220,7 @@ public:
|
||||
/// function (if it has any) are non-volatile loads and stores from objects
|
||||
/// pointed to by its pointer-typed arguments, with arbitrary offsets.
|
||||
///
|
||||
/// This property corresponds to the LLVM IR 'argmemonly' attribute.
|
||||
/// This property corresponds to the IntrReadWriteArgMem LLVM intrinsic flag.
|
||||
OnlyAccessesArgumentPointees = ArgumentPointees | ModRef,
|
||||
|
||||
|
||||
@@ -407,6 +407,7 @@ namespace bitc {
|
||||
ATTR_KIND_DEREFERENCEABLE_OR_NULL = 42,
|
||||
ATTR_KIND_CONVERGENT = 43,
|
||||
ATTR_KIND_SAFESTACK = 44,
|
||||
ATTR_KIND_ARGMEMONLY = 45
|
||||
};
|
||||
|
||||
enum ComdatSelectionKindCodes {
|
||||
|
||||
@@ -98,6 +98,8 @@ public:
|
||||
OptimizeNone, ///< Function must not be optimized.
|
||||
ReadNone, ///< Function does not access memory
|
||||
ReadOnly, ///< Function only reads from memory
|
||||
ArgMemOnly, ///< Funciton can access memory only using pointers
|
||||
///< based on its arguments.
|
||||
Returned, ///< Return value is always equal to this argument
|
||||
ReturnsTwice, ///< Function can return twice
|
||||
SExt, ///< Sign extended before/after call
|
||||
|
||||
@@ -290,6 +290,15 @@ public:
|
||||
CALLSITE_DELEGATE_SETTER(setOnlyReadsMemory());
|
||||
}
|
||||
|
||||
/// @brief Determine if the call can access memmory only using pointers based
|
||||
/// on its arguments.
|
||||
bool onlyAccessesArgMemory() const {
|
||||
CALLSITE_DELEGATE_GETTER(onlyAccessesArgMemory());
|
||||
}
|
||||
void setOnlyAccessesArgMemory() {
|
||||
CALLSITE_DELEGATE_SETTER(setOnlyAccessesArgMemory());
|
||||
}
|
||||
|
||||
/// @brief Determine if the call cannot return.
|
||||
bool doesNotReturn() const {
|
||||
CALLSITE_DELEGATE_GETTER(doesNotReturn());
|
||||
|
||||
@@ -293,6 +293,16 @@ public:
|
||||
addFnAttr(Attribute::ReadOnly);
|
||||
}
|
||||
|
||||
/// @brief Determine if the call can access memmory only using pointers based
|
||||
/// on its arguments.
|
||||
bool onlyAccessesArgMemory() const {
|
||||
return AttributeSets.hasAttribute(AttributeSet::FunctionIndex,
|
||||
Attribute::ArgMemOnly);
|
||||
}
|
||||
void setOnlyAccessesArgMemory() {
|
||||
addFnAttr(Attribute::ArgMemOnly);
|
||||
}
|
||||
|
||||
/// @brief Determine if the function cannot return.
|
||||
bool doesNotReturn() const {
|
||||
return AttributeSets.hasAttribute(AttributeSet::FunctionIndex,
|
||||
|
||||
@@ -1595,6 +1595,15 @@ public:
|
||||
addAttribute(AttributeSet::FunctionIndex, Attribute::ReadOnly);
|
||||
}
|
||||
|
||||
/// @brief Determine if the call can access memmory only using pointers based
|
||||
/// on its arguments.
|
||||
bool onlyAccessesArgMemory() const {
|
||||
return hasFnAttr(Attribute::ArgMemOnly);
|
||||
}
|
||||
void setOnlyAccessesArgMemory() {
|
||||
addAttribute(AttributeSet::FunctionIndex, Attribute::ArgMemOnly);
|
||||
}
|
||||
|
||||
/// \brief Determine if the call cannot return.
|
||||
bool doesNotReturn() const { return hasFnAttr(Attribute::NoReturn); }
|
||||
void setDoesNotReturn() {
|
||||
@@ -3364,6 +3373,15 @@ public:
|
||||
addAttribute(AttributeSet::FunctionIndex, Attribute::ReadOnly);
|
||||
}
|
||||
|
||||
/// @brief Determine if the call access memmory only using it's pointer
|
||||
/// arguments.
|
||||
bool onlyAccessesArgMemory() const {
|
||||
return hasFnAttr(Attribute::ArgMemOnly);
|
||||
}
|
||||
void setOnlyAccessesArgMemory() {
|
||||
addAttribute(AttributeSet::FunctionIndex, Attribute::ArgMemOnly);
|
||||
}
|
||||
|
||||
/// \brief Determine if the call cannot return.
|
||||
bool doesNotReturn() const { return hasFnAttr(Attribute::NoReturn); }
|
||||
void setDoesNotReturn() {
|
||||
|
||||
Reference in New Issue
Block a user