[Mesa-dev] [PATCH 5/5] i965/cfg: Split out dead control flow paths to simplify both paths
Francisco Jerez
currojerez at riseup.net
Fri Feb 26 01:47:00 UTC 2016
Ian Romanick <idr at freedesktop.org> writes:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
> .../drivers/dri/i965/brw_dead_control_flow.cpp | 93 +++++++++-------------
> 1 file changed, 38 insertions(+), 55 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp b/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp
> index dadcff8..64f406d 100644
> --- a/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp
> @@ -48,67 +48,50 @@ dead_control_flow_eliminate(backend_shader *s)
> /* ENDIF instructions, by definition, can only be found at the start of
> * basic blocks.
> */
> - if (inst->opcode == BRW_OPCODE_ENDIF) {
> - bool found = false;
> - bblock_t *if_block = NULL, *else_block = NULL, *endif_block = block;
> - backend_instruction *endif_inst = inst;
> -
> - backend_instruction *if_inst = NULL, *else_inst = NULL;
> - if (prev_inst->opcode == BRW_OPCODE_ELSE) {
> - else_inst = prev_inst;
> - else_block = endif_block->prev();
> - found = true;
> -
> - /* Don't remove the ENDIF if we didn't find a dead IF. */
> - endif_inst = NULL;
> - }
> -
> - if (prev_inst->opcode == BRW_OPCODE_IF) {
> - if_inst = prev_inst;
> - if_block = prev_block;
> - found = true;
> - }
> -
> - if (found) {
> - bblock_t *earlier_block = NULL, *later_block = NULL;
> + if (inst->opcode == BRW_OPCODE_ENDIF &&
> + prev_inst->opcode == BRW_OPCODE_ELSE) {
> + bblock_t *const else_block = prev_block;
> + backend_instruction *const else_inst = prev_inst;
>
> - if (if_inst) {
> - if (if_block->start_ip == if_block->end_ip) {
> - earlier_block = if_block->prev();
> - } else {
> - earlier_block = if_block;
> - }
> - if_inst->remove(if_block);
> - }
> + else_inst->remove(else_block);
> + progress = true;
> + } else if (inst->opcode == BRW_OPCODE_ENDIF &&
> + prev_inst->opcode == BRW_OPCODE_IF) {
Just one nitpick: Can you align this to the parenthesis on the
previous line? With that fixed:
Reviewed-by: Francisco Jerez <currojerez at riseup.net>
> + bblock_t *const endif_block = block;
> + bblock_t *const if_block = prev_block;
> + backend_instruction *const endif_inst = inst;
> + backend_instruction *const if_inst = prev_inst;
>
> - if (else_inst) {
> - else_inst->remove(else_block);
> - }
> + bblock_t *earlier_block = NULL, *later_block = NULL;
>
> - if (endif_inst) {
> - if (endif_block->start_ip == endif_block->end_ip) {
> - later_block = endif_block->next();
> - } else {
> - later_block = endif_block;
> - }
> - endif_inst->remove(endif_block);
> - }
> + if (if_block->start_ip == if_block->end_ip) {
> + earlier_block = if_block->prev();
> + } else {
> + earlier_block = if_block;
> + }
> + if_inst->remove(if_block);
>
> - assert((earlier_block == NULL) == (later_block == NULL));
> - if (earlier_block && earlier_block->can_combine_with(later_block)) {
> - earlier_block->combine_with(later_block);
> -
> - /* If ENDIF was in its own block, then we've now deleted it and
> - * merged the two surrounding blocks, the latter of which the
> - * __next block pointer was pointing to.
> - */
> - if (endif_block != later_block) {
> - __next = earlier_block->next();
> - }
> + if (endif_block->start_ip == endif_block->end_ip) {
> + later_block = endif_block->next();
> + } else {
> + later_block = endif_block;
> + }
> + endif_inst->remove(endif_block);
> +
> + assert((earlier_block == NULL) == (later_block == NULL));
> + if (earlier_block && earlier_block->can_combine_with(later_block)) {
> + earlier_block->combine_with(later_block);
> +
> + /* If ENDIF was in its own block, then we've now deleted it and
> + * merged the two surrounding blocks, the latter of which the
> + * __next block pointer was pointing to.
> + */
> + if (endif_block != later_block) {
> + __next = earlier_block->next();
> }
> -
> - progress = true;
> }
> +
> + progress = true;
> } else if (inst->opcode == BRW_OPCODE_ELSE &&
> prev_inst->opcode == BRW_OPCODE_IF) {
> bblock_t *const else_block = block;
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160225/7f644a03/attachment.sig>
More information about the mesa-dev
mailing list