re PR target/79430 (action of statement incorrectly optimised away)
PR target/79430 * reg-stack.c (emit_swap_insn): If i1src mentions the stack pointer, punt if tmp contains autoinc of stack pointer. From-SVN: r247308
This commit is contained in:
parent
a22d92795b
commit
e469603e97
|
@ -1,5 +1,9 @@
|
|||
2017-04-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR target/79430
|
||||
* reg-stack.c (emit_swap_insn): If i1src mentions the stack pointer,
|
||||
punt if tmp contains autoinc of stack pointer.
|
||||
|
||||
PR target/77728
|
||||
* config/aarch64/aarch64.c (struct aarch64_fn_arg_alignment): Remove.
|
||||
(aarch64_function_arg_alignment): Return unsigned int again, but still
|
||||
|
|
|
@ -915,6 +915,7 @@ emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg)
|
|||
rtx i2set;
|
||||
rtx_insn *tmp = PREV_INSN (i1);
|
||||
rtx_insn *limit = PREV_INSN (BB_HEAD (current_block));
|
||||
bool sp_used = reg_overlap_mentioned_p (stack_pointer_rtx, i1src);
|
||||
/* Find the previous insn involving stack regs, but don't pass a
|
||||
block boundary. */
|
||||
while (tmp != limit)
|
||||
|
@ -928,6 +929,31 @@ emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg)
|
|||
i2 = tmp;
|
||||
break;
|
||||
}
|
||||
/* FIXME: modified_between_p does not consider autoinc
|
||||
modifications of stack pointer if i1src refers to
|
||||
stack pointer, check it here manually. */
|
||||
if (sp_used && NONDEBUG_INSN_P (tmp))
|
||||
{
|
||||
subrtx_var_iterator::array_type array;
|
||||
FOR_EACH_SUBRTX_VAR (iter, array, PATTERN (tmp), NONCONST)
|
||||
{
|
||||
rtx mem = *iter;
|
||||
if (mem
|
||||
&& MEM_P (mem)
|
||||
&& (GET_RTX_CLASS (GET_CODE (XEXP (mem, 0)))
|
||||
== RTX_AUTOINC))
|
||||
{
|
||||
if (XEXP (XEXP (mem, 0), 0) == stack_pointer_rtx)
|
||||
{
|
||||
i2 = tmp;
|
||||
break;
|
||||
}
|
||||
iter.skip_subrtxes ();
|
||||
}
|
||||
}
|
||||
if (i2)
|
||||
break;
|
||||
}
|
||||
tmp = PREV_INSN (tmp);
|
||||
}
|
||||
if (i2 != NULL_RTX
|
||||
|
|
Loading…
Reference in New Issue