]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Remember fnspec based EAF flags in modref summary.
authorJan Hubicka <jh@suse.cz>
Sat, 13 Nov 2021 14:20:00 +0000 (15:20 +0100)
committerJan Hubicka <jh@suse.cz>
Sat, 13 Nov 2021 14:20:00 +0000 (15:20 +0100)
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.

gcc/attr-fnspec.h
gcc/gimple.c
gcc/ipa-modref.c

index 1154c30e7b0df2f91510bbdb81075b4ddb0af3b2..cd618cb342bf739b4a1f2d73ff500e8a83f8a430 100644 (file)
@@ -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 ();
 
index 1e0fad92e15c8cb85170db89675dc082789d27c7..037c6e4c8275fa219b953766446cd03950fc6ca0 100644 (file)
@@ -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)
     {
index 90985cc13269504a188d6b3484ec91714ee6afc3..669dbe45a3d0700a3198340c290a71eae87c0672 100644 (file)
@@ -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);