g++.dg/torture/pr37922.C -O3 -fomit-frame-pointer -funroll-loops was failing for n32 and n64 on mips64-linux-gnu because we were renaming the global pointer register to $25, even though $25 is needed by the sequence that sets up the global pointer. This in turn was caused by a missing earlyclobber in the loadgp_newabi_<mode> pattern.
Bit of a brown-paper-bag bug, sorry. Will backport it to the release branches soon. Richard gcc/ * config/mips/mips.md (loadgp_newabi_<mode>): Add missing earlyclobber. Index: gcc/config/mips/mips.md =================================================================== --- gcc/config/mips/mips.md 2011-12-31 11:43:20.000000000 +0000 +++ gcc/config/mips/mips.md 2011-12-31 11:43:28.000000000 +0000 @@ -4838,7 +4838,7 @@ (define_expand "load_const_gp_<mode>" ;; of _gp from the start of this function. Operand 1 is the incoming ;; function address. (define_insn_and_split "loadgp_newabi_<mode>" - [(set (match_operand:P 0 "register_operand" "=d") + [(set (match_operand:P 0 "register_operand" "=&d") (unspec:P [(match_operand:P 1) (match_operand:P 2 "register_operand" "d")] UNSPEC_LOADGP))]