OSDN Git Service

* cgraph.c (dump_cgraph_node): Dump versionable flag.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 16 May 2010 22:24:26 +0000 (22:24 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 16 May 2010 22:24:26 +0000 (22:24 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159467 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cgraph.c
gcc/cgraph.h
gcc/ipa-cp.c
gcc/lto-cgraph.c

index 6053f00..cfb3a7f 100644 (file)
@@ -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
index 6e30ec1..29a1b36 100644 (file)
@@ -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
index d0f7e9a..f8d8e6e 100644 (file)
@@ -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;
 
index 942475b..88a5b4f 100644 (file)
@@ -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.  */
index c6ef21f..48e834e 100644 (file)
@@ -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);