[Mesa-dev] [PATCH 1/5] i965: Extend dead control flow to remove useless ELSE.
Matt Turner
mattst88 at gmail.com
Wed Jan 8 13:20:51 PST 2014
On Wed, Jan 8, 2014 at 1:00 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On 01/08/2014 12:43 PM, Matt Turner wrote:
>> total instructions in shared programs: 1500212 -> 1500153 (-0.00%)
>> instructions in affected programs: 17777 -> 17718 (-0.33%)
>> ---
>> src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp | 6 ++++--
>> 1 file changed, 4 insertions(+), 2 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 63a3e5b..82e83b8 100644
>> --- a/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_dead_control_flow.cpp
>> @@ -33,6 +33,7 @@
>> *
>> * - if/endif
>> * - if/else/endif
>> + * - .../else/endif
>
> Presumably the point of this is to change:
> IF, foo, bar, ELSE, ENDIF ===> IF, foo, bar, ENDIF
>
> ...but if I can read, that's not what this does at all...
>
>> */
>> bool
>> dead_control_flow_eliminate(backend_visitor *v)
>> @@ -59,16 +60,17 @@ dead_control_flow_eliminate(backend_visitor *v)
>> found = true;
>> } 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 (found) {
>> - if_inst->remove();
>> + if (if_inst)
>> + if_inst->remove();
>> if (else_inst)
>> else_inst->remove();
>> endif_inst->remove();
>>
>
> So in the above case...found = true, endif_inst != NULL, else_inst !=
> NULL, but if_inst == NULL.
>
> You delete ELSE, and you delete ENDIF. You leave IF in place...OUCH.
>
> I think you could fix this by changing this to:
>
> if (else_inst)
> else_inst->remove();
>
> if (if_inst) {
> if_inst->remove();
> endif_inst->remove();
> }
Yep, that does seem bogus. I'll send an updated patch.
More information about the mesa-dev
mailing list