aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2014-11-18 00:14:25 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2014-11-18 00:14:25 +0000
commitdaab44bffd8508746a01dcd242a1af592f78b388 (patch)
tree278ecdb9349e9803c322668f500b07eecf4d7b25
parent46cdd0c8cd8cb595fd3bac820d05e06072e858ed (diff)
downloadgcc-daab44bffd8508746a01dcd242a1af592f78b388.zip
gcc-daab44bffd8508746a01dcd242a1af592f78b388.tar.gz
gcc-daab44bffd8508746a01dcd242a1af592f78b388.tar.bz2
re PR rtl-optimization/63906 (lra_remat miscompiles glibc on aarch64)
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/lra-remat.c8
2 files changed, 13 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a04b10a..00a567f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/lra-remat.c b/gcc/lra-remat.c
index fcb1b6f..3b8a806 100644
--- a/gcc/lra-remat.c
+++ b/gcc/lra-remat.c
@@ -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. */