re PR rtl-optimization/63906 (lra_remat miscompiles glibc on aarch64)
authorVladimir Makarov <vmakarov@redhat.com>
Tue, 18 Nov 2014 00:14:25 +0000 (00:14 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Tue, 18 Nov 2014 00:14:25 +0000 (00:14 +0000)
2014-11-17  Vladimir Makarov  <vmakarov@redhat.com>

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

From-SVN: r217683

gcc/ChangeLog
gcc/lra-remat.c

index a04b10a35759a1b5f6b544d36ebde5ff4fa31217..00a567fd58ffafa01b5b2b847d19d500c72414c3 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-17  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/63906
+       * lra-remat.c (operand_to_remat): Check SP and
+       frame_pointer_required.
+
 2014-11-17  Mircea Namolaru  <mircea.namolaru@inria.fr>
 
        * doc/invoke.texi (floop-unroll-and-jam): Document
index fcb1b6f60979c5b4f92eb7c15441a88a9b2b3db0..3b8a8069de9d85976a843fcfb1d81046ecbb883b 100644 (file)
@@ -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.  */