https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55212
--- Comment #49 from Kazumoto Kojima <kkojima at gcc dot gnu.org> --- (In reply to Oleg Endo from comment #48) > The array at i = 699 doesn't seem to contain anything valid. It looks that (expr_list:DF (use (mem:DF (reg/f:SI 699) [0 S8 A32])) which shows an argument of call_insn 617 via memory, was missed by LRA as a usage of pseudo 699. Here is my trial: --- gcc/lra.c.orig 2014-09-14 09:09:57.223724308 +0900 +++ gcc/lra.c 2014-09-30 17:15:21.709508021 +0900 @@ -1615,6 +1615,20 @@ lra_update_insn_regno_info (rtx_insn *in if ((code = GET_CODE (PATTERN (insn))) == CLOBBER || code == USE) add_regs_to_insn_regno_info (data, XEXP (PATTERN (insn), 0), uid, code == USE ? OP_IN : OP_OUT, false); + if (CALL_P (insn)) + { + rtx link; + + /* Take account of arguments via memory which could be implicit + usage of pseudo regs. */ + for (link = CALL_INSN_FUNCTION_USAGE (insn); + link != NULL_RTX; + link = XEXP (link, 1)) + if (GET_CODE (XEXP (link, 0)) == USE + && MEM_P (XEXP (XEXP (link, 0), 0))) + add_regs_to_insn_regno_info (data, XEXP (XEXP (link, 0), 0), uid, + OP_IN, false); + } if (NONDEBUG_INSN_P (insn)) setup_insn_reg_info (data, freq); }