I'm a bit puzzled by the fact that GCC religiously saves R0 in IRQ prologues (and restores it in epilogues), but basically doesn't seem to use that register in any generated code. (Some of the avr-libc ASM inlines use it though, e.g. for reading an EEPROM byte.)
What's up with that? For IRQ handlers that means a constant needless overhead of two instructions ... and often some additional overhead to save a scratch register (say, r24) that's not actually needed (since r0 is available). Since I'm right now squishing code into an ATtiny24, saving two or four instructions per IRQ handler seems very attractive. I'd kind of expect that it would be both possible and desirable to just tell GCC to treat r0 like any other call-clobbered (?) register, and that would ease register pressure (in some cases) and shrink code. That is, possible for someone who understands the deep magicks associated with those invocations to the dark gods of GCC internals ... not me!