http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17381
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> 2011-01-05 00:15:50 UTC --- (In reply to comment #5) > This is the patch which fixes the issue:Index: regrename.c > =================================================================== > --- regrename.c (revision 3023) > +++ regrename.c (working copy) > @@ -1374,6 +1374,10 @@ maybe_mode_change (enum machine_mode ori > enum machine_mode new_mode, unsigned int regno, > unsigned int copy_regno ATTRIBUTE_UNUSED) > { > + if (GET_MODE_SIZE (copy_mode) == GET_MODE_SIZE (new_mode) > + && hard_regno_nregs[copy_regno][copy_mode] == > hard_regno_nregs[copy_regno][new_mode] > + && hard_regno_nregs[regno][copy_mode] == > hard_regno_nregs[copy_regno][new_mode]) > + return gen_rtx_raw_REG (new_mode, regno); > if (orig_mode == new_mode) > return gen_rtx_raw_REG (new_mode, regno); > else if (mode_change_ok (orig_mode, new_mode, regno)) MIPS64 has a similar issue too, take: long long d; int test1(int fParm) { d = fParm + 1; return fParm + 1; } The same regrename.c patch is needed to fix the MIPS64 issue too.