From 18a9273e618895eb6c4b762adfc291268a30960c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 30 Sep 2007 00:47:20 +0000 Subject: [PATCH] Add a new DenseSet abstraction. llvm-svn: 42474 --- llvm/include/llvm/ADT/DenseSet.h | 61 +++++++++++++++++++++++++++++ llvm/lib/Analysis/IPA/Andersens.cpp | 8 ++-- 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 llvm/include/llvm/ADT/DenseSet.h diff --git a/llvm/include/llvm/ADT/DenseSet.h b/llvm/include/llvm/ADT/DenseSet.h new file mode 100644 index 000000000000..1a1de8b76f92 --- /dev/null +++ b/llvm/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 > +class DenseSet { + DenseMap 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/llvm/lib/Analysis/IPA/Andersens.cpp b/llvm/lib/Analysis/IPA/Andersens.cpp index b6cb8f8f15bb..e20be6bcc27f 100644 --- a/llvm/lib/Analysis/IPA/Andersens.cpp +++ b/llvm/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 #include #include @@ -1773,7 +1773,7 @@ void Andersens::HUValNum(unsigned NodeIndex) { /// replaced by their the pointer equivalence class representative. void Andersens::RewriteConstraints() { std::vector NewConstraints; - DenseMap Seen; + DenseSet 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);