It seems that the problem comes from CALL instructions. If I remove them then my code works. I have not figured out why my code would pose a problem in the case of calls but I can work around that for the moment.
If anyone has an idea why this is a problem, I'll integrate the change into the code at that point. Thanks again, Jean Christophe Beyler On Thu, Jun 18, 2009 at 12:25 PM, fearyourself<fearyours...@gmail.com> wrote: > Dear all, > > I've been working on renaming registers using the DF framework but am > wondering if I'm doing things correctly. This is done in the REORG > pass because I need to ensure that I have consecutive registers for > loads in order to get a load multiple generated. > > Basically, the beginning of the code tries to find free registers and > tries to rename some to get some place. > > Say I want to rename register SRC to DEST throughout the whole function. > > I do this : > > For each instruction in each basic block: > Look into the DF_INSN_UID_USES / DF_INSN_UID_EQ_USES / DF_INSN_UID_DEFS > For each reference, check if DF_REF_REGNO is equal to SRC > call replace_ref from the web.c code which looks like this in my case: > > { > rtx oldreg = DF_REF_REAL_REG (ref); > > rtx *loc = DF_REF_REAL_LOC (ref); > unsigned int uid = INSN_UID (DF_REF_INSN (ref)); > rtx reg; > > /* Paranoid */ > if (REGNO (oldreg) == repl) > return; > > reg = findReplacement (oldreg, repl); > > fprintf (stderr, "Updating insn %i (%i->%i)\n", uid, REGNO > (oldreg), REGNO (reg)); > *loc = reg; > df_insn_rescan (DF_REF_INSN (ref)); > } > > But it segfaults after a while on the DF_REF_REAL_LOC call. I don't > know why. Any ideas ? > > I also call df_analyze and df_finish_pass (false) at each reorg call. > > Thanks for your help, > Jc >