From: jakub Date: Mon, 6 Feb 2012 13:33:05 +0000 (+0000) Subject: PR target/52129 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=98d44ce4699cd289ca874c4a270bce355227205f;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183933 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 072fc3c37666..7effee6db59d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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-06 Jonathan Wakely PR c++/48680 diff --git a/gcc/calls.c b/gcc/calls.c index 943ab093c0fc..53c033547268 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1808,6 +1808,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 2f66445da647..6361ab0e0e5c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-02-06 Jakub Jelinek + + PR target/52129 + * gcc.c-torture/execute/pr52129.c: New test. + 2012-02-06 Andrey Belevantsev * gcc.dg/pr48374.c: Actually add the test I forgot 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; +}