aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/common.opt4
-rw-r--r--gcc/doc/invoke.texi10
-rw-r--r--gcc/lto-cgraph.c12
4 files changed, 30 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6befea5..a9378a5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+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
diff --git a/gcc/common.opt b/gcc/common.opt
index 78b796b..3b8b14d 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 d2f3c79..1579702 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 b310b44..cf92892 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)
{