Commit 0ed4bf92 by Bernd Schmidt Committed by Jeff Law

re PR rtl-optimization/52773 (internal error: in replace_pseudos_in, at reload1.c:577)

	PR rtl-optimization/52773
	* calls.c (emit_library_call_value): When pushing arguments use
	stack_pointer_rtx rather than virtual_outgoing_args_rtx in
	CALL_INSN_FUNCTION_USAGE.  Only emit one of use of the magic
	stack pointer reference into CALL_INSN_FUNCTION_USAGE.

	PR rtl-optimization/52773
	* gcc.c-torture/compile/pr52773.c: New test.

From-SVN: r219796
parent bd5fb71c
2015-01-17 Bernd Schmidt <bernds@codesourcery.com>
PR rtl-optimization/52773
* calls.c (emit_library_call_value): When pushing arguments use
stack_pointer_rtx rather than virtual_outgoing_args_rtx in
CALL_INSN_FUNCTION_USAGE. Only emit one of use of the magic
stack pointer reference into CALL_INSN_FUNCTION_USAGE.
2015-01-17 Jeff Law <law@redhat.com> 2015-01-17 Jeff Law <law@redhat.com>
PR rtl-optimization/32790 PR rtl-optimization/32790
......
...@@ -3808,6 +3808,7 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, ...@@ -3808,6 +3808,7 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
int reg_parm_stack_space = 0; int reg_parm_stack_space = 0;
int needed; int needed;
rtx_insn *before_call; rtx_insn *before_call;
bool have_push_fusage;
tree tfom; /* type_for_mode (outmode, 0) */ tree tfom; /* type_for_mode (outmode, 0) */
#ifdef REG_PARM_STACK_SPACE #ifdef REG_PARM_STACK_SPACE
...@@ -4165,6 +4166,8 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, ...@@ -4165,6 +4166,8 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
/* Push the args that need to be pushed. */ /* Push the args that need to be pushed. */
have_push_fusage = false;
/* ARGNUM indexes the ARGVEC array in the order in which the arguments /* ARGNUM indexes the ARGVEC array in the order in which the arguments
are to be pushed. */ are to be pushed. */
for (count = 0; count < nargs; count++, argnum--) for (count = 0; count < nargs; count++, argnum--)
...@@ -4256,14 +4259,19 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, ...@@ -4256,14 +4259,19 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
if (argblock) if (argblock)
use = plus_constant (Pmode, argblock, use = plus_constant (Pmode, argblock,
argvec[argnum].locate.offset.constant); argvec[argnum].locate.offset.constant);
else if (have_push_fusage)
continue;
else else
/* When arguments are pushed, trying to tell alias.c where {
exactly this argument is won't work, because the /* When arguments are pushed, trying to tell alias.c where
auto-increment causes confusion. So we merely indicate exactly this argument is won't work, because the
that we access something with a known mode somewhere on auto-increment causes confusion. So we merely indicate
the stack. */ that we access something with a known mode somewhere on
use = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx, the stack. */
gen_rtx_SCRATCH (Pmode)); use = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
gen_rtx_SCRATCH (Pmode));
have_push_fusage = true;
}
use = gen_rtx_MEM (argvec[argnum].mode, use); use = gen_rtx_MEM (argvec[argnum].mode, use);
use = gen_rtx_USE (VOIDmode, use); use = gen_rtx_USE (VOIDmode, use);
call_fusage = gen_rtx_EXPR_LIST (VOIDmode, use, call_fusage); call_fusage = gen_rtx_EXPR_LIST (VOIDmode, use, call_fusage);
......
2015-01-16 Bernd Schmidt <bernds@codesourcery.com>
PR rtl-optimization/52773
* gcc.c-torture/compile/pr52773.c: New test.
2015-01-16 Paolo Carlini <paolo.carlini@oracle.com> 2015-01-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/62134 PR c++/62134
......
/* pr52773.c */
struct s {
short x;
short _pad[2];
};
static short mat_a_x;
void transform(const struct s *src, struct s *dst, int n)
{
int i;
for (i = 0; i < n; ++i)
dst[i].x = (src[i].x * mat_a_x) >> 6;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment