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>
|
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
|
PR target/77728
|
||||||
* config/aarch64/aarch64.c (struct aarch64_fn_arg_alignment): Remove.
|
* config/aarch64/aarch64.c (struct aarch64_fn_arg_alignment): Remove.
|
||||||
(aarch64_function_arg_alignment): Return unsigned int again, but still
|
(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 i2set;
|
||||||
rtx_insn *tmp = PREV_INSN (i1);
|
rtx_insn *tmp = PREV_INSN (i1);
|
||||||
rtx_insn *limit = PREV_INSN (BB_HEAD (current_block));
|
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
|
/* Find the previous insn involving stack regs, but don't pass a
|
||||||
block boundary. */
|
block boundary. */
|
||||||
while (tmp != limit)
|
while (tmp != limit)
|
||||||
|
@ -928,6 +929,31 @@ emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg)
|
||||||
i2 = tmp;
|
i2 = tmp;
|
||||||
break;
|
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);
|
tmp = PREV_INSN (tmp);
|
||||||
}
|
}
|
||||||
if (i2 != NULL_RTX
|
if (i2 != NULL_RTX
|
||||||
|
|
Loading…
Reference in New Issue