diff --git a/src/gallium/drivers/lima/ir/pp/instr.c b/src/gallium/drivers/lima/ir/pp/instr.c index 974d646a952..0befd2cd21a 100644 --- a/src/gallium/drivers/lima/ir/pp/instr.c +++ b/src/gallium/drivers/lima/ir/pp/instr.c @@ -238,6 +238,13 @@ bool ppir_instr_insert_node(ppir_instr *instr, ppir_node *node) } } + if (pos == PPIR_INSTR_SLOT_BRANCH) { + /* Branch and combiner run in parallel, they cannot be inserted + * into the same instruction */ + if (instr->slots[PPIR_INSTR_SLOT_ALU_COMBINE]) + return false; + } + if (pos == PPIR_INSTR_SLOT_ALU_VEC_MUL) { if (dest && dest->type == ppir_target_pipeline) { ppir_node *add = ppir_node_first_succ(node); diff --git a/src/gallium/drivers/lima/ir/pp/node_to_instr.c b/src/gallium/drivers/lima/ir/pp/node_to_instr.c index e76a5e2aae6..a0288463e36 100644 --- a/src/gallium/drivers/lima/ir/pp/node_to_instr.c +++ b/src/gallium/drivers/lima/ir/pp/node_to_instr.c @@ -121,6 +121,17 @@ static bool ppir_do_one_node_to_instr(ppir_block *block, ppir_node *node) } + if (!node->instr && + ppir_node_has_single_succ(node)) { + ppir_node *succ = ppir_node_first_succ(node); + if (succ->op == ppir_op_branch && + ppir_node_get_src_num(succ) == 0 && + succ->instr) { + /* Unconditional branch. Likely a loop */ + ppir_instr_insert_node(succ->instr, node); + } + } + /* can't inserted to any existing instr, create one */ if (!node->instr && !create_new_instr(block, node)) return false;