symbol_table: Prehash the key on insert, and reuse the entry on shadowing.
authorEmma Anholt <emma@anholt.net>
Wed, 12 Apr 2023 19:13:24 +0000 (12:13 -0700)
committerMarge Bot <emma+marge@anholt.net>
Sat, 15 Apr 2023 18:33:25 +0000 (18:33 +0000)
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>

src/mesa/program/symbol_table.c

index e988af2..834baf8 100644 (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;
 }