]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add finalize method to modref summary.
authorJan Hubicka <jh@suse.cz>
Sat, 13 Nov 2021 17:21:12 +0000 (18:21 +0100)
committerJan Hubicka <jh@suse.cz>
Sat, 13 Nov 2021 17:21:12 +0000 (18:21 +0100)
gcc/ChangeLog:

* ipa-modref.c (modref_summary::global_memory_read_p): Remove.
(modref_summary::global_memory_written_p): Remove.
(modref_summary::dump): Dump new flags.
(modref_summary::finalize): New member function.
(analyze_function): Call it.
(read_section): Call it.
(update_signature): Call it.
(pass_ipa_modref::execute): Call it.
* ipa-modref.h (struct modref_summary): Remove
global_memory_read_p and global_memory_written_p.
Add global_memory_read, global_memory_written.
* tree-ssa-structalias.c (determine_global_memory_access):
Update.

gcc/ipa-modref.c
gcc/ipa-modref.h
gcc/tree-ssa-structalias.c

index 669dbe45a3d0700a3198340c290a71eae87c0672..84a32ecd32df94ff3a5e36627cd14b3e9cb02323 100644 (file)
@@ -276,7 +276,8 @@ static GTY(()) fast_function_summary <modref_summary_lto *, va_gc>
 
 modref_summary::modref_summary ()
   : loads (NULL), stores (NULL), retslot_flags (0), static_chain_flags (0),
-    writes_errno (false), side_effects (false)
+    writes_errno (false), side_effects (false), global_memory_read (false),
+    global_memory_written (false)
 {
 }
 
@@ -339,26 +340,6 @@ modref_summary::useful_p (int ecf_flags, bool check_flags)
   return stores && !stores->every_base;
 }
 
-/* Return true if global memory is read
-   (that is loads summary contains global memory access).  */
-bool
-modref_summary::global_memory_read_p ()
-{
-  if (!loads)
-    return true;
-  return loads->global_access_p ();
-}
-
-/* Return true if global memory is written.  */
-bool
-modref_summary::global_memory_written_p ()
-{
-  if (!stores)
-    return true;
-  return stores->global_access_p ();
-}
-
-
 /* Single function summary used for LTO.  */
 
 typedef modref_tree <tree> modref_records_lto;
@@ -621,6 +602,10 @@ modref_summary::dump (FILE *out)
     fprintf (out, "  Writes errno\n");
   if (side_effects)
     fprintf (out, "  Side effects\n");
+  if (global_memory_read)
+    fprintf (out, "  Global memory read\n");
+  if (global_memory_written)
+    fprintf (out, "  Global memory written\n");
   if (arg_flags.length ())
     {
       for (unsigned int i = 0; i < arg_flags.length (); i++)
@@ -676,6 +661,15 @@ modref_summary_lto::dump (FILE *out)
     }
 }
 
+/* Called after summary is produced and before it is used by local analysis.
+   Can be called multiple times in case summary needs to update signature.  */
+void
+modref_summary::finalize ()
+{
+  global_memory_read = !loads || loads->global_access_p ();
+  global_memory_written = !stores || stores->global_access_p ();
+}
+
 /* Get function summary for FUNC if it exists, return NULL otherwise.  */
 
 modref_summary *
@@ -2809,8 +2803,7 @@ analyze_function (function *f, bool ipa)
          first = false;
        }
     }
-  if (summary && !summary->global_memory_written_p () && !summary->side_effects
-      && !finite_function_p ())
+  if (summary && !summary->side_effects && !finite_function_p ())
     summary->side_effects = true;
   if (summary_lto && !summary_lto->side_effects && !finite_function_p ())
     summary_lto->side_effects = true;
@@ -2838,6 +2831,8 @@ analyze_function (function *f, bool ipa)
        summaries->remove (fnode);
       summary = NULL;
     }
+  if (summary)
+    summary->finalize ();
   if (summary_lto && !summary_lto->useful_p (ecf_flags))
     {
       summaries_lto->remove (fnode);
@@ -3557,6 +3552,8 @@ read_section (struct lto_file_decl_data *file_data, const char *data,
              modref_read_escape_summary (&bp, e);
            }
        }
+      if (flag_ltrans)
+       modref_sum->finalize ();
       if (dump_file)
        {
          fprintf (dump_file, "Read modref for %s\n",
@@ -3713,6 +3710,8 @@ update_signature (struct cgraph_node *node)
       if (r_lto)
        r_lto->dump (dump_file);
     }
+  if (r)
+    r->finalize ();
   return;
 }
 
@@ -4914,6 +4913,11 @@ pass_ipa_modref::execute (function *)
 
       pureconst |= modref_propagate_in_scc (component_node);
       modref_propagate_flags_in_scc (component_node);
+      if (optimization_summaries)
+       for (struct cgraph_node *cur = component_node; cur;
+            cur = ((struct ipa_dfs_info *) cur->aux)->next_cycle)
+         if (modref_summary *sum = optimization_summaries->get (cur))
+           sum->finalize ();
       if (dump_file)
        modref_propagate_dump_scc (component_node);
     }
index 49c99f263a79987a59a1eaffba6151c1e5c3a7cc..9a8d565d7700c5cd820f14f74c47406040fb452c 100644 (file)
@@ -33,15 +33,18 @@ struct GTY(()) modref_summary
   auto_vec<eaf_flags_t> GTY((skip)) arg_flags;
   eaf_flags_t retslot_flags;
   eaf_flags_t static_chain_flags;
-  bool writes_errno;
-  bool side_effects;
+  unsigned writes_errno : 1;
+  unsigned side_effects : 1;
+  /* Flags coputed by finalize method.  */
+  unsigned global_memory_read : 1;
+  unsigned global_memory_written : 1;
+
 
   modref_summary ();
   ~modref_summary ();
   void dump (FILE *);
   bool useful_p (int ecf_flags, bool check_flags = true);
-  bool global_memory_read_p ();
-  bool global_memory_written_p ();
+  void finalize ();
 };
 
 modref_summary *get_modref_function_summary (cgraph_node *func);
index 34fd47fdf47b25652afc583ed68ad708bdfe0034..6141e944b9fcb9f15b1a85c0ef26497e6a5fd306 100644 (file)
@@ -4262,9 +4262,9 @@ determine_global_memory_access (gcall *stmt,
       && (summary = get_modref_function_summary (node)))
     {
       if (writes_global_memory && *writes_global_memory)
-       *writes_global_memory = summary->global_memory_written_p ();
+       *writes_global_memory = summary->global_memory_written;
       if (reads_global_memory && *reads_global_memory)
-       *reads_global_memory = summary->global_memory_read_p ();
+       *reads_global_memory = summary->global_memory_read;
       if (reads_global_memory && uses_global_memory
          && !*reads_global_memory && node->binds_to_current_def_p ())
        *uses_global_memory = false;