On Thu, Mar 25, 2010 at 4:14 PM, Bernd Schmidt <ber...@codesourcery.com> wrote:
> On 03/25/2010 04:03 PM, Jie Zhang wrote:
>> I just found that the current RTL code hoisting cannot optimize
>>
>> REG = ...
>> if (cond)
>>   {
>>     r0 = REG;
>>     ....
>>   }
>> else
>>   {
>>     r0 = REG;
>>     ...
>>   }
>>
>> to
>>
>>
>> REG = ...
>> r0 = REG;
>> if (cond)
>>   {
>>     ....
>>   }
>> else
>>   {
>>     ...
>>   }
>>
>> where REG is a pseudo register and r0 is a physical register. I have
>> looked at the code of RTL hoisting pass. But I cannot find a simple way
>> to extend it to deal with this case. And the hoisting pass is only
>> enabled when -Os. So I'm going to implement another hoisting pass to do
>> this optimization. Is it a good idea? Does anyone know if there is an
>> existing pass which should have handled or be able to be easily adapted
>> to handle this case? Thanks!
>
> Isn't this similar to crossjumping, except done in the other direction?

Yes. "head merging" if you will. I have a patch for this, and intend
to submit it for GCC 4.6.

Ciao!
Steven

Reply via email to