[calls.c] PR rtl-optimization/67226: Take into account pretend_args_size when checking stack offsets for sibcall optimisation

2015-11-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
            Bernd Schmidt  <bschmidt@redhat.com>

	PR rtl-optimization/67226
	* calls.c (store_one_arg): Take into account
	crtl->args.pretend_args_size when checking for overlap between
	arg->value and argblock + arg->locate.offset during sibcall
	optimization.

	* gcc.c-torture/execute/pr67226.c: New test.


Co-Authored-By: Bernd Schmidt <bernds@redhat.com>

From-SVN: r230929
This commit is contained in:
Kyrylo Tkachov 2015-11-26 09:58:28 +00:00 committed by Kyrylo Tkachov
parent 62775f0d9a
commit b3877860a8
4 changed files with 63 additions and 0 deletions

View File

@ -1,3 +1,12 @@
2015-11-26 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Bernd Schmidt <bschmidt@redhat.com>
PR rtl-optimization/67226
* calls.c (store_one_arg): Take into account
crtl->args.pretend_args_size when checking for overlap between
arg->value and argblock + arg->locate.offset during sibcall
optimization.
2015-11-26 Wilco Dijkstra <wdijkstr@arm.com>
* config/aarch64/aarch64.md (cbranch<mode>4): Use

View File

@ -4939,6 +4939,13 @@ store_one_arg (struct arg_data *arg, rtx argblock, int flags,
if (XEXP (x, 0) != crtl->args.internal_arg_pointer)
i = INTVAL (XEXP (XEXP (x, 0), 1));
/* arg.locate doesn't contain the pretend_args_size offset,
it's part of argblock. Ensure we don't count it in I. */
if (STACK_GROWS_DOWNWARD)
i -= crtl->args.pretend_args_size;
else
i += crtl->args.pretend_args_size;
/* expand_call should ensure this. */
gcc_assert (!arg->locate.offset.var
&& arg->locate.size.var == 0

View File

@ -1,3 +1,8 @@
2015-11-26 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR rtl-optimization/67226
* gcc.c-torture/execute/pr67226.c: New test.
2015-11-26 Jakub Jelinek <jakub@redhat.com>
PR c++/68508

View File

@ -0,0 +1,42 @@
struct assembly_operand
{
int type, value, symtype, symflags, marker;
};
struct assembly_operand to_input, from_input;
void __attribute__ ((__noinline__, __noclone__))
assemblez_1 (int internal_number, struct assembly_operand o1)
{
if (o1.type != from_input.type)
__builtin_abort ();
}
void __attribute__ ((__noinline__, __noclone__))
t0 (struct assembly_operand to, struct assembly_operand from)
{
if (to.value == 0)
assemblez_1 (32, from);
else
__builtin_abort ();
}
int
main (void)
{
to_input.value = 0;
to_input.type = 1;
to_input.symtype = 2;
to_input.symflags = 3;
to_input.marker = 4;
from_input.value = 5;
from_input.type = 6;
from_input.symtype = 7;
from_input.symflags = 8;
from_input.marker = 9;
t0 (to_input, from_input);
return 0;
}