lima/pp: Do not use union undefined behaviour
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Tue, 15 Aug 2023 13:59:01 +0000 (09:59 -0400)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Tue, 10 Oct 2023 08:58:04 +0000 (04:58 -0400)
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>

src/gallium/drivers/lima/ir/lima_nir_duplicate_consts.c
src/gallium/drivers/lima/ir/lima_nir_duplicate_intrinsic.c

index 05da5f1..d6d6c44 100644 (file)
@@ -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;
    }
 
index 469c7c1..e9440f9 100644 (file)
@@ -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;
    }