public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-5229] Remember fnspec based EAF flags in modref summary.
@ 2021-11-13 14:24 Jan Hubicka
  0 siblings, 0 replies; only message in thread
From: Jan Hubicka @ 2021-11-13 14:24 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:e2dd12ab66d14ac76a92b4538af81f8361132ba0

commit r12-5229-ge2dd12ab66d14ac76a92b4538af81f8361132ba0
Author: Jan Hubicka <jh@suse.cz>
Date:   Sat Nov 13 15:20:00 2021 +0100

    Remember fnspec based EAF flags in modref summary.
    
    gcc/ChangeLog:
    
            * attr-fnspec.h (attr_fnspec::arg_eaf_flags): Break out from ...
            * gimple.c (gimple_call_arg_flags): ... here.
            * ipa-modref.c (analyze_parms): Record flags known from fnspec.
            (modref_merge_call_site_flags): Use arg_eaf_flags.

Diff:
---
 gcc/attr-fnspec.h | 23 +++++++++++++++++++++++
 gcc/gimple.c      | 17 +----------------
 gcc/ipa-modref.c  | 50 +++++++++++++++++++++++++-------------------------
 3 files changed, 49 insertions(+), 41 deletions(-)

diff --git a/gcc/attr-fnspec.h b/gcc/attr-fnspec.h
index 1154c30e7b0..cd618cb342b 100644
--- a/gcc/attr-fnspec.h
+++ b/gcc/attr-fnspec.h
@@ -264,6 +264,29 @@ public:
     return str[1] == 'C' || str[1] == 'P';
   }
 
+  /* Return EAF flags for arg I.  */
+  int
+  arg_eaf_flags (unsigned int i)
+  {
+    int flags = 0;
+
+    if (!arg_specified_p (i))
+      ;
+    else if (!arg_used_p (i))
+      flags = EAF_UNUSED;
+    else
+      {
+	if (arg_direct_p (i))
+	  flags |= EAF_NO_INDIRECT_READ | EAF_NO_INDIRECT_ESCAPE
+		   | EAF_NOT_RETURNED_INDIRECTLY | EAF_NO_INDIRECT_CLOBBER;
+	if (arg_noescape_p (i))
+	  flags |= EAF_NO_DIRECT_ESCAPE | EAF_NO_INDIRECT_ESCAPE;
+	if (arg_readonly_p (i))
+	  flags |= EAF_NO_DIRECT_CLOBBER | EAF_NO_INDIRECT_CLOBBER;
+      }
+    return flags;
+  }
+
   /* Check validity of the string.  */
   void verify ();
 
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 1e0fad92e15..037c6e4c827 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -1567,22 +1567,7 @@ gimple_call_arg_flags (const gcall *stmt, unsigned arg)
   int flags = 0;
 
   if (fnspec.known_p ())
-    {
-      if (!fnspec.arg_specified_p (arg))
-	;
-      else if (!fnspec.arg_used_p (arg))
-	flags = EAF_UNUSED;
-      else
-	{
-	  if (fnspec.arg_direct_p (arg))
-	    flags |= EAF_NO_INDIRECT_READ | EAF_NO_INDIRECT_ESCAPE
-		     | EAF_NOT_RETURNED_INDIRECTLY | EAF_NO_INDIRECT_CLOBBER;
-	  if (fnspec.arg_noescape_p (arg))
-	    flags |= EAF_NO_DIRECT_ESCAPE | EAF_NO_INDIRECT_ESCAPE;
-	  if (fnspec.arg_readonly_p (arg))
-	    flags |= EAF_NO_DIRECT_CLOBBER | EAF_NO_INDIRECT_CLOBBER;
-	}
-    }
+    flags = fnspec.arg_eaf_flags (arg);
   tree callee = gimple_call_fndecl (stmt);
   if (callee)
     {
diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
index 90985cc1326..669dbe45a3d 100644
--- a/gcc/ipa-modref.c
+++ b/gcc/ipa-modref.c
@@ -2476,6 +2476,14 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto,
   /* Do the dataflow.  */
   eaf_analysis.propagate ();
 
+  tree attr = lookup_attribute ("fn spec",
+				TYPE_ATTRIBUTES
+				  (TREE_TYPE (current_function_decl)));
+  attr_fnspec fnspec (attr
+		      ? TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))
+		      : "");
+
+
   /* Store results to summaries.  */
   for (tree parm = DECL_ARGUMENTS (current_function_decl); parm; parm_index++,
        parm = TREE_CHAIN (parm))
@@ -2502,6 +2510,18 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto,
 	  continue;
 	}
       int flags = eaf_analysis.get_ssa_name_flags (name);
+      int attr_flags = fnspec.arg_eaf_flags (parm_index);
+
+      if (dump_file && (flags | attr_flags) != flags && !(flags & EAF_UNUSED))
+	{
+	  fprintf (dump_file,
+		   "  Flags for param %i combined with fnspec flags:",
+		   (int)parm_index);
+	  dump_eaf_flags (dump_file, attr_flags, false);
+	  fprintf (dump_file, " determined: ");
+	  dump_eaf_flags (dump_file, flags, true);
+	}
+      flags |= attr_flags;
 
       /* Eliminate useless flags so we do not end up storing unnecessary
 	 summaries.  */
@@ -2522,8 +2542,8 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto,
 		       "  Flags for param %i combined with IPA pass:",
 		       (int)parm_index);
 	      dump_eaf_flags (dump_file, past, false);
-	      fprintf (dump_file, " local ");
-	      dump_eaf_flags (dump_file, flags | past, true);
+	      fprintf (dump_file, " determined: ");
+	      dump_eaf_flags (dump_file, flags, true);
 	    }
 	  if (!(flags & EAF_UNUSED))
 	    flags |= past;
@@ -2561,7 +2581,7 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto,
 	  fprintf (dump_file,
 		   "  Retslot flags combined with IPA pass:");
 	  dump_eaf_flags (dump_file, past, false);
-	  fprintf (dump_file, " local ");
+	  fprintf (dump_file, " determined: ");
 	  dump_eaf_flags (dump_file, flags, true);
 	}
       if (!(flags & EAF_UNUSED))
@@ -2591,7 +2611,7 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto,
 	  fprintf (dump_file,
 		   "  Static chain flags combined with IPA pass:");
 	  dump_eaf_flags (dump_file, past, false);
-	  fprintf (dump_file, " local ");
+	  fprintf (dump_file, " determined: ");
 	  dump_eaf_flags (dump_file, flags, true);
 	}
       if (!(flags & EAF_UNUSED))
@@ -4503,27 +4523,7 @@ modref_merge_call_site_flags (escape_summary *sum,
       if (fnspec_sum)
 	{
 	  attr_fnspec fnspec (fnspec_sum->fnspec);
-	  int fnspec_flags = 0;
-
-	  if (fnspec.arg_specified_p (ee->arg))
-	    {
-	      if (!fnspec.arg_used_p (ee->arg))
-		fnspec_flags = EAF_UNUSED;
-	      else
-		{
-		  if (fnspec.arg_direct_p (ee->arg))
-		    fnspec_flags |= EAF_NO_INDIRECT_READ
-			     | EAF_NO_INDIRECT_ESCAPE
-			     | EAF_NOT_RETURNED_INDIRECTLY
-			     | EAF_NO_INDIRECT_CLOBBER;
-		  if (fnspec.arg_noescape_p (ee->arg))
-		    fnspec_flags |= EAF_NO_DIRECT_ESCAPE
-				    | EAF_NO_INDIRECT_ESCAPE;
-		  if (fnspec.arg_readonly_p (ee->arg))
-		    flags |= EAF_NO_DIRECT_CLOBBER | EAF_NO_INDIRECT_CLOBBER;
-		}
-	    }
-	  implicit_flags |= fnspec_flags;
+	  implicit_flags |= fnspec.arg_eaf_flags (ee->arg);
 	}
       if (!ee->direct)
 	implicit_flags = deref_flags (implicit_flags, ignore_stores);


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-11-13 14:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-13 14:24 [gcc r12-5229] Remember fnspec based EAF flags in modref summary Jan Hubicka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).