Mesa (main): spirv: fix OpBranchConditional when both branches are the same

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 21 14:11:36 UTC 2022


Module: Mesa
Branch: main
Commit: 25acf1d8697ae62a2eead1bca9e5f8ca6eb2b372
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=25acf1d8697ae62a2eead1bca9e5f8ca6eb2b372

Author: Alexey Bozhenko <oleksii.bozhenko at globallogic.com>
Date:   Wed Apr 13 15:16:16 2022 +0300

spirv: fix OpBranchConditional when both branches are the same

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6246

Signed-off-by: Bozhenko Alexey <oleksii.bozhenko at globallogic.com>

Fixes: 64cb143b922 ("spirv: Fix handling of OpBranchConditional with same THEN and ELSE")
Reviewed-by: Caio Oliveira <caio.oliveira at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15929>

---

 src/compiler/spirv/vtn_cfg.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
index d408e2437ed..e0f88322f6a 100644
--- a/src/compiler/spirv/vtn_cfg.c
+++ b/src/compiler/spirv/vtn_cfg.c
@@ -1128,17 +1128,20 @@ vtn_emit_cf_list_structured(struct vtn_builder *b, struct list_head *cf_list,
          const uint32_t *branch = vtn_if->header_block->branch;
          vtn_assert((branch[0] & SpvOpCodeMask) == SpvOpBranchConditional);
 
+         bool sw_break = false;
          /* If both branches are the same, just emit the first block, which is
           * the only one we filled when building the CFG.
           */
          if (branch[2] == branch[3]) {
-            vtn_emit_cf_list_structured(b, &vtn_if->then_body,
-                                        switch_fall_var, has_switch_break, handler);
+            if (vtn_if->then_type == vtn_branch_type_none) {
+               vtn_emit_cf_list_structured(b, &vtn_if->then_body,
+                                           switch_fall_var, &sw_break, handler);
+            } else {
+               vtn_emit_branch(b, vtn_if->then_type, switch_fall_var, &sw_break);
+            }
             break;
          }
 
-         bool sw_break = false;
-
          nir_if *nif =
             nir_push_if(&b->nb, vtn_get_nir_ssa(b, branch[1]));
 



More information about the mesa-commit mailing list