summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorVadim Girlin <[email protected]>2013-04-30 20:50:24 +0400
committerVadim Girlin <[email protected]>2013-04-30 21:50:48 +0400
commit6ba7a162b6fb38e588784fa14426a61deca1143c (patch)
tree9d596f443fbfe8108c8ab4be13a8d19dd38b2be7 /src/gallium
parent3e476c311f9e131d255a9946d0cf7acc74a07dad (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/gallium')
-rw-r--r--src/gallium/drivers/r600/sb/sb_dce_cleanup.cpp3
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;
}