[llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp

2007-06-21 Thread Owen Anderson


Changes in directory llvm/lib/Support:

SmallPtrSet.cpp updated: 1.7 -> 1.8
---
Log message:

Fix a bug in SmallPtrSet that was causing GVNPRE to enter an infinite loop.


---
Diffs of the changes:  (+1 -1)

 SmallPtrSet.cpp |2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/lib/Support/SmallPtrSet.cpp
diff -u llvm/lib/Support/SmallPtrSet.cpp:1.7 
llvm/lib/Support/SmallPtrSet.cpp:1.8
--- llvm/lib/Support/SmallPtrSet.cpp:1.7Thu Jun 21 18:23:32 2007
+++ llvm/lib/Support/SmallPtrSet.cppThu Jun 21 19:11:18 2007
@@ -154,7 +154,7 @@
 // terminator.
 memcpy(CurArray, that.CurArray, sizeof(void*)*(CurArraySize+1));
   } else {
-CurArraySize = that.NumElements < 64 ? 128 : that.NumElements*2;
+CurArraySize = that.NumElements < 64 ? 128 : that.CurArraySize*2;
 CurArray = new void*[CurArraySize+1];
 memset(CurArray, -1, CurArraySize*sizeof(void*));
 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp

2007-06-21 Thread Chris Lattner


Changes in directory llvm/lib/Support:

SmallPtrSet.cpp updated: 1.6 -> 1.7
---
Log message:

Two changes:
 1. Make SmallPtrSet::erase faster in the small case by replacing a memmove
with a pointer copy.
 2. Fix a bug where the null terminator at the end of the array in the small
case was not copied


---
Diffs of the changes:  (+5 -4)

 SmallPtrSet.cpp |9 +
 1 files changed, 5 insertions(+), 4 deletions(-)


Index: llvm/lib/Support/SmallPtrSet.cpp
diff -u llvm/lib/Support/SmallPtrSet.cpp:1.6 
llvm/lib/Support/SmallPtrSet.cpp:1.7
--- llvm/lib/Support/SmallPtrSet.cpp:1.6Sat Apr 14 16:50:21 2007
+++ llvm/lib/Support/SmallPtrSet.cppThu Jun 21 18:23:32 2007
@@ -54,9 +54,8 @@
 for (void **APtr = SmallArray, **E = SmallArray+NumElements;
  APtr != E; ++APtr)
   if (*APtr == Ptr) {
-// If it is in the set, move everything over, replacing this element.
-memmove(APtr, APtr+1, sizeof(void*)*(E-APtr-1));
-// Clear the end element.
+// If it is in the set, replace this element.
+*APtr = E[-1];
 E[-1] = getEmptyMarker();
 --NumElements;
 return true;
@@ -151,7 +150,9 @@
   if (that.isSmall()) {
 CurArraySize = that.CurArraySize;
 CurArray = &SmallArray[0];
-memcpy(CurArray, that.CurArray, sizeof(void*)*CurArraySize);
+// Copy the entire contents of the array, including the -1's and the null
+// terminator.
+memcpy(CurArray, that.CurArray, sizeof(void*)*(CurArraySize+1));
   } else {
 CurArraySize = that.NumElements < 64 ? 128 : that.NumElements*2;
 CurArray = new void*[CurArraySize+1];



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp

2007-04-14 Thread Jeff Cohen


Changes in directory llvm/lib/Support:

SmallPtrSet.cpp updated: 1.5 -> 1.6
---
Log message:

Fix PR1329: http://llvm.org/PR1329 .

---
Diffs of the changes:  (+28 -0)

 SmallPtrSet.cpp |   28 
 1 files changed, 28 insertions(+)


Index: llvm/lib/Support/SmallPtrSet.cpp
diff -u llvm/lib/Support/SmallPtrSet.cpp:1.5 
llvm/lib/Support/SmallPtrSet.cpp:1.6
--- llvm/lib/Support/SmallPtrSet.cpp:1.5Tue Feb  6 19:11:25 2007
+++ llvm/lib/Support/SmallPtrSet.cppSat Apr 14 16:50:21 2007
@@ -141,5 +141,33 @@
 }
 
 delete [] OldBuckets;
+NumTombstones = 0;
+  }
+}
+
+SmallPtrSetImpl::SmallPtrSetImpl(const SmallPtrSetImpl& that) {
+  NumElements = that.NumElements;
+  NumTombstones = 0;
+  if (that.isSmall()) {
+CurArraySize = that.CurArraySize;
+CurArray = &SmallArray[0];
+memcpy(CurArray, that.CurArray, sizeof(void*)*CurArraySize);
+  } else {
+CurArraySize = that.NumElements < 64 ? 128 : that.NumElements*2;
+CurArray = new void*[CurArraySize+1];
+memset(CurArray, -1, CurArraySize*sizeof(void*));
+
+// The end pointer, always valid, is set to a valid element to help the
+// iterator.
+CurArray[CurArraySize] = 0;
+
+// Copy over all valid entries.
+for (void **BucketPtr = that.CurArray, **E = that.CurArray+CurArraySize;
+ BucketPtr != E; ++BucketPtr) {
+  // Copy over the element if it is valid.
+  void *Elt = *BucketPtr;
+  if (Elt != getTombstoneMarker() && Elt != getEmptyMarker())
+*const_cast(FindBucketFor(Elt)) = Elt;
+}
   }
 }



___
llvm-commits mailing list
[EMAIL PROTECTED]
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp

2007-02-06 Thread Chris Lattner


Changes in directory llvm/lib/Support:

SmallPtrSet.cpp updated: 1.4 -> 1.5
---
Log message:

do not let the table fill up with tombstones.


---
Diffs of the changes:  (+5 -1)

 SmallPtrSet.cpp |6 +-
 1 files changed, 5 insertions(+), 1 deletion(-)


Index: llvm/lib/Support/SmallPtrSet.cpp
diff -u llvm/lib/Support/SmallPtrSet.cpp:1.4 
llvm/lib/Support/SmallPtrSet.cpp:1.5
--- llvm/lib/Support/SmallPtrSet.cpp:1.4Mon Feb  5 17:10:31 2007
+++ llvm/lib/Support/SmallPtrSet.cppTue Feb  6 19:11:25 2007
@@ -32,7 +32,8 @@
   }
   
   // If more than 3/4 of the array is full, grow.
-  if (NumElements*4 >= CurArraySize*3)
+  if (NumElements*4 >= CurArraySize*3 ||
+  CurArraySize-(NumElements+NumTombstones) < CurArraySize/8)
 Grow();
   
   // Okay, we know we have space.  Find a hash bucket.
@@ -40,6 +41,8 @@
   if (*Bucket == Ptr) return false; // Already inserted, good.
   
   // Otherwise, insert it!
+  if (*Bucket == getTombstoneMarker())
+--NumTombstones;
   *Bucket = Ptr;
   ++NumElements;  // Track density.
   return true;
@@ -69,6 +72,7 @@
   // Set this as a tombstone.
   *Bucket = getTombstoneMarker();
   --NumElements;
+  ++NumTombstones;
   return true;
 }
 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp

2007-02-05 Thread Chris Lattner


Changes in directory llvm/lib/Support:

SmallPtrSet.cpp updated: 1.3 -> 1.4
---
Log message:

Fix a bug in smallptrset::erase: in the small case, return true if the 
element was in the set.


---
Diffs of the changes:  (+1 -1)

 SmallPtrSet.cpp |2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/lib/Support/SmallPtrSet.cpp
diff -u llvm/lib/Support/SmallPtrSet.cpp:1.3 
llvm/lib/Support/SmallPtrSet.cpp:1.4
--- llvm/lib/Support/SmallPtrSet.cpp:1.3Sat Jan 27 01:59:10 2007
+++ llvm/lib/Support/SmallPtrSet.cppMon Feb  5 17:10:31 2007
@@ -56,7 +56,7 @@
 // Clear the end element.
 E[-1] = getEmptyMarker();
 --NumElements;
-return false;
+return true;
   }
 
 return false;



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp

2007-01-26 Thread Chris Lattner


Changes in directory llvm/lib/Support:

SmallPtrSet.cpp updated: 1.2 -> 1.3
---
Log message:

implement SmallPtrSet::erase


---
Diffs of the changes:  (+27 -0)

 SmallPtrSet.cpp |   27 +++
 1 files changed, 27 insertions(+)


Index: llvm/lib/Support/SmallPtrSet.cpp
diff -u llvm/lib/Support/SmallPtrSet.cpp:1.2 
llvm/lib/Support/SmallPtrSet.cpp:1.3
--- llvm/lib/Support/SmallPtrSet.cpp:1.2Sat Jan 27 01:18:32 2007
+++ llvm/lib/Support/SmallPtrSet.cppSat Jan 27 01:59:10 2007
@@ -45,6 +45,33 @@
   return true;
 }
 
+bool SmallPtrSetImpl::erase(void *Ptr) {
+  if (isSmall()) {
+// Check to see if it is in the set.
+for (void **APtr = SmallArray, **E = SmallArray+NumElements;
+ APtr != E; ++APtr)
+  if (*APtr == Ptr) {
+// If it is in the set, move everything over, replacing this element.
+memmove(APtr, APtr+1, sizeof(void*)*(E-APtr-1));
+// Clear the end element.
+E[-1] = getEmptyMarker();
+--NumElements;
+return false;
+  }
+
+return false;
+  }
+  
+  // Okay, we know we have space.  Find a hash bucket.
+  void **Bucket = const_cast(FindBucketFor(Ptr));
+  if (*Bucket != Ptr) return false;  // Not in the set?
+
+  // Set this as a tombstone.
+  *Bucket = getTombstoneMarker();
+  --NumElements;
+  return true;
+}
+
 void * const *SmallPtrSetImpl::FindBucketFor(void *Ptr) const {
   unsigned Bucket = Hash(Ptr);
   unsigned ArraySize = CurArraySize;



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp

2007-01-26 Thread Chris Lattner


Changes in directory llvm/lib/Support:

SmallPtrSet.cpp updated: 1.1 -> 1.2
---
Log message:

add a note


---
Diffs of the changes:  (+2 -1)

 SmallPtrSet.cpp |3 ++-
 1 files changed, 2 insertions(+), 1 deletion(-)


Index: llvm/lib/Support/SmallPtrSet.cpp
diff -u llvm/lib/Support/SmallPtrSet.cpp:1.1 
llvm/lib/Support/SmallPtrSet.cpp:1.2
--- llvm/lib/Support/SmallPtrSet.cpp:1.1Sat Jan 27 01:10:46 2007
+++ llvm/lib/Support/SmallPtrSet.cppSat Jan 27 01:18:32 2007
@@ -7,7 +7,8 @@
 //
 
//===--===//
 //
-// This file implements the SmallPtrSet class.
+// This file implements the SmallPtrSet class.  See SmallPtrSet.h for an
+// overview of the algorithm.
 //
 
//===--===//
 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/SmallPtrSet.cpp

2007-01-26 Thread Chris Lattner


Changes in directory llvm/lib/Support:

SmallPtrSet.cpp added (r1.1)
---
Log message:

Add a new SmallSet ADT specialized for pointers.


---
Diffs of the changes:  (+113 -0)

 SmallPtrSet.cpp |  113 
 1 files changed, 113 insertions(+)


Index: llvm/lib/Support/SmallPtrSet.cpp
diff -c /dev/null llvm/lib/Support/SmallPtrSet.cpp:1.1
*** /dev/null   Sat Jan 27 01:10:56 2007
--- llvm/lib/Support/SmallPtrSet.cppSat Jan 27 01:10:46 2007
***
*** 0 
--- 1,113 
+ //===- llvm/ADT/SmallPtrSet.cpp - 'Normally small' pointer set 
===//
+ //
+ // 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 implements the SmallPtrSet class.
+ //
+ 
//===--===//
+ 
+ #include "llvm/ADT/SmallPtrSet.h"
+ using namespace llvm;
+ 
+ bool SmallPtrSetImpl::insert(void *Ptr) {
+   if (isSmall()) {
+ // Check to see if it is already in the set.
+ for (void **APtr = SmallArray, **E = SmallArray+NumElements;
+  APtr != E; ++APtr)
+   if (*APtr == Ptr)
+ return false;
+ 
+ // Nope, there isn't.  If we stay small, just 'pushback' now.
+ if (NumElements < CurArraySize-1) {
+   SmallArray[NumElements++] = Ptr;
+   return true;
+ }
+ // Otherwise, hit the big set case, which will call grow.
+   }
+   
+   // If more than 3/4 of the array is full, grow.
+   if (NumElements*4 >= CurArraySize*3)
+ Grow();
+   
+   // Okay, we know we have space.  Find a hash bucket.
+   void **Bucket = const_cast(FindBucketFor(Ptr));
+   if (*Bucket == Ptr) return false; // Already inserted, good.
+   
+   // Otherwise, insert it!
+   *Bucket = Ptr;
+   ++NumElements;  // Track density.
+   return true;
+ }
+ 
+ void * const *SmallPtrSetImpl::FindBucketFor(void *Ptr) const {
+   unsigned Bucket = Hash(Ptr);
+   unsigned ArraySize = CurArraySize;
+   unsigned ProbeAmt = 1;
+   void *const *Array = CurArray;
+   void *const *Tombstone = 0;
+   while (1) {
+ // Found Ptr's bucket?
+ if (Array[Bucket] == Ptr)
+   return Array+Bucket;
+ 
+ // If we found an empty bucket, the pointer doesn't exist in the set.
+ // Return a tombstone if we've seen one so far, or the empty bucket if
+ // not.
+ if (Array[Bucket] == getEmptyMarker())
+   return Tombstone ? Tombstone : Array+Bucket;
+ 
+ // If this is a tombstone, remember it.  If Ptr ends up not in the set, we
+ // prefer to return it than something that would require more probing.
+ if (Array[Bucket] == getTombstoneMarker() && !Tombstone)
+   Tombstone = Array+Bucket;  // Remember the first tombstone found.
+ 
+ // It's a hash collision or a tombstone. Reprobe.
+ Bucket = (Bucket + ProbeAmt++) & (ArraySize-1);
+   }
+ }
+ 
+ /// Grow - Allocate a larger backing store for the buckets and move it over.
+ ///
+ void SmallPtrSetImpl::Grow() {
+   // Allocate at twice as many buckets, but at least 128.
+   unsigned OldSize = CurArraySize;
+   unsigned NewSize = OldSize < 64 ? 128 : OldSize*2;
+   
+   void **OldBuckets = CurArray;
+   bool WasSmall = isSmall();
+   
+   // Install the new array.  Clear all the buckets to empty.
+   CurArray = new void*[NewSize+1];
+   CurArraySize = NewSize;
+   memset(CurArray, -1, NewSize*sizeof(void*));
+   
+   // The end pointer, always valid, is set to a valid element to help the
+   // iterator.
+   CurArray[NewSize] = 0;
+   
+   // Copy over all the elements.
+   if (WasSmall) {
+ // Small sets store their elements in order.
+ for (void **BucketPtr = OldBuckets, **E = OldBuckets+NumElements;
+  BucketPtr != E; ++BucketPtr) {
+   void *Elt = *BucketPtr;
+   *const_cast(FindBucketFor(Elt)) = Elt;
+ }
+   } else {
+ // Copy over all valid entries.
+ for (void **BucketPtr = OldBuckets, **E = OldBuckets+OldSize;
+  BucketPtr != E; ++BucketPtr) {
+   // Copy over the element if it is valid.
+   void *Elt = *BucketPtr;
+   if (Elt != getTombstoneMarker() && Elt != getEmptyMarker())
+ *const_cast(FindBucketFor(Elt)) = Elt;
+ }
+ 
+ delete [] OldBuckets;
+   }
+ }



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits