From: Jakub Jelinek Date: Thu, 9 Feb 2012 17:27:25 +0000 (+0100) Subject: backport: re PR target/52129 (wrong code to pass parameters to tail call function) X-Git-Tag: releases/gcc-4.6.3~102 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1023eea9835c0573aeeddb1b2620c7e9519b159d;p=thirdparty%2Fgcc.git backport: re PR target/52129 (wrong code to pass parameters to tail call function) Backported from mainline 2012-02-06 Jakub Jelinek PR target/52129 * calls.c (mem_overlaps_already_clobbered_arg_p): If val is CONST_INT_P, subtract resp. add crtl->args.pretend_args_size to it. * gcc.c-torture/execute/pr52129.c: New test. From-SVN: r184059 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 42ce5e4ca161..8c2554be0c24 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2012-02-09 Jakub Jelinek Backported from mainline + 2012-02-06 Jakub Jelinek + + PR target/52129 + * calls.c (mem_overlaps_already_clobbered_arg_p): If val is + CONST_INT_P, subtract resp. add crtl->args.pretend_args_size to it. + 2012-02-02 Jakub Jelinek PR middle-end/48071 diff --git a/gcc/calls.c b/gcc/calls.c index c978e6137681..4ad6c3fb0fc7 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1693,6 +1693,11 @@ mem_overlaps_already_clobbered_arg_p (rtx addr, unsigned HOST_WIDE_INT size) return true; else i = INTVAL (val); +#ifdef STACK_GROWS_DOWNWARD + i -= crtl->args.pretend_args_size; +#else + i += crtl->args.pretend_args_size; +#endif #ifdef ARGS_GROW_DOWNWARD i = -i - size; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 91e5f2210c30..1a7c32951eee 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2012-02-09 Jakub Jelinek Backported from mainline + 2012-02-06 Jakub Jelinek + + PR target/52129 + * gcc.c-torture/execute/pr52129.c: New test. + 2012-01-28 Jakub Jelinek PR target/52006 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr52129.c b/gcc/testsuite/gcc.c-torture/execute/pr52129.c new file mode 100644 index 000000000000..a60bfa8bb6af --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr52129.c @@ -0,0 +1,28 @@ +/* PR target/52129 */ + +extern void abort (void); +struct S { void *p; unsigned int q; }; +struct T { char a[64]; char b[64]; } t; + +__attribute__((noinline, noclone)) int +foo (void *x, struct S s, void *y, void *z) +{ + if (x != &t.a[2] || s.p != &t.b[5] || s.q != 27 || y != &t.a[17] || z != &t.b[17]) + abort (); + return 29; +} + +__attribute__((noinline, noclone)) int +bar (void *x, void *y, void *z, struct S s, int t, struct T *u) +{ + return foo (x, s, &u->a[t], &u->b[t]); +} + +int +main () +{ + struct S s = { &t.b[5], 27 }; + if (bar (&t.a[2], (void *) 0, (void *) 0, s, 17, &t) != 29) + abort (); + return 0; +}