Specialize DenseMapInfo for SCEVHandle, so that SCEVHandles can be
authorDan Gohman <gohman@apple.com>
Sun, 14 Jun 2009 22:55:07 +0000 (22:55 +0000)
committerDan Gohman <gohman@apple.com>
Sun, 14 Jun 2009 22:55:07 +0000 (22:55 +0000)
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

index 62bd5dc1a1c743a05ac4fd625eaddad49710c348..aa9789c96a97958d83c1843979a1e00b978d31a6 100644 (file)
@@ -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.