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

Reply via email to