This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
patch to fix PR63906
- From: Vladimir Makarov <vmakarov at redhat dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 17 Nov 2014 19:15:35 -0500
- Subject: patch to fix PR63906
- Authentication-results: sourceware.org; auth=none
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. */