[Mesa-dev] [PATCH] glsl: fix key used for hashing switch statement cases

Tapani Pälli tapani.palli at intel.com
Fri Aug 19 04:42:36 UTC 2016



On 08/18/2016 09:08 PM, Eric Anholt wrote:
> Tapani Pälli <tapani.palli at intel.com> writes:
>
>> Implementation previously used case value itself as the key, however
>> afterhash implementation change by ee02a5e we cannot use 0 as key.
>> Patch uses _mesa_hash_data to formulate a suitable key for this hash.
>>
>> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97309
>> ---
>>  src/compiler/glsl/ast_to_hir.cpp | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
>> index e03a6e3..53fc4d6 100644
>> --- a/src/compiler/glsl/ast_to_hir.cpp
>> +++ b/src/compiler/glsl/ast_to_hir.cpp
>> @@ -6180,9 +6180,11 @@ ast_case_label::hir(exec_list *instructions,
>>           /* Stuff a dummy value in to allow processing to continue. */
>>           label_const = new(ctx) ir_constant(0);
>>        } else {
>> +         unsigned hash_key = _mesa_hash_data(&label_const->value.u[0],
>> +                                             sizeof(unsigned));
>>           ast_expression *previous_label = (ast_expression *)
>>           hash_table_find(state->switch_state.labels_ht,
>> -                         (void *)(uintptr_t)label_const->value.u[0]);
>> +                         (void *)(uintptr_t)hash_key);
>>
>>           if (previous_label) {
>>              YYLTYPE loc = this->test_value->get_location();
>> @@ -6193,7 +6195,7 @@ ast_case_label::hir(exec_list *instructions,
>>           } else {
>>              hash_table_insert(state->switch_state.labels_ht,
>>                                this->test_value,
>> -                              (void *)(uintptr_t)label_const->value.u[0]);
>> +                              (void *)(uintptr_t)hash_key);
>
> _mesa_hash_data(...) could *also* be zero.  It'll only probably be that
> for about one possible input value, but still.

Well yeah, I thought this would be *very* unlikely though.

> Instead, we should change from _mesa_pointer_hash/compare to a thing
> using _mesa_hash_data in HT setup, and pass pointer to the value.u[0]
> here.

OK, I will try this approach.

// Tapani


More information about the mesa-dev mailing list