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
>

Reply via email to