On Thu, Nov 08, 2007 at 09:52:27PM +0100, Eric Botcazou wrote: > > This doesnt happen because while inserting the caller save insn, its > > live_throughout is simply set to the live_throughout of the call insn > > + the registers marked with REG_DEAD notes in the call insn. > > Ouch. Relying on REG_DEAD notes to get complete liveness info is a no-no: > > /* The value in REG dies in this insn (i.e., it is not needed past > this insn). If REG is set in this insn, the REG_DEAD note may, > but need not, be omitted. */ > REG_NOTE (DEAD) > > This problem was apparently introduced a long time ago: > http://gcc.gnu.org/ml/gcc-cvs/1999-12/msg00212.html
See also <URL:http://gcc.gnu.org/ml/gcc-patches/1999-11n/msg00916.html> and <URL:http://gcc.gnu.org/ml/gcc-patches/1999-12n/msg00086.html>. It's been on my TODO list for a year to essentially revert that patch and enhance find_reg() such that an output reload can use a register which is live_before && !live_after, which is not the case today. See e.g. <URL:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32725>. -- Rask Ingemann Lambertsen Danish law requires addresses in e-mail to be logged and stored for a year