Makes a few patterns easier to read.
Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17794>
bool
bi_reconverge_branches(bi_block *block)
{
- /* Last block of a program */
- if (!block->successors[0]) {
- assert(!block->successors[1]);
- return true;
- }
-
- /* Multiple successors? We're branching */
- if (block->successors[1])
+ if (bi_num_successors(block) == 1)
+ return bi_num_predecessors(block->successors[0]) > 1;
+ else
return true;
-
- /* Must have at least one successor */
- struct bi_block *succ = block->successors[0];
-
- /* Reconverge if the successor has multiple predecessors */
- return bi_num_predecessors(succ) > 1;
}
/*
} bi_block;
static inline unsigned
+bi_num_successors(bi_block *block)
+{
+ STATIC_ASSERT(ARRAY_SIZE(block->successors) == 2);
+ assert(block->successors[0] || !block->successors[1]);
+
+ if (block->successors[1])
+ return 2;
+ else if (block->successors[0])
+ return 1;
+ else
+ return 0;
+}
+
+static inline unsigned
bi_num_predecessors(bi_block *block)
{
return util_dynarray_num_elements(&block->predecessors, bi_block *);
bi_exit_block(struct list_head *blocks)
{
bi_block *last = list_last_entry(blocks, bi_block, link);
- assert(!last->successors[0] && !last->successors[1]);
+ assert(bi_num_successors(last) == 0);
return last;
}
/* If there's nowhere to merge and this is the end of the shader, just
* remove the discard.
*/
- if (!block->successors[0] && !block->successors[1]) {
+ if (bi_num_successors(block) == 0) {
bi_remove_instruction(I);
continue;
}