134b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//===- llvm/ADT/PointerIntPair.h - Pair for pointer and int -----*- C++ -*-===//
234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//
334b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//                     The LLVM Compiler Infrastructure
434b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//
534b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// This file is distributed under the University of Illinois Open Source
634b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// License. See LICENSE.TXT for details.
734b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//
834b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//===----------------------------------------------------------------------===//
934b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//
1034b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// This file defines the PointerIntPair class.
1134b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//
1234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//===----------------------------------------------------------------------===//
1334b763694e74ee16e68fd85488bfe0443c51170dChris Lattner
1434b763694e74ee16e68fd85488bfe0443c51170dChris Lattner#ifndef LLVM_ADT_POINTERINTPAIR_H
1534b763694e74ee16e68fd85488bfe0443c51170dChris Lattner#define LLVM_ADT_POINTERINTPAIR_H
1634b763694e74ee16e68fd85488bfe0443c51170dChris Lattner
17118a0659ab8a4d0e0af343b88e5fa71a5c1eb6a6Reid Kleckner#include "llvm/Support/Compiler.h"
18e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner#include "llvm/Support/PointerLikeTypeTraits.h"
1934b763694e74ee16e68fd85488bfe0443c51170dChris Lattner#include <cassert>
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <limits>
2134b763694e74ee16e68fd85488bfe0443c51170dChris Lattner
2234b763694e74ee16e68fd85488bfe0443c51170dChris Lattnernamespace llvm {
233a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename T> struct DenseMapInfo;
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerT, unsigned IntBits, typename PtrTraits>
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct PointerIntPairInfo;
283a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
2934b763694e74ee16e68fd85488bfe0443c51170dChris Lattner/// PointerIntPair - This class implements a pair of a pointer and small
30d55da4de048684e3791dbae8018666e5b7549506Chris Lattner/// integer.  It is designed to represent this in the space required by one
3134b763694e74ee16e68fd85488bfe0443c51170dChris Lattner/// pointer by bitmangling the integer into the low part of the pointer.  This
3234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner/// can only be done for small integers: typically up to 3 bits, but it depends
33e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// on the number of bits available according to PointerLikeTypeTraits for the
34e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// type.
35e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner///
36b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff/// Note that PointerIntPair always puts the IntVal part in the highest bits
3754e01d06db7c04208a684e34cb82b0847a077261Chris Lattner/// possible.  For example, PointerIntPair<void*, 1, bool> will put the bit for
38e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// the bool into bit #2, not bit #0, which allows the low two bits to be used
39e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// for something else.  For example, this allows:
4054e01d06db7c04208a684e34cb82b0847a077261Chris Lattner///   PointerIntPair<PointerIntPair<void*, 1, bool>, 1, bool>
41e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// ... and the two bools will land in different bits.
4234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner///
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerTy, unsigned IntBits, typename IntType = unsigned,
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          typename PtrTraits = PointerLikeTypeTraits<PointerTy>,
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          typename Info = PointerIntPairInfo<PointerTy, IntBits, PtrTraits>>
4634b763694e74ee16e68fd85488bfe0443c51170dChris Lattnerclass PointerIntPair {
4734b763694e74ee16e68fd85488bfe0443c51170dChris Lattner  intptr_t Value;
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
4934b763694e74ee16e68fd85488bfe0443c51170dChris Lattnerpublic:
5034b763694e74ee16e68fd85488bfe0443c51170dChris Lattner  PointerIntPair() : Value(0) {}
51b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff  PointerIntPair(PointerTy PtrVal, IntType IntVal) {
52b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff    setPointerAndInt(PtrVal, IntVal);
53acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis  }
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  explicit PointerIntPair(PointerTy PtrVal) { initWithPointer(PtrVal); }
5534b763694e74ee16e68fd85488bfe0443c51170dChris Lattner
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PointerTy getPointer() const { return Info::getPointer(Value); }
573a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
5834b763694e74ee16e68fd85488bfe0443c51170dChris Lattner  IntType getInt() const {
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return (IntType)Info::getInt(Value);
6034b763694e74ee16e68fd85488bfe0443c51170dChris Lattner  }
613a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
62b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff  void setPointer(PointerTy PtrVal) {
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = Info::updatePointer(Value, PtrVal);
6434b763694e74ee16e68fd85488bfe0443c51170dChris Lattner  }
653a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
66b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff  void setInt(IntType IntVal) {
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = Info::updateInt(Value, static_cast<intptr_t>(IntVal));
6834b763694e74ee16e68fd85488bfe0443c51170dChris Lattner  }
693a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
70b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff  void initWithPointer(PointerTy PtrVal) {
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = Info::updatePointer(0, PtrVal);
72acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis  }
73acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis
74b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff  void setPointerAndInt(PointerTy PtrVal, IntType IntVal) {
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = Info::updateInt(Info::updatePointer(0, PtrVal),
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            static_cast<intptr_t>(IntVal));
77acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis  }
78acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis
7938297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis  PointerTy const *getAddrOfPointer() const {
800db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis    return const_cast<PointerIntPair *>(this)->getAddrOfPointer();
810db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis  }
820db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis
830db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis  PointerTy *getAddrOfPointer() {
8438297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis    assert(Value == reinterpret_cast<intptr_t>(getPointer()) &&
8538297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis           "Can only return the address if IntBits is cleared and "
8638297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis           "PtrTraits doesn't change the pointer");
870db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis    return reinterpret_cast<PointerTy *>(&Value);
8838297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis  }
8938297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void *getOpaqueValue() const { return reinterpret_cast<void *>(Value); }
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void setFromOpaqueValue(void *Val) {
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = reinterpret_cast<intptr_t>(Val);
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
943a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
954d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner  static PointerIntPair getFromOpaqueValue(void *V) {
96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    PointerIntPair P;
97f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    P.setFromOpaqueValue(V);
98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return P;
994d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner  }
1006ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose
1016ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose  // Allow PointerIntPairs to be created from const void * if and only if the
1026ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose  // pointer type could be created from a const void *.
1036ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose  static PointerIntPair getFromOpaqueValue(const void *V) {
1046ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose    (void)PtrTraits::getFromVoidPointer(V);
1056ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose    return getFromOpaqueValue(const_cast<void *>(V));
1066ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose  }
1076ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose
108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool operator==(const PointerIntPair &RHS) const {
109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Value == RHS.Value;
110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool operator!=(const PointerIntPair &RHS) const {
112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Value != RHS.Value;
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool operator<(const PointerIntPair &RHS) const { return Value < RHS.Value; }
115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool operator>(const PointerIntPair &RHS) const { return Value > RHS.Value; }
116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool operator<=(const PointerIntPair &RHS) const {
117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Value <= RHS.Value;
118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool operator>=(const PointerIntPair &RHS) const {
120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Value >= RHS.Value;
121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerT, unsigned IntBits, typename PtrTraits>
125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct PointerIntPairInfo {
126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static_assert(PtrTraits::NumLowBitsAvailable <
127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    std::numeric_limits<uintptr_t>::digits,
128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                "cannot use a pointer type that has all bits free");
129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static_assert(IntBits <= PtrTraits::NumLowBitsAvailable,
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                "PointerIntPair with integer size too large for pointer");
131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  enum : uintptr_t {
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    /// PointerBitMask - The bits that come from the pointer.
133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    PointerBitMask =
134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ~(uintptr_t)(((intptr_t)1 << PtrTraits::NumLowBitsAvailable) - 1),
135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    /// IntShift - The number of low bits that we reserve for other uses, and
137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    /// keep zero.
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    IntShift = (uintptr_t)PtrTraits::NumLowBitsAvailable - IntBits,
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    /// IntMask - This is the unshifted mask for valid bits of the int type.
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    IntMask = (uintptr_t)(((intptr_t)1 << IntBits) - 1),
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // ShiftedIntMask - This is the bits for the integer shifted in place.
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ShiftedIntMask = (uintptr_t)(IntMask << IntShift)
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static PointerT getPointer(intptr_t Value) {
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return PtrTraits::getFromVoidPointer(
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        reinterpret_cast<void *>(Value & PointerBitMask));
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static intptr_t getInt(intptr_t Value) {
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return (Value >> IntShift) & IntMask;
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static intptr_t updatePointer(intptr_t OrigValue, PointerT Ptr) {
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    intptr_t PtrWord =
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        reinterpret_cast<intptr_t>(PtrTraits::getAsVoidPointer(Ptr));
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    assert((PtrWord & ~PointerBitMask) == 0 &&
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           "Pointer is not sufficiently aligned");
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Preserve all low bits, just update the pointer.
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return PtrWord | (OrigValue & ~PointerBitMask);
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static intptr_t updateInt(intptr_t OrigValue, intptr_t Int) {
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    intptr_t IntWord = static_cast<intptr_t>(Int);
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    assert((IntWord & ~IntMask) == 0 && "Integer too large for field");
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Preserve all bits other than the ones we are updating.
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return (OrigValue & ~ShiftedIntMask) | IntWord << IntShift;
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
17234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner};
17334b763694e74ee16e68fd85488bfe0443c51170dChris Lattner
1744bbf4ee1491637c247e195e19e3e4a8ee5ad72faChris Lattnertemplate <typename T> struct isPodLike;
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerTy, unsigned IntBits, typename IntType>
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct isPodLike<PointerIntPair<PointerTy, IntBits, IntType>> {
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static const bool value = true;
1784bbf4ee1491637c247e195e19e3e4a8ee5ad72faChris Lattner};
179f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
1809ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner// Provide specialization of DenseMapInfo for PointerIntPair.
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerTy, unsigned IntBits, typename IntType>
182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct DenseMapInfo<PointerIntPair<PointerTy, IntBits, IntType>> {
1839ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner  typedef PointerIntPair<PointerTy, IntBits, IntType> Ty;
1849ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner  static Ty getEmptyKey() {
1851144af3c9b4da48cd581156e05b24261c8de366aRichard Smith    uintptr_t Val = static_cast<uintptr_t>(-1);
18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Val <<= PointerLikeTypeTraits<Ty>::NumLowBitsAvailable;
18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return Ty::getFromOpaqueValue(reinterpret_cast<void *>(Val));
1889ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner  }
1899ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner  static Ty getTombstoneKey() {
1901144af3c9b4da48cd581156e05b24261c8de366aRichard Smith    uintptr_t Val = static_cast<uintptr_t>(-2);
191f341a47d10501bc69b5d4d2217992bb6e08668d8Chris Lattner    Val <<= PointerLikeTypeTraits<PointerTy>::NumLowBitsAvailable;
19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return Ty::getFromOpaqueValue(reinterpret_cast<void *>(Val));
1939ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner  }
1949ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner  static unsigned getHashValue(Ty V) {
1959ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner    uintptr_t IV = reinterpret_cast<uintptr_t>(V.getOpaqueValue());
1969ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner    return unsigned(IV) ^ unsigned(IV >> 9);
1979ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner  }
1989ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner  static bool isEqual(const Ty &LHS, const Ty &RHS) { return LHS == RHS; }
1999ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner};
2009ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner
2014d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner// Teach SmallPtrSet that PointerIntPair is "basically a pointer".
202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerTy, unsigned IntBits, typename IntType,
203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          typename PtrTraits>
204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass PointerLikeTypeTraits<
205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    PointerIntPair<PointerTy, IntBits, IntType, PtrTraits>> {
2064d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattnerpublic:
2074d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner  static inline void *
2084d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner  getAsVoidPointer(const PointerIntPair<PointerTy, IntBits, IntType> &P) {
2094d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner    return P.getOpaqueValue();
2104d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner  }
2114d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner  static inline PointerIntPair<PointerTy, IntBits, IntType>
2124d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner  getFromVoidPointer(void *P) {
2134d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner    return PointerIntPair<PointerTy, IntBits, IntType>::getFromOpaqueValue(P);
2144d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner  }
2156ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose  static inline PointerIntPair<PointerTy, IntBits, IntType>
2166ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose  getFromVoidPointer(const void *P) {
2176ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose    return PointerIntPair<PointerTy, IntBits, IntType>::getFromOpaqueValue(P);
2186ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose  }
219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  enum { NumLowBitsAvailable = PtrTraits::NumLowBitsAvailable - IntBits };
2204d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner};
2214d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner
22234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner} // end namespace llvm
22334b763694e74ee16e68fd85488bfe0443c51170dChris Lattner#endif
224