Fix assertion checking failure with tail call

gcc/ChangeLog:
	PR middle-end/97078
	* function.c (use_register_for_decl): Test cfun->tail_call_marked
	for a parameter here instead of...
	(assign_parm_setup_reg): ...here.

gcc/testsuite/ChangeLog:
	* gcc.dg/pr97078.c: New test.
This commit is contained in:
Eric Botcazou 2020-09-17 12:58:02 +02:00
parent 80cbca3246
commit 225a08220e
2 changed files with 16 additions and 3 deletions

View File

@ -2237,6 +2237,11 @@ use_register_for_decl (const_tree decl)
if (optimize)
return true;
/* Thunks force a tail call even at -O0 so we need to avoid creating a
dangling reference in case the parameter is passed by reference. */
if (TREE_CODE (decl) == PARM_DECL && cfun->tail_call_marked)
return true;
if (!DECL_REGISTER (decl))
return false;
@ -3328,9 +3333,8 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
of the parameter instead. */
if (data->arg.pass_by_reference && TYPE_MODE (TREE_TYPE (parm)) != BLKmode)
{
/* Use a stack slot for debugging purposes, except if a tail call is
involved because this would create a dangling reference. */
if (use_register_for_decl (parm) || cfun->tail_call_marked)
/* Use a stack slot for debugging purposes if possible. */
if (use_register_for_decl (parm))
{
parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
mark_user_reg (parmreg);

View File

@ -0,0 +1,9 @@
/* { dg-do compile } */
/* { dg-options "-O2 -ffloat-store" } */
extern void foo (long double);
void bar (long double d)
{
foo (d);
}