This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Reorg and renaming registers
- From: fearyourself <fearyourself at gmail dot com>
- To: gcc at gcc dot gnu dot org
- Date: Thu, 18 Jun 2009 12:25:50 -0400
- Subject: Reorg and renaming registers
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