On Thu, Mar 25, 2010 at 4:03 PM, Jie Zhang <j...@codesourcery.com> 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.

Right, there are two issues:
* HOIST doesn't handle hard registers
* HOIST doesn't hoist reg-reg moves

There is no easy way to add cost metrics to hoist reg-reg moves, and
handling hard regs is an even bigger problem.

What is the original code? I (well, by now: we) have patches in the
works for GCC 4.6 that add code hoisting to GIMPLE (see PR23286),
perhaps that solves this case for you.


> 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?

To add duplicate functionality? No.


> Does anyone know if there is an existing pass which should
> have handled or be able to be easily adapted to handle this case?

Hoisting should handle it, bui


Can you open a new PR and make it block PR33828, please?

Ciao!
Steven

Reply via email to