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