This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

patch to fix PR63906


The following patch fixes

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63906

LRA rematerialization checks SP offsets at origin and rematerialization places when trying to rematerialize an insn. But the offsets are not valid if sp elimination is prohibited (e.g. when alloca is used). Value of frame_pointer_required is a flag of this.

The patch was bootstrapped on aarch64 and committed as rev. 217683.

2014-11-17  Vladimir Makarov  <vmakarov@redhat.com>

        PR rtl-optimization/63906
        * lra-remat.c (operand_to_remat): Check SP and
        frame_pointer_required.

Index: lra-remat.c
===================================================================
--- lra-remat.c (revision 217658)
+++ lra-remat.c (working copy)
@@ -399,7 +399,13 @@ operand_to_remat (rtx_insn *insn)

   /* First find a pseudo which can be rematerialized.  */
   for (reg = id->regs; reg != NULL; reg = reg->next)
-    if (reg->type == OP_OUT && ! reg->subreg_p
+    /* True FRAME_POINTER_NEEDED might be because we can not follow
+       changing sp offsets, e.g. alloca is used.  If the insn contains
+       stack pointer in such case, we can not rematerialize it as we
+       can not know sp offset at a rematerialization place.  */
+    if (reg->regno == STACK_POINTER_REGNUM && frame_pointer_needed)
+      return -1;
+    else if (reg->type == OP_OUT && ! reg->subreg_p
        && find_regno_note (insn, REG_UNUSED, reg->regno) == NULL)
       {
        /* We permits only one spilled reg.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]