From: Bernd Schmidt Date: Sat, 17 Jan 2015 07:35:40 +0000 (+0000) Subject: re PR rtl-optimization/52773 (internal error: in replace_pseudos_in, at reload1.c... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0ed4bf92c502a4b9f8a310313fc52f4ff2059041;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 04ae25502c7..80f8c927b0e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-01-17 Bernd Schmidt + + 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 PR rtl-optimization/32790 diff --git a/gcc/calls.c b/gcc/calls.c index 1c2f0adfa23..ec44624d7c9 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -3808,6 +3808,7 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, int reg_parm_stack_space = 0; int needed; rtx_insn *before_call; + bool have_push_fusage; tree tfom; /* type_for_mode (outmode, 0) */ #ifdef REG_PARM_STACK_SPACE @@ -4165,6 +4166,8 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, /* Push the args that need to be pushed. */ + have_push_fusage = false; + /* ARGNUM indexes the ARGVEC array in the order in which the arguments are to be pushed. */ for (count = 0; count < nargs; count++, argnum--) @@ -4256,14 +4259,19 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, if (argblock) use = plus_constant (Pmode, argblock, argvec[argnum].locate.offset.constant); + else if (have_push_fusage) + continue; else - /* When arguments are pushed, trying to tell alias.c where - exactly this argument is won't work, because the - auto-increment causes confusion. So we merely indicate - that we access something with a known mode somewhere on - the stack. */ - use = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx, - gen_rtx_SCRATCH (Pmode)); + { + /* When arguments are pushed, trying to tell alias.c where + exactly this argument is won't work, because the + auto-increment causes confusion. So we merely indicate + that we access something with a known mode somewhere on + the stack. */ + 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_USE (VOIDmode, use); call_fusage = gen_rtx_EXPR_LIST (VOIDmode, use, call_fusage); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 41ad87e0954..3d424ce53dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-01-16 Bernd Schmidt + + PR rtl-optimization/52773 + * gcc.c-torture/compile/pr52773.c: New test. + 2015-01-16 Paolo Carlini PR c++/62134 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr52773.c b/gcc/testsuite/gcc.c-torture/compile/pr52773.c new file mode 100644 index 00000000000..8daa5ee03d6 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr52773.c @@ -0,0 +1,16 @@ +/* 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; +}