diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2008-12-15 01:34:58 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2008-12-15 01:34:58 +0000 |
commit | e642658480ed0c9cde023a165edca237ba90bd31 (patch) | |
tree | edaaf7d65af6cc9b3c06311be66b9cf764f65902 /include/llvm/Attributes.h | |
parent | 30baa95afdf1199c2c5514310907b01ce5584cf5 (diff) | |
download | llvm-e642658480ed0c9cde023a165edca237ba90bd31.tar.gz llvm-e642658480ed0c9cde023a165edca237ba90bd31.tar.bz2 llvm-e642658480ed0c9cde023a165edca237ba90bd31.tar.xz |
Introducing nocapture, a parameter attribute for pointers to indicate that the
callee will not introduce any new aliases of that pointer.
The attributes had all bits allocated already, so I decided to collapse
alignment. Alignment was previously stored as a 16-bit integer from bits 16 to
32 of the attribute, but it was required to be a power of 2. Now it's stored in
log2 encoded form in five bits from 16 to 21. That gives us 11 more bits of
space.
You may have already noticed that you only need four bits to encode a 16-bit
power of two, so why five bits? Because the AsmParser accepted 32-bit
alignments, even though we couldn't store them (they were silently discarded).
Now we can store them in memory, but not in the bitcode.
The bitcode format was already storing these as 64-bit VBR integers. So, the
bitcode format stays the same, keeping the alignment values stored as 16 bit
raw values. There's some hideous code in the reader and writer that deals with
this, waiting to be ripped out the moment we run out of bits again and have to
replace the parameter attributes table encoding.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61019 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Attributes.h')
-rw-r--r-- | include/llvm/Attributes.h | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h index 57f4e17c47..5cb581ae96 100644 --- a/include/llvm/Attributes.h +++ b/include/llvm/Attributes.h @@ -15,6 +15,7 @@ #ifndef LLVM_ATTRIBUTES_H #define LLVM_ATTRIBUTES_H +#include "llvm/Support/MathExtras.h" #include <cassert> #include <string> @@ -23,7 +24,7 @@ class Type; /// Attributes - A bitset of attributes. typedef unsigned Attributes; - + namespace Attribute { /// Function parameters and results can have attributes to indicate how they @@ -44,16 +45,17 @@ const Attributes ByVal = 1<<7; ///< Pass structure by value const Attributes Nest = 1<<8; ///< Nested function static chain const Attributes ReadNone = 1<<9; ///< Function does not access memory const Attributes ReadOnly = 1<<10; ///< Function only reads from memory -const Attributes NoInline = 1<<11; // inline=never -const Attributes AlwaysInline = 1<<12; // inline=always -const Attributes OptimizeForSize = 1<<13; // opt_size -const Attributes StackProtect = 1<<14; // Stack protection. -const Attributes StackProtectReq = 1<<15; // Stack protection required. -const Attributes Alignment = 0xffff<<16; ///< Alignment of parameter (16 bits) - // 0 = unknown, else in clear (not log) - +const Attributes NoInline = 1<<11; ///< inline=never +const Attributes AlwaysInline = 1<<12; ///< inline=always +const Attributes OptimizeForSize = 1<<13; ///< opt_size +const Attributes StackProtect = 1<<14; ///< Stack protection. +const Attributes StackProtectReq = 1<<15; ///< Stack protection required. +const Attributes Alignment = 31<<16; ///< Alignment of parameter (5 bits) + // stored as log2 of alignment. +const Attributes NoCapture = 1<<21; ///< Function creates no aliases of pointer + /// @brief Attributes that only apply to function parameters. -const Attributes ParameterOnly = ByVal | Nest | StructRet; +const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture; /// @brief Attributes that only apply to function. const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone | ReadOnly | @@ -64,7 +66,7 @@ const Attributes VarArgsIncompatible = StructRet; /// @brief Attributes that are mutually incompatible. const Attributes MutuallyIncompatible[4] = { - ByVal | InReg | Nest | StructRet, + ByVal | InReg | Nest | StructRet, ZExt | SExt, ReadNone | ReadOnly, NoInline | AlwaysInline @@ -76,7 +78,8 @@ Attributes typeIncompatible(const Type *Ty); /// This turns an int alignment (a power of 2, normally) into the /// form used internally in Attributes. inline Attributes constructAlignmentFromInt(unsigned i) { - return (i << 16); + assert(isPowerOf2_32(i) && "Alignment must be a power of two."); + return Log2_32(i) << 16; } /// The set of Attributes set in Attributes is converted to a |