aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-09-30 00:47:20 +0000
committerChris Lattner <sabre@nondot.org>2007-09-30 00:47:20 +0000
commitbe207738d3b4bbfc9da11025ebbf10f4f12216b9 (patch)
tree26f783cc44b7a02727fcf398884887c69608aa66
parent3c5f0233e094ec5cea8e0f95af72fe29a7ce851d (diff)
Add a new DenseSet abstraction.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42474 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/DenseSet.h61
-rw-r--r--lib/Analysis/IPA/Andersens.cpp8
2 files changed, 65 insertions, 4 deletions
diff --git a/include/llvm/ADT/DenseSet.h b/include/llvm/ADT/DenseSet.h
new file mode 100644
index 0000000000..1a1de8b76f
--- /dev/null
+++ b/include/llvm/ADT/DenseSet.h
@@ -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
diff --git a/lib/Analysis/IPA/Andersens.cpp b/lib/Analysis/IPA/Andersens.cpp
index b6cb8f8f15..e20be6bcc2 100644
--- a/lib/Analysis/IPA/Andersens.cpp
+++ b/lib/Analysis/IPA/Andersens.cpp
@@ -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);