[llvm-commits] [llvm] r67979 - in /llvm/trunk/include/llvm: ADT/PointerIntPair.h Instruction.h Support/PointerLikeTypeTraits.h Use.h
Bill Wendling
isanbard at gmail.com
Sat Mar 28 21:57:16 PDT 2009
Hi Chris,
This is breaking the builds:
http://blamebot.apple.com:8020/builders/full-llvm-OSX/builds/958/steps/shell/logs/stdio
Could you investigate please? :-)
-bw
On Mar 28, 2009, at 9:32 PM, Chris Lattner wrote:
> Author: lattner
> Date: Sat Mar 28 23:32:37 2009
> New Revision: 67979
>
> URL: http://llvm.org/viewvc/llvm-project?rev=67979&view=rev
> Log:
> Replace the PointerLikeTypeTraits::getNumLowBitsAvailable
> function with a new NumLowBitsAvailable enum, which makes the
> value available as an integer constant expression.
>
> Add PointerLikeTypeTraits specializations for Instruction* and
> Use** since they are only guaranteed 4-byte aligned.
>
> Enhance PointerIntPair to know about (and enforce) the alignment
> specified by PointerLikeTypeTraits. This should allow things
> like PointerIntPair<PointerIntPair<void*, 1,bool>, 1, bool>
> because the inner one knows that 2 low bits are free.
>
>
> Modified:
> llvm/trunk/include/llvm/ADT/PointerIntPair.h
> llvm/trunk/include/llvm/Instruction.h
> llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h
> llvm/trunk/include/llvm/Use.h
>
> Modified: llvm/trunk/include/llvm/ADT/PointerIntPair.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/PointerIntPair.h?rev=67979&r1=67978&r2=67979&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/ADT/PointerIntPair.h (original)
> +++ llvm/trunk/include/llvm/ADT/PointerIntPair.h Sat Mar 28 23:32:37
> 2009
> @@ -15,50 +15,77 @@
> #define LLVM_ADT_POINTERINTPAIR_H
>
> #include "llvm/Support/DataTypes.h"
> +#include "llvm/Support/PointerLikeTypeTraits.h"
> #include <cassert>
>
> namespace llvm {
>
> template<typename T>
> struct DenseMapInfo;
> -template<typename>
> -class PointerLikeTypeTraits;
>
> /// PointerIntPair - This class implements a pair of a pointer and
> small
> /// integer. It is designed to represent this in the space required
> by one
> /// pointer by bitmangling the integer into the low part of the
> pointer. This
> /// can only be done for small integers: typically up to 3 bits, but
> it depends
> -/// on the alignment returned by the allocator in use.
> +/// on the number of bits available according to
> PointerLikeTypeTraits for the
> +/// type.
> +///
> +/// Note that PointerIntPair always puts the Int part in the
> highest bits
> +/// possible. For example, PointerIntPair<void*, 1,bool> will put
> the bit for
> +/// the bool into bit #2, not bit #0, which allows the low two bits
> to be used
> +/// for something else. For example, this allows:
> +/// PointerIntPair<PointerIntPair<void*, 1,bool>, 1, bool>
> +/// ... and the two bools will land in different bits.
> ///
> template <typename PointerTy, unsigned IntBits, typename
> IntType=unsigned>
> class PointerIntPair {
> intptr_t Value;
> + typedef PointerLikeTypeTraits<PointerTy> PtrTraits;
> + enum {
> + /// PointerBitMask - The bits that come from the pointer.
> + PointerBitMask = ~(((intptr_t)1 <<
> PtrTraits::NumLowBitsAvailable)-1),
> + /// IntShift - The number of low bits that we reserve for other
> uses, and
> + /// keep zero.
> + IntShift = PtrTraits::NumLowBitsAvailable-IntBits,
> +
> + /// IntMask - This is the unshifted mask for valid bits of the
> int type.
> + IntMask = ((intptr_t)1 << IntBits)-1,
> +
> + // ShiftedIntMask - This is the bits for the integer shifted in
> place.
> + ShiftedIntMask = IntMask << IntShift
> + };
> public:
> PointerIntPair() : Value(0) {}
> PointerIntPair(PointerTy Ptr, IntType Int) : Value(0) {
> + assert(IntBits <= PtrTraits::NumLowBitsAvailable &&
> + "PointerIntPair formed with integer size too large for
> pointer");
> setPointer(Ptr);
> setInt(Int);
> }
>
> PointerTy getPointer() const {
> - return reinterpret_cast<PointerTy>(Value & ~((1 << IntBits)-1));
> + return reinterpret_cast<PointerTy>(Value & PointerBitMask);
> }
>
> IntType getInt() const {
> - return (IntType)(Value & ((1 << IntBits)-1));
> + return (IntType)((Value >> IntShift) & IntMask);
> }
>
> void setPointer(PointerTy Ptr) {
> intptr_t PtrVal = reinterpret_cast<intptr_t>(Ptr);
> - assert((PtrVal & ((1 << IntBits)-1)) == 0 &&
> + assert((PtrVal & ((1 << PtrTraits::NumLowBitsAvailable)-1)) ==
> 0 &&
> "Pointer is not sufficiently aligned");
> - Value = PtrVal | (intptr_t)getInt();
> + // Preserve all low bits, just update the pointer.
> + Value = PtrVal | (Value & ~PointerBitMask);
> }
>
> void setInt(IntType Int) {
> intptr_t IntVal = Int;
> assert(IntVal < (1 << IntBits) && "Integer too large for field");
> - Value = reinterpret_cast<intptr_t>(getPointer()) | IntVal;
> +
> + // Preserve all bits other than the ones we are updating.
> + Value &= ~ShiftedIntMask; // Remove integer field.
> + Value |= IntVal << IntShift; // Set new integer.
> }
>
> void *getOpaqueValue() const { return
> reinterpret_cast<void*>(Value); }
> @@ -107,7 +134,10 @@
> getFromVoidPointer(void *P) {
> return PointerIntPair<PointerTy, IntBits,
> IntType>::getFromOpaqueValue(P);
> }
> - static inline unsigned getNumLowBitsAvailable() { return 0; }
> + enum {
> + NumLowBitsAvailable =
> + PointerLikeTypeTraits<PointerTy>::NumLowBitsAvailable -
> IntBits
> + };
> };
>
> } // end namespace llvm
>
> Modified: llvm/trunk/include/llvm/Instruction.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Instruction.h?rev=67979&r1=67978&r2=67979&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/Instruction.h (original)
> +++ llvm/trunk/include/llvm/Instruction.h Sat Mar 28 23:32:37 2009
> @@ -227,6 +227,18 @@
> };
> };
>
> +// Instruction* is only 4-byte aligned.
> +template<>
> +class PointerLikeTypeTraits<Instruction*> {
> + typedef Instruction* PT;
> +public:
> + static inline void *getAsVoidPointer(PT P) { return P; }
> + static inline PT getFromVoidPointer(void *P) {
> + return static_cast<PT>(P);
> + }
> + enum { NumLowBitsAvailable = 2 };
> +};
> +
> } // End llvm namespace
>
> #endif
>
> Modified: llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h?rev=67979&r1=67978&r2=67979&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h (original)
> +++ llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h Sat Mar
> 28 23:32:37 2009
> @@ -42,7 +42,7 @@
> ///
> /// All clients should use assertions to do a run-time check to
> ensure that
> /// this is actually true.
> - static inline unsigned getNumLowBitsAvailable() { return 3; }
> + enum { NumLowBitsAvailable = 3 };
> };
>
> // Provide PointerLikeTypeTraits for const pointers.
> @@ -53,7 +53,7 @@
> static inline const T *getFromVoidPointer(const void *P) {
> return static_cast<const T*>(P);
> }
> - static inline unsigned getNumLowBitsAvailable() { return 3; }
> + enum { NumLowBitsAvailable = 3 };
> };
>
> } // end namespace llvm
>
> Modified: llvm/trunk/include/llvm/Use.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Use.h?rev=67979&r1=67978&r2=67979&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/Use.h (original)
> +++ llvm/trunk/include/llvm/Use.h Sat Mar 28 23:32:37 2009
> @@ -24,11 +24,21 @@
>
> class Value;
> class User;
> -
> +class Use;
>
> /// Tag - generic tag type for (at least 32 bit) pointers
> enum Tag { noTag, tagOne, tagTwo, tagThree };
>
> +// Use** is only 4-byte aligned.
> +template<>
> +class PointerLikeTypeTraits<Use**> {
> +public:
> + static inline void *getAsVoidPointer(Use** P) { return P; }
> + static inline Use **getFromVoidPointer(void *P) {
> + return static_cast<Use**>(P);
> + }
> + enum { NumLowBitsAvailable = 2 };
> +};
>
> //
> =
> =
> =
> ----------------------------------------------------------------------=
> ==//
> // Use Class
> @@ -212,7 +222,7 @@
>
> template<> struct simplify_type<const value_use_iterator<const User> >
> : public simplify_type<value_use_iterator<const User> > {};
> -
> +
> } // End llvm namespace
>
> #endif
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list