This patch adds a new field to cgraph_node called assume_function.  It
serves the same purpose as the field of the same name in struct
function.  Struct function is not always available (e.g. LTO), so this field
preserves the information.

gcc/ChangeLog:

        * cgraph.cc (cgraph_node::dump): Print the new flag.
        * cgraph.h (struct cgraph_node): Add assume_function field.
        * cgraphclones.cc (cgraph_node::create_clone): Copy over the
        assume_function flag.
        * gimple-low.cc (lower_assumption): Set assume_function to TRUE
        for assume bodies.
        * lto-cgraph.cc (lto_output_node): Stream out assume_function.
        (input_overwrite_node): Read assume_function.

Signed-off-by: Josef Melcr <[email protected]>
---
 gcc/cgraph.cc       | 2 ++
 gcc/cgraph.h        | 6 ++++--
 gcc/cgraphclones.cc | 1 +
 gcc/gimple-low.cc   | 2 ++
 gcc/lto-cgraph.cc   | 2 ++
 5 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc
index 8e349189724..c1bf53f6c36 100644
--- a/gcc/cgraph.cc
+++ b/gcc/cgraph.cc
@@ -2583,6 +2583,8 @@ cgraph_node::dump (FILE *f)
     fprintf (f, " calls_comdat_local");
   if (icf_merged)
     fprintf (f, " icf_merged");
+  if (assume_function)
+    fprintf (f, " assume_function");
   if (merged_comdat)
     fprintf (f, " merged_comdat");
   if (merged_extern_inline)
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index d9f3d4815b0..5f8e4235184 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -939,8 +939,8 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public 
symtab_node
       only_called_at_startup (false), only_called_at_exit (false),
       tm_clone (false), dispatcher_function (false),
       dispatcher_resolver_function (false), is_target_clone (false),
-      calls_comdat_local (false),
-      icf_merged (false), nonfreeing_fn (false), merged_comdat (false),
+      calls_comdat_local (false), icf_merged (false), assume_function (false),
+      nonfreeing_fn (false), merged_comdat (false),
       merged_extern_inline (false), parallelized_function (false),
       split_part (false), indirect_call_target (false), local (false),
       versionable (false), can_change_signature (false),
@@ -1536,6 +1536,8 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : 
public symtab_node
   unsigned calls_comdat_local : 1;
   /* True if node has been created by merge operation in IPA-ICF.  */
   unsigned icf_merged: 1;
+  /* True if node has been created by lowering an [[assume(...)]] statement.  
*/
+  unsigned assume_function : 1;
   /* True if call to node can't result in a call to free, munmap or
      other operation that could make previously non-trapping memory
      accesses trapping.  */
diff --git a/gcc/cgraphclones.cc b/gcc/cgraphclones.cc
index b5f2ce5ff2f..c5aead0c3b8 100644
--- a/gcc/cgraphclones.cc
+++ b/gcc/cgraphclones.cc
@@ -452,6 +452,7 @@ cgraph_node::create_clone (tree new_decl, profile_count 
prof_count,
   new_node->tp_first_run = tp_first_run;
   new_node->tm_clone = tm_clone;
   new_node->icf_merged = icf_merged;
+  new_node->assume_function = assume_function;
   new_node->thunk = thunk;
   new_node->unit_id = unit_id;
   new_node->merged_comdat = merged_comdat;
diff --git a/gcc/gimple-low.cc b/gcc/gimple-low.cc
index ed752429854..8d9ffd24124 100644
--- a/gcc/gimple-low.cc
+++ b/gcc/gimple-low.cc
@@ -677,6 +677,8 @@ lower_assumption (gimple_stmt_iterator *gsi, struct 
lower_data *data)
   DECL_STRUCT_FUNCTION (lad.id.dst_fn)->stdarg = 0;
 
   cgraph_node::add_new_function (lad.id.dst_fn, false);
+  cgraph_node *dst_node = cgraph_node::get (lad.id.dst_fn);
+  dst_node->assume_function = 1;
 
   for (unsigned i = 0; i < sz; ++i)
     {
diff --git a/gcc/lto-cgraph.cc b/gcc/lto-cgraph.cc
index bffe35f2353..b3644e47bec 100644
--- a/gcc/lto-cgraph.cc
+++ b/gcc/lto-cgraph.cc
@@ -561,6 +561,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct 
cgraph_node *node,
   bp_pack_value (&bp, node->tm_clone, 1);
   bp_pack_value (&bp, node->calls_comdat_local, 1);
   bp_pack_value (&bp, node->icf_merged, 1);
+  bp_pack_value (&bp, node->assume_function, 1);
   bp_pack_value (&bp, node->nonfreeing_fn, 1);
   bp_pack_value (&bp, node->merged_comdat, 1);
   bp_pack_value (&bp, node->merged_extern_inline, 1);
@@ -1299,6 +1300,7 @@ input_overwrite_node (struct lto_file_decl_data 
*file_data,
   node->tm_clone = bp_unpack_value (bp, 1);
   node->calls_comdat_local = bp_unpack_value (bp, 1);
   node->icf_merged = bp_unpack_value (bp, 1);
+  node->assume_function = bp_unpack_value (bp, 1);
   node->nonfreeing_fn = bp_unpack_value (bp, 1);
   node->merged_comdat = bp_unpack_value (bp, 1);
   node->merged_extern_inline = bp_unpack_value (bp, 1);
-- 
2.55.0

Reply via email to