lima/pp: Do not use union undefined behaviour
It is invalid to read parent_instr for an if-use (or parent_if for a non-if-use). Make sure we read the right one when handling if-uses. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Acked-by: Faith Ekstrand <faith.ekstrand@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24671>
This commit is contained in:
@@ -55,12 +55,13 @@ lima_nir_duplicate_load_const(nir_builder *b, nir_load_const_instr *load)
|
||||
}
|
||||
|
||||
last_dupl = NULL;
|
||||
last_parent_instr = NULL;
|
||||
nir_if *last_parent_if = NULL;
|
||||
|
||||
nir_foreach_if_use_safe(use_src, &load->def) {
|
||||
nir_load_const_instr *dupl;
|
||||
nir_if *nif = use_src->parent_if;
|
||||
|
||||
if (last_parent_instr != use_src->parent_instr) {
|
||||
if (last_parent_if != nif) {
|
||||
/* if 'if use', clone where it is */
|
||||
b->cursor = nir_before_instr(&load->instr);
|
||||
|
||||
@@ -76,7 +77,7 @@ lima_nir_duplicate_load_const(nir_builder *b, nir_load_const_instr *load)
|
||||
}
|
||||
|
||||
nir_src_rewrite(&use_src->parent_if->condition, &dupl->def);
|
||||
last_parent_instr = use_src->parent_instr;
|
||||
last_parent_if = nif;
|
||||
last_dupl = dupl;
|
||||
}
|
||||
|
||||
|
||||
@@ -59,12 +59,13 @@ lima_nir_duplicate_intrinsic(nir_builder *b, nir_intrinsic_instr *itr,
|
||||
}
|
||||
|
||||
last_dupl = NULL;
|
||||
last_parent_instr = NULL;
|
||||
nir_if *last_parent_if = NULL;
|
||||
|
||||
nir_foreach_if_use_safe(use_src, &itr->def) {
|
||||
nir_intrinsic_instr *dupl;
|
||||
nir_if *nif = use_src->parent_if;
|
||||
|
||||
if (last_parent_instr != use_src->parent_instr) {
|
||||
if (last_parent_if != nif) {
|
||||
/* if 'if use', clone where it is */
|
||||
b->cursor = nir_before_instr(&itr->instr);
|
||||
dupl = nir_intrinsic_instr_create(b->shader, op);
|
||||
@@ -83,7 +84,7 @@ lima_nir_duplicate_intrinsic(nir_builder *b, nir_intrinsic_instr *itr,
|
||||
}
|
||||
|
||||
nir_src_rewrite(&use_src->parent_if->condition, &dupl->def);
|
||||
last_parent_instr = use_src->parent_instr;
|
||||
last_parent_if = nif;
|
||||
last_dupl = dupl;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user