From ef61d09d5bd58e5ad1b317d674f8436de754d3cb Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Mon, 2 Oct 2017 00:23:42 +0200 Subject: nir/spirv: Allow loop breaks in a switch body. Per the SPIR-V spec 2.11 Structured Control Flow: "The only blocks in a construct that can branch outside the construct are ... - a break block for the innermost loop it is inside of. ..." With "Break block: A block containing a branch to the Merge Block of a loop header's merge instruction." Note that it puts no restriction on not being in an if or switch within the innermost loop. This passes the loop_break block to the switch body so it can properly detect loop breaks. CC: Reviewed-by: Jason Ekstrand --- src/compiler/spirv/vtn_cfg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c index 3ad20b9ad83..25ff254bcec 100644 --- a/src/compiler/spirv/vtn_cfg.c +++ b/src/compiler/spirv/vtn_cfg.c @@ -435,7 +435,7 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list, list_for_each_entry(struct vtn_case, cse, &swtch->cases, link) { assert(cse->start_block != break_block); vtn_cfg_walk_blocks(b, &cse->body, cse->start_block, cse, - break_block, NULL, loop_cont, NULL); + break_block, loop_break, loop_cont, NULL); } /* Finally, we walk over all of the cases one more time and put -- cgit v1.2.3