diff options
author | Vadim Girlin <[email protected]> | 2013-04-30 20:50:24 +0400 |
---|---|---|
committer | Vadim Girlin <[email protected]> | 2013-04-30 21:50:48 +0400 |
commit | 6ba7a162b6fb38e588784fa14426a61deca1143c (patch) | |
tree | 9d596f443fbfe8108c8ab4be13a8d19dd38b2be7 /src | |
parent | 3e476c311f9e131d255a9946d0cf7acc74a07dad (diff) |
r600g/sb: don't propagate dead values in GVN pass
In some cases we use value::gvn_source field to link values that
are known to be equal before gvn pass (e.g. results of DOT4 in different
slots of the same alu group), but then source value may become dead later
and this confuses further passes.
This patch resets value::gvn_source to NULL in the dce_cleanup pass
if it points to dead value.
Fixes segfault during shader optimization with ETQW.
Signed-off-by: Vadim Girlin <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/r600/sb/sb_dce_cleanup.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/sb/sb_dce_cleanup.cpp b/src/gallium/drivers/r600/sb/sb_dce_cleanup.cpp index acd6613166f..f879395f67c 100644 --- a/src/gallium/drivers/r600/sb/sb_dce_cleanup.cpp +++ b/src/gallium/drivers/r600/sb/sb_dce_cleanup.cpp @@ -125,6 +125,9 @@ void dce_cleanup::cleanup_dst_vec(vvec& vv) { if (!v) continue; + if (v->gvn_source && v->gvn_source->is_dead()) + v->gvn_source = NULL; + if (v->is_dead()) v = NULL; } |