http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42240

--- Comment #19 from Georg Lay <avr at gjlay dot de> 2010-11-10 13:00:47 UTC ---
(In reply to comment #18)

> I think BBreordering after the end of epilogue in case of normal functions is
> little confusing.

Yes, optimized code is often confusing.

> I am not sure what additional advantage we get by allowing this to happen 
> after 
> epilogue. Hence I tried to disable this. 

There is no bug for functions not attributed naked. I do not see why that
should be changed. Note that the backend is lying about branch costs and sets
them to zero -- both in space and time. Therefore, .bbro has fun and jumps
around. Tweaking that is of no concern here.

> > Moreover, there is a gap between reload_completed and
> > epilogue_completed 
> 
> Agreed. Thanks for catching that.
> 
> 
> > because the naked return insn is allowed since after reload.
> 
> I dindn't quite get this. Can you give some example?

avr.h allows that insn after reload:

(define_insn "return_from_naked_epilogue"
  [(return)]
  "(reload_completed 
    && cfun->machine 
    && cfun->machine->is_naked)"
  ...

so it might be emitted after reload. Because it is non-simple, it will occur
just once, but it must be in the right place (ensured by .pro_and_epilogue) and
must not be moved around (ensured by new target hook). Observe a simple test
case like lined out below, and how the compiler transform with/without naked,
optimize size/speed, branch cost 0/!=0

char c;

void foo (char i) 
{
  c = 17;
  switch (i)
    {
    case 0 : c = 1; break;
    case 3 : c = 2; break;
    case 7 : c = 12; break;
    case 9 : c = 32; break;
    }
}

Reply via email to