diff options
author | Jan Hubicka <jh@suse.cz> | 2010-05-17 00:24:26 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2010-05-16 22:24:26 +0000 |
commit | ccbbf8a2db7c501bc3ad176b741f4de4e1c9642a (patch) | |
tree | 4771f6f7459bb79d821387c1cdb37bd5ee699b11 /gcc | |
parent | 91fbf0c7c60930152acf7ec888ffa08383a20453 (diff) | |
download | gcc-ccbbf8a2db7c501bc3ad176b741f4de4e1c9642a.tar.gz |
cgraph.c (dump_cgraph_node): Dump versionable flag.
* cgraph.c (dump_cgraph_node): Dump versionable flag.
* cgraph.h (cgraph_local_info): Add versionable flag.
* ipa-cp.c (ipcp_analyze_node): Set versionable flag.
(ipcp_versionable_function_p): Use it.
* lto-cgraph.c (lto_output_node, input_overwrite_node): Stream
versionable flag.
From-SVN: r159467
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cgraph.c | 4 | ||||
-rw-r--r-- | gcc/cgraph.h | 4 | ||||
-rw-r--r-- | gcc/ipa-cp.c | 3 | ||||
-rw-r--r-- | gcc/lto-cgraph.c | 2 |
5 files changed, 23 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6053f009a85..cfb3a7f1a73 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2010-05-16 Jan Hubicka <jh@suse.cz> + * cgraph.c (dump_cgraph_node): Dump versionable flag. + * cgraph.h (cgraph_local_info): Add versionable flag. + * ipa-cp.c (ipcp_analyze_node): Set versionable flag. + (ipcp_versionable_function_p): Use it. + * lto-cgraph.c (lto_output_node, input_overwrite_node): Stream + versionable flag. + +2010-05-16 Jan Hubicka <jh@suse.cz> + * cgraph.c (cgraph_clone_node): Take decl argument and insert clone into hash when it is different from orig. (cgraph_create_virtual_clone): Update use of cgraph_clone_node. @@ -7,7 +16,8 @@ * lto-cgrpah.c (lto_cgraph_encoder_new): Create body map. (lto_cgraph_encoder_delete): Delete body map. (lto_cgraph_encoder_size): Move to header. - (lto_cgraph_encoder_encode_body_p, lto_set_cgraph_encoder_encode_body): New. + (lto_cgraph_encoder_encode_body_p, + lto_set_cgraph_encoder_encode_body): New. (lto_output_node): Do not take written_decls argument; output clone_of pointer. (add_node_to): Add include_body_argument; call diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 6e30ec1435d..29a1b365737 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -1830,6 +1830,8 @@ dump_cgraph_node (FILE *f, struct cgraph_node *node) fprintf (f, " always_inline"); else if (node->local.inlinable) fprintf (f, " inlinable"); + else if (node->local.versionable) + fprintf (f, " versionable"); if (node->local.redefined_extern_inline) fprintf (f, " redefined_extern_inline"); if (TREE_ASM_WRITTEN (node->decl)) @@ -2046,6 +2048,8 @@ cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n, /* Create node representing clone of N executed COUNT times. Decrease the execution counts from original node too. + The new clone will have decl set to DECL that may or may not be the same + as decl of N. When UPDATE_ORIGINAL is true, the counts are subtracted from the original function's profile to reflect the fact that part of execution is handled diff --git a/gcc/cgraph.h b/gcc/cgraph.h index d0f7e9a7047..f8d8e6e8291 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -105,6 +105,10 @@ struct GTY(()) cgraph_local_info { /* False when there something makes inlining impossible (such as va_arg). */ unsigned inlinable : 1; + /* False when there something makes versioning impossible. + Currently computed and used only by ipa-cp. */ + unsigned versionable : 1; + /* True when function should be inlined independently on its size. */ unsigned disregard_inline_limits : 1; diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 942475bc271..88a5b4fffc6 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -183,6 +183,7 @@ ipcp_analyze_node (struct cgraph_node *node) /* Unreachable nodes should have been eliminated before ipcp. */ gcc_assert (node->needed || node->reachable); + node->local.versionable = tree_versionable_function_p (node->decl); ipa_initialize_node_params (node); ipa_detect_param_modifications (node); } @@ -419,7 +420,7 @@ ipcp_versionable_function_p (struct cgraph_node *node) basic_block bb; /* There are a number of generic reasons functions cannot be versioned. */ - if (!tree_versionable_function_p (decl)) + if (!node->local.versionable) return false; /* Removing arguments doesn't work if the function takes varargs. */ diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index c6ef21f6338..48e834e566a 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -468,6 +468,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node, bp_pack_value (bp, node->local.externally_visible, 1); bp_pack_value (bp, node->local.finalized, 1); bp_pack_value (bp, node->local.inlinable, 1); + bp_pack_value (bp, node->local.versionable, 1); bp_pack_value (bp, node->local.disregard_inline_limits, 1); bp_pack_value (bp, node->local.redefined_extern_inline, 1); bp_pack_value (bp, node->local.vtable_method, 1); @@ -921,6 +922,7 @@ input_overwrite_node (struct lto_file_decl_data *file_data, node->local.externally_visible = bp_unpack_value (bp, 1); node->local.finalized = bp_unpack_value (bp, 1); node->local.inlinable = bp_unpack_value (bp, 1); + node->local.versionable = bp_unpack_value (bp, 1); node->local.disregard_inline_limits = bp_unpack_value (bp, 1); node->local.redefined_extern_inline = bp_unpack_value (bp, 1); node->local.vtable_method = bp_unpack_value (bp, 1); |