diff options
author | Dan Gohman <gohman@apple.com> | 2009-06-14 22:55:07 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-06-14 22:55:07 +0000 |
commit | 444f49150df8a4280ccea20fc2839cd899fc7558 (patch) | |
tree | d448c1d612b56f388dfc5218db125a0454dd5ba9 | |
parent | 7f7c4366ca61b3dceea4e37b187e5e1d4447e1b8 (diff) |
Specialize DenseMapInfo for SCEVHandle, so that SCEVHandles can be
used as keys in DenseMaps.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73360 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Analysis/ScalarEvolution.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/include/llvm/Analysis/ScalarEvolution.h b/include/llvm/Analysis/ScalarEvolution.h index 62bd5dc1a1..aa9789c96a 100644 --- a/include/llvm/Analysis/ScalarEvolution.h +++ b/include/llvm/Analysis/ScalarEvolution.h @@ -25,6 +25,7 @@ #include "llvm/Analysis/LoopInfo.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/ValueHandle.h" +#include "llvm/ADT/DenseMap.h" #include <iosfwd> namespace llvm { @@ -34,6 +35,7 @@ namespace llvm { class SCEVHandle; class ScalarEvolution; class TargetData; + template<> struct DenseMapInfo<SCEVHandle>; /// SCEV - This class represents an analyzed expression in the program. These /// are reference-counted opaque objects that the client is not allowed to @@ -44,6 +46,7 @@ namespace llvm { mutable unsigned RefCount; friend class SCEVHandle; + friend class DenseMapInfo<SCEVHandle>; void addRef() const { ++RefCount; } void dropRef() const { if (--RefCount == 0) @@ -197,6 +200,31 @@ namespace llvm { template<> struct simplify_type<SCEVHandle> : public simplify_type<const SCEVHandle> {}; + // Specialize DenseMapInfo for SCEVHandle so that SCEVHandle may be used + // as a key in DenseMaps. + template<> + struct DenseMapInfo<SCEVHandle> { + static inline SCEVHandle getEmptyKey() { + static SCEVCouldNotCompute Empty; + if (Empty.RefCount == 0) + Empty.addRef(); + return &Empty; + } + static inline SCEVHandle getTombstoneKey() { + static SCEVCouldNotCompute Tombstone; + if (Tombstone.RefCount == 0) + Tombstone.addRef(); + return &Tombstone; + } + static unsigned getHashValue(const SCEVHandle &Val) { + return DenseMapInfo<const SCEV *>::getHashValue(Val); + } + static bool isEqual(const SCEVHandle &LHS, const SCEVHandle &RHS) { + return LHS == RHS; + } + static bool isPod() { return false; } + }; + /// ScalarEvolution - This class is the main scalar evolution driver. Because /// client code (intentionally) can't do much with the SCEV objects directly, /// they must ask this class for services. |