[llvm-commits] CVS: llvm/test/Libraries/libinstr/tracelib.c

Vikram Adve vadve at cs.uiuc.edu
Tue Jul 8 13:43:01 PDT 2003


Changes in directory llvm/test/Libraries/libinstr:

tracelib.c updated: 1.4 -> 1.5

---
Log message:

Pointer hash table reallocation code seems never to have been tested!
Unfortunately, reallocation also means that the pointer numbering will
change, so increase table size to try to avoid it.


---
Diffs of the changes:

Index: llvm/test/Libraries/libinstr/tracelib.c
diff -u llvm/test/Libraries/libinstr/tracelib.c:1.4 llvm/test/Libraries/libinstr/tracelib.c:1.5
--- llvm/test/Libraries/libinstr/tracelib.c:1.4	Mon Jun 23 21:46:47 2003
+++ llvm/test/Libraries/libinstr/tracelib.c	Tue Jul  8 13:42:44 2003
@@ -26,7 +26,7 @@
 
 /* Index IntegerHashFunc(const Generic value, const Index size) */
 #define IntegerHashFunc(value, size) \
-  (value % size)
+  (((value << 3) ^ (value >> 3)) % size)
 
 /* Index IntegerRehashFunc(const Generic oldHashValue, const Index size) */
 #define IntegerRehashFunc(oldHashValue, size) \
@@ -77,10 +77,9 @@
 void
 InitializeTable(PtrValueHashTable* ptrTable, Index newSize)
 {
-  ptrTable->table = (PtrValueHashEntry*) malloc(newSize *
+  ptrTable->table = (PtrValueHashEntry*) calloc(newSize,
                                                 sizeof(PtrValueHashEntry));
-  ptrTable->fullEmptyFlags = (FULLEMPTY*) malloc(newSize * sizeof(FULLEMPTY));
-  memset(ptrTable->fullEmptyFlags, '\0', newSize * sizeof(FULLEMPTY));
+  ptrTable->fullEmptyFlags = (FULLEMPTY*) calloc(newSize, sizeof(FULLEMPTY));
   ptrTable->capacity = newSize;
   ptrTable->size = 0;
 }
@@ -97,23 +96,41 @@
 void
 ReallocTable(PtrValueHashTable* ptrTable, Index newSize)
 {
-  if (newSize > ptrTable->capacity)
-    {
-      unsigned int i;
-      
-      PtrValueHashEntry* oldTable = ptrTable->table;
-      FULLEMPTY* oldFlags = ptrTable->fullEmptyFlags; 
-      Index oldSize = ptrTable->size;
-      
-      /* allocate the new storage and flags and re-insert the old entries */
-      InitializeTable(ptrTable, newSize);
-      for (i=0; i < oldSize; ++i) 
-        Insert(ptrTable, oldTable[i].key, oldTable[i].value);
-      assert(ptrTable->size == oldSize);
+  if (newSize <= ptrTable->capacity)
+    return;
+
+#ifndef NDEBUG
+  printf("\n***\n*** WARNING: REALLOCATING SPACE FOR POINTER HASH TABLE.\n");
+  printf("*** oldSize = %ld, oldCapacity = %ld\n***\n\n",
+         ptrTable->size, ptrTable->capacity); 
+  printf("*** NEW SEQUENCE NUMBER FOR A POINTER WILL PROBABLY NOT MATCH ");
+  printf(" THE OLD ONE!\n***\n\n");
+#endif
+
+  unsigned int i;
+  PtrValueHashEntry* oldTable = ptrTable->table;
+  FULLEMPTY* oldFlags = ptrTable->fullEmptyFlags; 
+  Index oldSize = ptrTable->size;
+  Index oldCapacity = ptrTable->capacity;
+  
+  /* allocate the new storage and flags and re-insert the old entries */
+  InitializeTable(ptrTable, newSize);
+  memcpy(ptrTable->table, oldTable,
+         oldCapacity * sizeof(PtrValueHashEntry));
+  memcpy(ptrTable->fullEmptyFlags, oldFlags,
+         oldCapacity * sizeof(FULLEMPTY));
+  ptrTable->size = oldSize;
+
+#ifndef NDEBUG
+  for (i=0; i < oldCapacity; ++i) {
+    assert(ptrTable->fullEmptyFlags[i] == oldFlags[i]);
+    assert(ptrTable->table[i].key == oldTable[i].key);
+    assert(ptrTable->table[i].value == oldTable[i].value);
+  }
+#endif
       
-      free(oldTable);
-      free(oldFlags);
-    }
+  free(oldTable);
+  free(oldFlags);
 }
 
 void
@@ -231,7 +248,7 @@
  *===---------------------------------------------------------------------===*/
 
 PtrValueHashTable* SequenceNumberTable = NULL;
-Index INITIAL_SIZE = 1 << 18;
+Index INITIAL_SIZE = 1 << 22;
 
 #define MAX_NUM_SAVED 1024
 





More information about the llvm-commits mailing list