diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-05-20 23:33:46 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-05-20 23:33:46 +0200 |
commit | 500e4868bf5c89a3136fb329293872d29632ffad (patch) | |
tree | 0176007982f06d3562abe18ff9dd21f58bf4643a /gcc/tree-inline.c | |
parent | 3e03ed662651dada81e39d8850da82e80f54fd2d (diff) | |
download | gcc-500e4868bf5c89a3136fb329293872d29632ffad.zip gcc-500e4868bf5c89a3136fb329293872d29632ffad.tar.gz gcc-500e4868bf5c89a3136fb329293872d29632ffad.tar.bz2 |
re PR c++/59813 (tail-call elimination didn't fire for left-shift of char to cout)
PR c++/59813
PR target/90418
* function.h (struct function): Add calls_eh_return member.
* gimplify.c (gimplify_call_expr): Set cfun->calls_eh_return when
gimplifying __builtin_eh_return call.
* tree-inline.c (initialize_cfun): Copy calls_eh_return from src_cfun
to cfun.
(expand_call_inline): Or in src_cfun->calls_eh_return into
dst_cfun->calls_eh_return.
* tree-tailcall.c (suitable_for_tail_call_opt_p): Return false if
cfun->calls_eh_return.
* lto-streamer-in.c (input_struct_function_base): Read calls_eh_return.
* lto-streamer-out.c (output_struct_function_base): Write
calls_eh_return.
From-SVN: r271440
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 7598674..719846a 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -2662,6 +2662,7 @@ initialize_cfun (tree new_fndecl, tree callee_fndecl, profile_count count) cfun->va_list_gpr_size = src_cfun->va_list_gpr_size; cfun->va_list_fpr_size = src_cfun->va_list_fpr_size; cfun->has_nonlocal_label = src_cfun->has_nonlocal_label; + cfun->calls_eh_return = src_cfun->calls_eh_return; cfun->stdarg = src_cfun->stdarg; cfun->after_inlining = src_cfun->after_inlining; cfun->can_throw_non_call_exceptions @@ -4778,6 +4779,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) src_properties = id->src_cfun->curr_properties & prop_mask; if (src_properties != prop_mask) dst_cfun->curr_properties &= src_properties | ~prop_mask; + dst_cfun->calls_eh_return |= id->src_cfun->calls_eh_return; gcc_assert (!id->src_cfun->after_inlining); |