From: Matt Turner Date: Tue, 15 Jul 2014 22:29:29 +0000 (-0700) Subject: i965: Improve dead control flow elimination. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ac2acf04f750a84fc6381b6efacfe1bbac61aa4d;p=mesa.git i965: Improve dead control flow elimination. ... to eliminate an ELSE instruction followed immediately by an ENDIF. instructions in affected programs: 704 -> 700 (-0.57%) Reviewed-by: Kenneth Graunke --- 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 14c68986f58..f0530a1060f 100644 --- a/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp +++ b/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp @@ -32,6 +32,7 @@ /* Look for and eliminate dead control flow: * * - if/endif + * . else in else/endif * - if/else/endif */ bool @@ -54,24 +55,28 @@ dead_control_flow_eliminate(backend_visitor *v) backend_instruction *if_inst = NULL, *else_inst = NULL; backend_instruction *prev_inst = (backend_instruction *) endif_inst->prev; - if (prev_inst->opcode == BRW_OPCODE_IF) { - if_inst = prev_inst; - found = true; - } else if (prev_inst->opcode == BRW_OPCODE_ELSE) { + if (prev_inst->opcode == BRW_OPCODE_ELSE) { else_inst = prev_inst; + found = true; prev_inst = (backend_instruction *) prev_inst->prev; - if (prev_inst->opcode == BRW_OPCODE_IF) { - if_inst = prev_inst; - found = true; - } + } + + if (prev_inst->opcode == BRW_OPCODE_IF) { + if_inst = prev_inst; + found = true; + } else { + /* Don't remove the ENDIF if we didn't find a dead IF. */ + endif_inst = NULL; } if (found) { - if_inst->remove(); + if (if_inst) + if_inst->remove(); if (else_inst) else_inst->remove(); - endif_inst->remove(); + if (endif_inst) + endif_inst->remove(); progress = true; } }