symbol_table: Prehash the key on insert, and reuse the entry on shadowing.

Mostly saves computing the hash twice, but while we're here there's no
need for shadowing to walk the table again.

Release Mesa build runtime of
KHR-Single-GL46.arrays_of_arrays_gl.SizedDeclarationsPrimitive -4.19869%
+/- 3.20231%

Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22451>
This commit is contained in:
Emma Anholt
2023-04-12 12:13:24 -07:00
committed by Marge Bot
parent 46498abbac
commit 00b9685d96
+7 -3
View File
@@ -176,7 +176,9 @@ _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table,
const char *name, void *declaration)
{
struct symbol *new_sym;
struct symbol *sym = find_symbol(table, name);
uint32_t hash = _mesa_hash_string(name);
struct hash_entry *entry = _mesa_hash_table_search_pre_hashed(table->ht, hash, name);
struct symbol *sym = entry ? entry->data : NULL;
if (sym && sym->depth == table->depth)
return -1;
@@ -191,9 +193,13 @@ _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table,
/* Store link to symbol in outer scope with the same name */
new_sym->next_with_same_name = sym;
new_sym->name = sym->name;
entry->data = new_sym;
} else {
new_sym->name = (char *)(new_sym + 1);
strcpy(new_sym->name, name);
_mesa_hash_table_insert_pre_hashed(table->ht, hash, new_sym->name, new_sym);
}
new_sym->next_with_same_scope = table->current_scope->symbols;
@@ -202,8 +208,6 @@ _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table,
table->current_scope->symbols = new_sym;
_mesa_hash_table_insert(table->ht, new_sym->name, new_sym);
return 0;
}