Switch to densemap rather than std::set
authorDaniel Berlin <dberlin@dberlin.org>
Sat, 29 Sep 2007 00:50:40 +0000 (00:50 +0000)
committerDaniel Berlin <dberlin@dberlin.org>
Sat, 29 Sep 2007 00:50:40 +0000 (00:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42462 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/IPA/Andersens.cpp

index 63a6cb553e02e8f2fa9536105fe84f7fd7c4551a..b6cb8f8f15bb9d72306978636265091434409d93 100644 (file)
@@ -134,12 +134,18 @@ namespace {
         assert(Offset == 0 || Ty != AddressOf &&
                "Offset is illegal on addressof constraints");
       }
+
       bool operator==(const Constraint &RHS) const {
         return RHS.Type == Type
           && RHS.Dest == Dest
           && RHS.Src == Src
           && RHS.Offset == Offset;
       }
+
+      bool operator!=(const Constraint &RHS) const {
+        return !(*this == RHS);
+      }
+
       bool operator<(const Constraint &RHS) const {
         if (RHS.Type != Type)
           return RHS.Type < Type;
@@ -151,6 +157,23 @@ namespace {
       }
     };
 
+    struct ConstraintKeyInfo {
+      static inline Constraint getEmptyKey() {
+        return Constraint(Constraint::Copy, ~0UL, ~0UL, ~0UL);
+      }
+      static inline Constraint getTombstoneKey() {
+        return Constraint(Constraint::Copy, ~0UL - 1, ~0UL - 1, ~0UL - 1);
+      }
+      static unsigned getHashValue(const Constraint &C) {
+        return C.Src ^ C.Dest ^ C.Type ^ C.Offset;
+      }
+      static bool isEqual(const Constraint &LHS,
+                          const Constraint &RHS) {
+        return LHS.Type == RHS.Type && LHS.Dest == RHS.Dest
+          && LHS.Src == RHS.Src && LHS.Offset == RHS.Offset;
+      }
+    };
+
     // Node class - This class is used to represent a node in the constraint
     // graph.  Due to various optimizations, it is not always the case that
     // there is a mapping from a Node to a Value.  In particular, we add
@@ -1750,7 +1773,7 @@ void Andersens::HUValNum(unsigned NodeIndex) {
 /// replaced by their the pointer equivalence class representative.
 void Andersens::RewriteConstraints() {
   std::vector<Constraint> NewConstraints;
-  std::set<Constraint> Seen;
+  DenseMap<Constraint, bool, ConstraintKeyInfo> Seen;
 
   PEClass2Node.clear();
   PENLEClass2Node.clear();
@@ -1788,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.count(C) != 0)
+        || Seen[C] == true)
       continue;
 
-    Seen.insert(C);
+    Seen[C] = true;
     NewConstraints.push_back(C);
   }
   Constraints.swap(NewConstraints);