On Wed, Aug 09, 2017 at 09:06:18PM +0000, Segher Boessenkool wrote: > We can have SAVE_MULTIPLE while we do not have REST_MULTIPLE. If the > inline restore does not restore all registers, the CFI for the save > and restore can conflict if things are shrink-wrapped. > > We could restore all registers that are saved (not ideal),
No, we can't do that. A -ffixed-reg register should not be restored even if it is saved, as such regs should never be written. For example, a fixed reg might be counting interrupts. If you restore it, you may lose count. Another example is a fixed reg used as some sort of context pointer. If you restore in a function that sets a new context you're obviously breaking user code. > or emit > the CFI notes to say we did (which will work fine, No, you can't do that either. Unwinding might then restore a -ffixed-reg register. > but is also not > so great); instead, let's not save the registers that are unused. Ick, looks like papering over the real problem to me, and will no doubt cause -Os size regressions. Also, if SAVE_MULTIPLE causes this bad interaction with shrink-wrap, does using the out-of-line register save functions cause the same problem? I haven't looked yet, but at a guess I suspect the correct solution is to modify cfa_restores in rs6000_emit_epilogue. -- Alan Modra Australia Development Lab, IBM