[Mesa-dev] [PATCH v2] nir/spirv: handle if's with same label in both branches

Samuel Iglesias Gonsálvez siglesias at igalia.com
Mon Sep 11 09:41:48 UTC 2017


From: "Juan A. Suarez Romero" <jasuarez at igalia.com>

When a conditional branch has the same labels in the "if" part and in the
"else" part, then we have the same cfg block, and it must be handled
once.

v2: handle it the same way as OpBranch (Jason).

Fixes:
dEQP-VK.spirv_assembly.instruction.compute.conditional_branch.same_labels*
dEQP-VK.spirv_assembly.instruction.graphics.conditional_branch.same_labels*
---
 src/compiler/spirv/vtn_cfg.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
index 03c452cb31..3ad20b9ad8 100644
--- a/src/compiler/spirv/vtn_cfg.c
+++ b/src/compiler/spirv/vtn_cfg.c
@@ -356,8 +356,16 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list,
                                                   switch_case, switch_break,
                                                   loop_break, loop_cont);
 
-         if (if_stmt->then_type == vtn_branch_type_none &&
-             if_stmt->else_type == vtn_branch_type_none) {
+         if (then_block == else_block) {
+            block->branch_type = if_stmt->then_type;
+            if (block->branch_type == vtn_branch_type_none) {
+               block = then_block;
+               continue;
+            } else {
+               return;
+            }
+         } 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. */
             assert((*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge);
             struct vtn_block *merge_block =
-- 
2.14.1



More information about the mesa-dev mailing list