The following patch fixes http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59915
The patch was successfully bootstrapped and tested on x86/x86-64 and ppc64 (with -mlra). Committed as rev. 207007. 2014-01-23 Vladimir Makarov <vmaka...@redhat.com> PR regression/59915 * lra-constraints.c (simplify_operand_subreg): Spill pseudo if there is a danger of looping.
Index: lra-constraints.c =================================================================== --- lra-constraints.c (revision 206976) +++ lra-constraints.c (working copy) @@ -1291,9 +1291,20 @@ simplify_operand_subreg (int nop, enum m && ! LRA_SUBREG_P (operand)) || CONSTANT_P (reg) || GET_CODE (reg) == PLUS || MEM_P (reg)) { - /* The class will be defined later in curr_insn_transform. */ - enum reg_class rclass - = (enum reg_class) targetm.preferred_reload_class (reg, ALL_REGS); + enum reg_class rclass; + + if (REG_P (reg) + && curr_insn_set != NULL_RTX + && (REG_P (SET_SRC (curr_insn_set)) + || GET_CODE (SET_SRC (curr_insn_set)) == SUBREG)) + /* There is big probability that we will get the same class + for the new pseudo and we will get the same insn which + means infinite looping. So spill the new pseudo. */ + rclass = NO_REGS; + else + /* The class will be defined later in curr_insn_transform. */ + rclass + = (enum reg_class) targetm.preferred_reload_class (reg, ALL_REGS); if (get_reload_reg (curr_static_id->operand[nop].type, reg_mode, reg, rclass, "subreg reg", &new_reg))