* 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.
From-SVN: r218609
+2014-12-10 Jan Hubicka <hubicka@ucw.cz>
+
+ * 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 <ilya.verbin@intel.com>
* varpool.c (varpool_node::get_create): Force output of vars with
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
-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
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.
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);
{
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);
}
}
/* 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)
{