From 444f49150df8a4280ccea20fc2839cd899fc7558 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Sun, 14 Jun 2009 22:55:07 +0000 Subject: [PATCH] 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 --- include/llvm/Analysis/ScalarEvolution.h | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/include/llvm/Analysis/ScalarEvolution.h b/include/llvm/Analysis/ScalarEvolution.h index 62bd5dc1a1c..aa9789c96a9 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 namespace llvm { @@ -34,6 +35,7 @@ namespace llvm { class SCEVHandle; class ScalarEvolution; class TargetData; + template<> struct DenseMapInfo; /// 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; void addRef() const { ++RefCount; } void dropRef() const { if (--RefCount == 0) @@ -197,6 +200,31 @@ namespace llvm { template<> struct simplify_type : public simplify_type {}; + // Specialize DenseMapInfo for SCEVHandle so that SCEVHandle may be used + // as a key in DenseMaps. + template<> + struct DenseMapInfo { + 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::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.