From 225a08220e444371ae4867b3e2ace275d30af3d3 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 17 Sep 2020 12:58:02 +0200 Subject: [PATCH] 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. --- gcc/function.c | 10 +++++++--- gcc/testsuite/gcc.dg/pr97078.c | 9 +++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr97078.c diff --git a/gcc/function.c b/gcc/function.c index c4c9930..c612959 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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); diff --git a/gcc/testsuite/gcc.dg/pr97078.c b/gcc/testsuite/gcc.dg/pr97078.c new file mode 100644 index 0000000..997d5fb --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97078.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ffloat-store" } */ + +extern void foo (long double); + +void bar (long double d) +{ + foo (d); +} -- 2.7.4