From 69bb063ec22453cdf1b7b363b1c7db47697b586f Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Wed, 24 Feb 2016 19:11:39 -0800 Subject: [PATCH] i965/cfg: Eliminate an empty then-branch of an if/else/endif On BDW, total instructions in shared programs: 8448571 -> 8448367 (-0.00%) instructions in affected programs: 21000 -> 20796 (-0.97%) helped: 116 HURT: 0 v2: Remove spurious attempt to combine the if_block with the (removed!) else_block. Suggested by Matt and Curro. Correct the comment describing what the new pass does. Suggested by Matt. Signed-off-by: Ian Romanick Reviewed-by: Francisco Jerez --- .../drivers/dri/i965/brw_dead_control_flow.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 7aa72b1b413..b42e6a3a5ce 100644 --- a/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp +++ b/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp @@ -34,6 +34,7 @@ * - if/endif * . else in else/endif * - if/else/endif + * - else in if/else */ bool dead_control_flow_eliminate(backend_shader *s) @@ -114,6 +115,19 @@ dead_control_flow_eliminate(backend_shader *s) progress = true; } + } else if (inst->opcode == BRW_OPCODE_ELSE && + prev_inst->opcode == BRW_OPCODE_IF) { + bblock_t *const else_block = block; + backend_instruction *const if_inst = prev_inst; + backend_instruction *const else_inst = inst; + + /* Since the else-branch is becoming the new then-branch, the + * condition has to be inverted. + */ + if_inst->predicate_inverse = !if_inst->predicate_inverse; + else_inst->remove(else_block); + + progress = true; } } -- 2.30.2