Hello,

On Thu, 6 May 2021, Prathamesh Kulkarni via Gcc wrote:

> Well, I was thinking of this test-case:
> 
> int f(int cond1, int cond2, int cond3, int x, int y)
> {
>   void f1();
>   void f2(int);
>   void f3();
> 
>   if (cond1)
>     f1 ();
>   else
>     {
>       if (cond2)
>         f2 (x + y);
>       else
>         f3 ();
>     }
> 
>   return x + y;
> }
> ...
> And during second iteration, it hoists x + y into bb2. So we are 
> effectively hoisting x + y from bb5, bb7 into bb2, which doesn't seem to 
> benefit other two paths (bb2->bb3->bb7 and bb2->bb4->bb6->bb7) since 
> they don't contain x + y.

But bb7 eventually does, so it also doesn't make those paths worse.  
That's the nature of partial redundancy elimination: it doesn't require 
benefits on all paths, only on one of them.  That's in difference to full 
redundancy eliminaton.

As with all hoistings it can increase register pressure.  The counter 
measure to this is not to limit the hoisting (because that can have 
ripple down effects when some hoists don't happen anymore), but rather to 
tackle the register pressure problem somewhen later, in the register 
allocator (or some preparatory pass).  But I'm not even sure if this is 
the reason you're wondering about how PRE hoists.


Ciao,
Michael.

Reply via email to