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);
}