This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR ipa/64813
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: Martin Liška <mliska at suse dot cz>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, dominique Dhumieres <dominiq at lps dot ens dot fr>
- Date: Tue, 10 Feb 2015 21:25:17 +0100
- Subject: Re: [PATCH] Fix PR ipa/64813
- Authentication-results: sourceware.org; auth=none
- References: <54D9E67C dot 209 at suse dot cz>
> Hello.
>
> Following patch is fix for PR ipa/64813. The patch was tested on a darwin target
> by Dominique.
>
> Ready for trunk?
OK,
Honza
> Thanks,
> Martin
> >From ce1c7031e2616d840ce55559c1bc45587d64134f Mon Sep 17 00:00:00 2001
> From: mliska <mliska@suse.cz>
> Date: Fri, 30 Jan 2015 15:12:59 +0100
> Subject: [PATCH] Handle noreturn function thunk creation.
>
> gcc/ChangeLog:
>
> 2015-02-09 Martin Liska <mliska@suse.cz>
>
> PR ipa/64813
> * cgraphunit.c (cgraph_node::expand_thunk): Do not create
> a return value for call to a function that is noreturn.
> ---
> gcc/cgraphunit.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
> index 8280fc4..77c8dd8 100644
> --- a/gcc/cgraphunit.c
> +++ b/gcc/cgraphunit.c
> @@ -1572,6 +1572,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
>
> gcall *call;
> greturn *ret;
> + bool alias_is_noreturn = TREE_THIS_VOLATILE (alias);
>
> if (in_lto_p)
> get_untransformed_body ();
> @@ -1608,7 +1609,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
> bsi = gsi_start_bb (bb);
>
> /* Build call to the function being thunked. */
> - if (!VOID_TYPE_P (restype))
> + if (!VOID_TYPE_P (restype) && !alias_is_noreturn)
> {
> if (DECL_BY_REFERENCE (resdecl))
> {
> @@ -1667,14 +1668,14 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
> callees->call_stmt = call;
> gimple_call_set_from_thunk (call, true);
> gimple_call_set_with_bounds (call, instrumentation_clone);
> - if (restmp)
> + if (restmp && !alias_is_noreturn)
> {
> gimple_call_set_lhs (call, restmp);
> gcc_assert (useless_type_conversion_p (TREE_TYPE (restmp),
> TREE_TYPE (TREE_TYPE (alias))));
> }
> gsi_insert_after (&bsi, call, GSI_NEW_STMT);
> - if (!(gimple_call_flags (call) & ECF_NORETURN))
> + if (!alias_is_noreturn)
> {
> if (restmp && !this_adjusting
> && (fixed_offset || virtual_offset))
> --
> 2.1.2
>