diff options
author | Ian Romanick <[email protected]> | 2016-02-24 19:11:39 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2016-02-26 16:51:27 -0800 |
commit | 69bb063ec22453cdf1b7b363b1c7db47697b586f (patch) | |
tree | e0d36b9cfce6900f015303b5739a2aa27b401c36 | |
parent | c7deee69ea6f64ea5b563985bf19d9deebe73b5b (diff) |
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 <[email protected]>
Reviewed-by: Francisco Jerez <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp | 14 |
1 files changed, 14 insertions, 0 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 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; } } |