X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FUse.h;h=e1ebc6a51be5d62eaa72422e79667d7ffdcee7a6;hb=24312230ada6f4cfa8776351dafb12eea8a81b33;hp=32cdd1b95ddb362d29f32d081bd5598bd381b364;hpb=f385167b85abf9cb63a0bec94732d7185ee74e36;p=oota-llvm.git diff --git a/include/llvm/Use.h b/include/llvm/Use.h index 32cdd1b95dd..e1ebc6a51be 100644 --- a/include/llvm/Use.h +++ b/include/llvm/Use.h @@ -11,14 +11,24 @@ // instruction or some other User instance which refers to a Value. The Use // class keeps the "use list" of the referenced value up to date. // +// Pointer tagging is used to efficiently find the User corresponding +// to a Use without having to store a User pointer in every Use. A +// User is preceded in memory by all the Uses corresponding to its +// operands, and the low bits of one of the fields (Prev) of the Use +// class are used to encode offsets to be able to find that User given +// a pointer to any Use. For details, see: +// +// http://www.llvm.org/docs/ProgrammersManual.html#UserLayout +// //===----------------------------------------------------------------------===// #ifndef LLVM_USE_H #define LLVM_USE_H #include "llvm/Support/Casting.h" -#include "llvm/ADT/iterator.h" #include "llvm/ADT/PointerIntPair.h" +#include +#include namespace llvm { @@ -29,6 +39,17 @@ 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 { +public: + static inline void *getAsVoidPointer(Use** P) { return P; } + static inline Use **getFromVoidPointer(void *P) { + return static_cast(P); + } + enum { NumLowBitsAvailable = 2 }; +}; + //===----------------------------------------------------------------------===// // Use Class //===----------------------------------------------------------------------===// @@ -138,8 +159,9 @@ template<> struct simplify_type { template // UserTy == 'User' or 'const User' -class value_use_iterator : public forward_iterator { - typedef forward_iterator super; +class value_use_iterator : public std::iterator { + typedef std::iterator super; typedef value_use_iterator _Self; Use *U; @@ -188,30 +210,6 @@ public: unsigned getOperandNo() const; }; - -template<> struct simplify_type > { - typedef User* SimpleType; - - static SimpleType getSimplifiedValue(const value_use_iterator &Val) { - return *Val; - } -}; - -template<> struct simplify_type > - : public simplify_type > {}; - -template<> struct simplify_type > { - typedef const User* SimpleType; - - static SimpleType getSimplifiedValue(const - value_use_iterator &Val) { - return *Val; - } -}; - -template<> struct simplify_type > - : public simplify_type > {}; - } // End llvm namespace #endif