1.1 --- a/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp Wed Sep 23 15:18:53 2020 +0300 1.2 +++ b/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp Wed Sep 23 16:26:20 2020 +0300 1.3 @@ -150,7 +150,7 @@ 1.4 assert(worker_id < _nlists, "Invalid worker id"); 1.5 1.6 entry->set_obj(NULL); 1.7 - entry->set_java_hash(0); 1.8 + entry->set_hash(0); 1.9 1.10 if (_cached[worker_id].length() < _max_list_length) { 1.11 // Cache is not full 1.12 @@ -237,14 +237,10 @@ 1.13 _table = new G1StringDedupTable(_min_size); 1.14 } 1.15 1.16 -void G1StringDedupTable::add(typeArrayOop value, uint64_t hash, G1StringDedupEntry** list) { 1.17 +void G1StringDedupTable::add(typeArrayOop value, unsigned int hash, G1StringDedupEntry** list) { 1.18 G1StringDedupEntry* entry = _entry_cache->alloc(); 1.19 entry->set_obj(value); 1.20 - if (use_java_hash()) { 1.21 - entry->set_java_hash((unsigned int)hash); 1.22 - } else { 1.23 - entry->set_alt_hash(hash); 1.24 - } 1.25 + entry->set_hash(hash); 1.26 entry->set_next(*list); 1.27 *list = entry; 1.28 _entries++; 1.29 @@ -259,7 +255,7 @@ 1.30 void G1StringDedupTable::transfer(G1StringDedupEntry** pentry, G1StringDedupTable* dest) { 1.31 G1StringDedupEntry* entry = *pentry; 1.32 *pentry = entry->next(); 1.33 - uint64_t hash = use_java_hash() ? entry->java_hash() : entry->alt_hash(); 1.34 + unsigned int hash = entry->hash(); 1.35 size_t index = dest->hash_to_index(hash); 1.36 G1StringDedupEntry** list = dest->bucket(index); 1.37 entry->set_next(*list); 1.38 @@ -274,10 +270,10 @@ 1.39 value1->length() * sizeof(jchar))))); 1.40 } 1.41 1.42 -typeArrayOop G1StringDedupTable::lookup(typeArrayOop value, uint64_t hash, 1.43 +typeArrayOop G1StringDedupTable::lookup(typeArrayOop value, unsigned int hash, 1.44 G1StringDedupEntry** list, uintx &count) { 1.45 for (G1StringDedupEntry* entry = *list; entry != NULL; entry = entry->next()) { 1.46 - if ((use_java_hash() ? entry->java_hash() : entry->alt_hash()) == hash) { 1.47 + if (entry->hash() == hash) { 1.48 typeArrayOop existing_value = entry->obj(); 1.49 if (equals(value, existing_value)) { 1.50 // Match found 1.51 @@ -291,7 +287,7 @@ 1.52 return NULL; 1.53 } 1.54 1.55 -typeArrayOop G1StringDedupTable::lookup_or_add_inner(typeArrayOop value, uint64_t hash) { 1.56 +typeArrayOop G1StringDedupTable::lookup_or_add_inner(typeArrayOop value, unsigned int hash) { 1.57 size_t index = hash_to_index(hash); 1.58 G1StringDedupEntry** list = bucket(index); 1.59 uintx count = 0; 1.60 @@ -315,25 +311,19 @@ 1.61 return existing_value; 1.62 } 1.63 1.64 -unsigned int G1StringDedupTable::java_hash_code(typeArrayOop value) { 1.65 - assert(use_java_hash(), "Should not use java hash code"); 1.66 +unsigned int G1StringDedupTable::hash_code(typeArrayOop value) { 1.67 unsigned int hash; 1.68 int length = value->length(); 1.69 const jchar* data = (jchar*)value->base(T_CHAR); 1.70 1.71 - hash = java_lang_String::hash_code(data, length); 1.72 - 1.73 + if (use_java_hash()) { 1.74 + hash = java_lang_String::hash_code(data, length); 1.75 + } else { 1.76 + hash = AltHashing::halfsiphash_32(_table->_hash_seed, (const uint16_t*)data, length); 1.77 + } 1.78 return hash; 1.79 } 1.80 1.81 -uint64_t G1StringDedupTable::alt_hash_code(typeArrayOop value) { 1.82 - assert(!use_java_hash(), "Should not use alt hash code"); 1.83 - 1.84 - int length = value->length(); 1.85 - const jbyte* data = (jbyte*)value->base(T_BYTE); 1.86 - return AltHashing::halfsiphash_64(_table->_hash_seed, (const int8_t*)data, length); 1.87 -} 1.88 - 1.89 void G1StringDedupTable::deduplicate(oop java_string, G1StringDedupStat& stat) { 1.90 assert(java_lang_String::is_instance(java_string), "Must be a string"); 1.91 No_Safepoint_Verifier nsv; 1.92 @@ -347,7 +337,7 @@ 1.93 return; 1.94 } 1.95 1.96 - uint64_t hash = 0; 1.97 + unsigned int hash = 0; 1.98 1.99 if (use_java_hash()) { 1.100 // Get hash code from cache 1.101 @@ -356,7 +346,7 @@ 1.102 1.103 if (hash == 0) { 1.104 // Compute hash 1.105 - hash = alt_hash_code(value); 1.106 + hash = hash_code(value); 1.107 stat.inc_hashed(); 1.108 } 1.109 1.110 @@ -510,9 +500,8 @@ 1.111 // destination partitions. finish_rehash() will do a single 1.112 // threaded transfer of all entries. 1.113 typeArrayOop value = (typeArrayOop)*p; 1.114 - assert(!use_java_hash(), "Should not be using Java hash"); 1.115 - uint64_t hash = alt_hash_code(value); 1.116 - (*entry)->set_alt_hash(hash); 1.117 + unsigned int hash = hash_code(value); 1.118 + (*entry)->set_hash(hash); 1.119 } 1.120 1.121 // Move to next entry 1.122 @@ -575,14 +564,8 @@ 1.123 guarantee(Universe::heap()->is_in_reserved(value), "Object must be on the heap"); 1.124 guarantee(!value->is_forwarded(), "Object must not be forwarded"); 1.125 guarantee(value->is_typeArray(), "Object must be a typeArrayOop"); 1.126 - uint64_t hash; 1.127 - if (use_java_hash()) { 1.128 - hash = (*entry)->java_hash(); 1.129 - guarantee(java_hash_code(value) == hash, "Table entry has incorrect hash"); 1.130 - } else { 1.131 - hash = (*entry)->alt_hash(); 1.132 - guarantee(alt_hash_code(value) == hash, "Table entry has incorrect hash"); 1.133 - } 1.134 + unsigned int hash = hash_code(value); 1.135 + guarantee((*entry)->hash() == hash, "Table entry has inorrect hash"); 1.136 guarantee(_table->hash_to_index(hash) == bucket, "Table entry has incorrect index"); 1.137 entry = (*entry)->next_addr(); 1.138 } 1.139 @@ -597,10 +580,7 @@ 1.140 G1StringDedupEntry** entry2 = (*entry1)->next_addr(); 1.141 while (*entry2 != NULL) { 1.142 typeArrayOop value2 = (*entry2)->obj(); 1.143 - guarantee(value1 != value2, "Table entries must not have the same array"); 1.144 - if (use_java_hash()) { 1.145 - guarantee(!equals(value1, value2), "Table entries must not have identical arrays"); 1.146 - } 1.147 + guarantee(!equals(value1, value2), "Table entries must not have identical arrays"); 1.148 entry2 = (*entry2)->next_addr(); 1.149 } 1.150 entry1 = (*entry1)->next_addr(); 1.151 @@ -619,7 +599,7 @@ 1.152 " [Size: " SIZE_FORMAT ", Min: " SIZE_FORMAT ", Max: " SIZE_FORMAT "]\n" 1.153 " [Entries: " UINTX_FORMAT ", Load: " G1_STRDEDUP_PERCENT_FORMAT_NS ", Cached: " UINTX_FORMAT ", Added: " UINTX_FORMAT ", Removed: " UINTX_FORMAT "]\n" 1.154 " [Resize Count: " UINTX_FORMAT ", Shrink Threshold: " UINTX_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT_NS "), Grow Threshold: " UINTX_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT_NS ")]\n" 1.155 - " [Rehash Count: " UINTX_FORMAT ", Rehash Threshold: " UINTX_FORMAT ", Hash Seed: " UINT64_FORMAT_X "]\n" 1.156 + " [Rehash Count: " UINTX_FORMAT ", Rehash Threshold: " UINTX_FORMAT ", Hash Seed: " UINT64_FORMAT "]\n" 1.157 " [Age Threshold: " UINTX_FORMAT "]", 1.158 G1_STRDEDUP_BYTES_PARAM(_table->_size * sizeof(G1StringDedupEntry*) + (_table->_entries + _entry_cache->size()) * sizeof(G1StringDedupEntry)), 1.159 _table->_size, _min_size, _max_size,