Commit b3877860 by Kyrylo Tkachov Committed by Kyrylo Tkachov

[calls.c] PR rtl-optimization/67226: Take into account pretend_args_size when…

[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
parent 62775f0d
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
......@@ -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
......
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
......
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;
}
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