Add a new DenseSet abstraction.
authorChris Lattner <sabre@nondot.org>
Sun, 30 Sep 2007 00:47:20 +0000 (00:47 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 30 Sep 2007 00:47:20 +0000 (00:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42474 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/DenseSet.h [new file with mode: 0644]
lib/Analysis/IPA/Andersens.cpp

diff --git a/include/llvm/ADT/DenseSet.h b/include/llvm/ADT/DenseSet.h
new file mode 100644 (file)
index 0000000..1a1de8b
--- /dev/null
@@ -0,0 +1,61 @@
+//===- llvm/ADT/DenseSet.h - Dense probed hash table ------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by Chris Lattner and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the DenseSet class.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ADT_DENSESET_H
+#define LLVM_ADT_DENSESET_H
+
+#include "llvm/ADT/DenseMap.h"
+
+namespace llvm {
+
+/// DenseSet - This implements a dense probed hash-table based set.
+///
+/// FIXME: This is currently implemented directly in terms of DenseMap, this
+/// should be optimized later if there is a need.
+template<typename ValueT, typename ValueInfoT = DenseMapInfo<ValueT> >
+class DenseSet {
+  DenseMap<ValueT, char, ValueInfoT> TheMap;
+public:
+  DenseSet(const DenseSet &Other) : TheMap(Other.TheMap) {}
+  explicit DenseSet(unsigned NumInitBuckets = 64) : TheMap(NumInitBuckets) {}
+  
+  bool empty() const { return TheMap.empty(); }
+  unsigned size() const { return TheMap.size(); }
+  
+  // TODO add iterators.
+  
+  void clear() {
+    TheMap.clear();
+  }
+  
+  bool count(const ValueT &V) {
+    return TheMap.count(V);
+  }
+  
+  void insert(const ValueT &V) {
+    TheMap[V] = 0;
+  }
+  
+  void erase(const ValueT &V) {
+    TheMap.erase(V);
+  }
+  
+  DenseSet &operator=(const DenseSet &RHS) {
+    TheMap = RHS.TheMap;
+    return *this;
+  }
+};
+
+} // end namespace llvm
+
+#endif
index b6cb8f8f15bb9d72306978636265091434409d93..e20be6bcc27f71998321663ad4c18177940509cc 100644 (file)
@@ -65,7 +65,7 @@
 #include "llvm/Support/Debug.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/ADT/SparseBitVector.h"
-#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/DenseSet.h"
 #include <algorithm>
 #include <set>
 #include <list>
@@ -1773,7 +1773,7 @@ void Andersens::HUValNum(unsigned NodeIndex) {
 /// replaced by their the pointer equivalence class representative.
 void Andersens::RewriteConstraints() {
   std::vector<Constraint> NewConstraints;
-  DenseMap<Constraint, bool, ConstraintKeyInfo> Seen;
+  DenseSet<Constraint, ConstraintKeyInfo> Seen;
 
   PEClass2Node.clear();
   PENLEClass2Node.clear();
@@ -1811,10 +1811,10 @@ void Andersens::RewriteConstraints() {
     C.Src = FindEquivalentNode(RHSNode, RHSLabel);
     C.Dest = FindEquivalentNode(FindNode(LHSNode), LHSLabel);
     if (C.Src == C.Dest && C.Type == Constraint::Copy
-        || Seen[C] == true)
+        || Seen.count(C))
       continue;
 
-    Seen[C] = true;
+    Seen.insert(C);
     NewConstraints.push_back(C);
   }
   Constraints.swap(NewConstraints);