From a8aa8251dbcf972d63c3af2c4ba65fe2dffe9d58 Mon Sep 17 00:00:00 2001 From: hubicka Date: Wed, 10 Dec 2014 21:17:28 +0000 Subject: [PATCH] * doc/invoke.texi: (-devirtualize-at-ltrans): Document. * lto-cgraph.c (lto_output_varpool_node): Mark initializer as removed when it is not streamed to the given ltrans. (compute_ltrans_boundary): Make code adding all polymorphic call targets conditional with !flag_wpa || flag_ltrans_devirtualize. * common.opt (fdevirtualize-at-ltrans): New flag. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218609 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++++++ gcc/common.opt | 4 ++++ gcc/doc/invoke.texi | 10 +++++++++- gcc/lto-cgraph.c | 12 ++++++++---- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6befea5041c4..a9378a560c46 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-12-10 Jan Hubicka + + * doc/invoke.texi: (-devirtualize-at-ltrans): Document. + * lto-cgraph.c (lto_output_varpool_node): Mark initializer as removed + when it is not streamed to the given ltrans. + (compute_ltrans_boundary): Make code adding all polymorphic + call targets conditional with !flag_wpa || flag_ltrans_devirtualize. + * common.opt (fdevirtualize-at-ltrans): New flag. + 2014-12-10 Ilya Verbin * varpool.c (varpool_node::get_create): Force output of vars with diff --git a/gcc/common.opt b/gcc/common.opt index 78b796b85570..3b8b14d46268 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1062,6 +1062,10 @@ fdelete-null-pointer-checks Common Report Var(flag_delete_null_pointer_checks) Init(1) Optimization Delete useless null pointer checks +fdevirtualize-at-ltrans +Common Report Var(flag_ltrans_devirtualize) +Perofrm extra streaming to support more agressive devirtualization at LTO ltrans stage. + fdevirtualize-speculatively Common Report Var(flag_devirtualize_speculatively) Optimization Perform speculative devirtualization diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index d2f3c79536a0..1579702e20a4 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -375,7 +375,8 @@ Objective-C and Objective-C++ Dialects}. -fcse-follow-jumps -fcse-skip-blocks -fcx-fortran-rules @gol -fcx-limited-range @gol -fdata-sections -fdce -fdelayed-branch @gol --fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fdse @gol +-fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively @gol +-devirtualize-at-ltrans -fdse @gol -fearly-inlining -fipa-sra -fexpensive-optimizations -ffat-lto-objects @gol -ffast-math -ffinite-math-only -ffloat-store -fexcess-precision=@var{style} @gol -fforward-propagate -ffp-contract=@var{style} -ffunction-sections @gol @@ -7730,6 +7731,13 @@ the call into an conditional deciding on direct and indirect call. The speculative calls enable more optimizations, such as inlining. When they seem useless after further optimization, they are converted back into original form. +@item -fdevirtualize-at-ltrans +@opindex fdevirtualize-at-ltrans +Perform extra streaming needed for agressive devirtualization during LTO local +transformation stage. This option enables more devirtualization but +significantly increases the size of streamed data. For this reason it is +disabled by default. + @item -fexpensive-optimizations @opindex fexpensive-optimizations Perform a number of minor optimizations that are relatively expensive. diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index b310b446808a..cf92892ba00c 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -615,7 +615,8 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node, bp_pack_value (&bp, node->force_output, 1); bp_pack_value (&bp, node->forced_by_abi, 1); bp_pack_value (&bp, node->unique_name, 1); - bp_pack_value (&bp, node->body_removed, 1); + bp_pack_value (&bp, node->body_removed + || !lto_symtab_encoder_encode_initializer_p (encoder, node), 1); bp_pack_value (&bp, node->implicit_section, 1); bp_pack_value (&bp, node->writeonly, 1); bp_pack_value (&bp, node->definition, 1); @@ -910,8 +911,11 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder) { if (!lto_symtab_encoder_encode_initializer_p (encoder, vnode) - && (vnode->ctor_useable_for_folding_p () - || POINTER_BOUNDS_P (vnode->decl))) + && (((vnode->ctor_useable_for_folding_p () + && (!DECL_VIRTUAL_P (vnode->decl) + || !flag_wpa + || flag_ltrans_devirtualize)) + || POINTER_BOUNDS_P (vnode->decl)))) { lto_set_symtab_encoder_encode_initializer (encoder, vnode); create_references (encoder, vnode); @@ -936,7 +940,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder) } } /* Add all possible targets for late devirtualization. */ - if (flag_devirtualize) + if (flag_ltrans_devirtualize || !flag_wpa) for (edge = node->indirect_calls; edge; edge = edge->next_callee) if (edge->indirect_info->polymorphic) { -- 2.47.3