Woah, is this legal SPIR-V? I think a second OpSelectionMerge is required.

--Jason


On March 6, 2019 05:25:26 "Juan A. Suarez Romero" <jasua...@igalia.com> wrote:

This fixes the case when the SPIR-V code has two nested conditional
branches, but only one selection merge:


[...]
%1 = OpLabel
    OpSelectionMerge %2 None
    OpBranchConditional %3 %4 %2
%4 = OpLabel
    OpBranchConditional %3 %5 %2
%5 = OpLabel
    OpBranch %2
%2 = OpLabel
[...]


In the second OpBranchConditional, as the else-part is the end
block (started in the first OpBranchConditional) we can just follow the
then-part.


This fixes dEQP-VK.vkrunner.controlflow.2-obc-triangle-triangle


CC: Jason Ekstrand <ja...@jlekstrand.net>
---
src/compiler/spirv/vtn_cfg.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)


diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
index 7868eeb60bc..f749118efbe 100644
--- a/src/compiler/spirv/vtn_cfg.c
+++ b/src/compiler/spirv/vtn_cfg.c
@@ -605,7 +605,16 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list,
            }
         } else if (if_stmt->then_type == vtn_branch_type_none &&
                    if_stmt->else_type == vtn_branch_type_none) {
-            /* Neither side of the if is something we can short-circuit. */
+            /* Neither side of the if is something we can short-circuit,
+             * unless one of the blocks is the end block. */
+            if (then_block == end) {
+               block = else_block;
+               continue;
+            } else if (else_block == end) {
+               block = then_block;
+               continue;
+            }
+
            vtn_assert((*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge);
            struct vtn_block *merge_block =
               vtn_value(b, block->merge[1], vtn_value_type_block)->block;
--
2.20.1



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to