nir: Fix non-determinism in nir_lower_vars_to_ssa().
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 10 Mar 2015 01:36:31 +0000 (18:36 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 12 Mar 2015 20:25:39 +0000 (13:25 -0700)
commitf3e4b2c9d2087c7f655d323cc6b4150313fc0128
tree2a22bdbf77a86eb85a4351056293e922458541f8
parent67388c1ef27e9ff4d7f60a496dbaea4b290dc741
nir: Fix non-determinism in nir_lower_vars_to_ssa().

Previously, we stored derefs in a hash table, using the malloc'd pointer
as the key.  Then, we walked through the hash table and generated code,
based on the order of the hash table's elements.

Memory addresses returned by malloc are pretty much random, which meant
that the hash was random, and the hash table's elements would be walked
in some random order.  This led to successive compiles of the same
shader using different variable names and slightly different orderings
of phi-nodes.  Code could not be diff'd, and the final assembly would
sometimes change slightly too.

It turns out the only point of the hash table was to avoid inserting
the same node multiple times for different dereferences.  We never
actually searched the hash table!  This patch uses an intrusive
linked list instead.  Since exec_list uses head and tail sentinels,
checking prev or next against NULL will tell us whether the node is
already in the list.

Pair programming with Jason Ekstrand.

Signed-off-by: Jason Ekstrand <jason.ekstrand@intel.com>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/glsl/nir/nir_lower_vars_to_ssa.c