Add initial constraints in create_function_info_for
authorTom de Vries <tom@codesourcery.com>
Sat, 31 Oct 2015 08:08:39 +0000 (08:08 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Sat, 31 Oct 2015 08:08:39 +0000 (08:08 +0000)
2015-10-31  Tom de Vries  <tom@codesourcery.com>

* tree-ssa-structalias.c (ipa_pta_execute): Add extra arg to call to
create_function_info_for.  Dump constraints generated during
create_function_info_for. Move intra_create_variable_infos call and
function-return-values-escape bit to ...
(create_function_info_for): ... here, and merge
intra_create_variable_infos call with argument loop.  Add and handle
nonlocal_p parameter.

From-SVN: r229619

gcc/ChangeLog
gcc/tree-ssa-structalias.c

index bf96f97c9decce1fbad21947258ec68aeca78813..c4d833bbb5126b902541a0f3b040a8c0c2496a5f 100644 (file)
@@ -1,3 +1,13 @@
+2015-10-31  Tom de Vries  <tom@codesourcery.com>
+
+       * tree-ssa-structalias.c (ipa_pta_execute): Add extra arg to call to
+       create_function_info_for.  Dump constraints generated during
+       create_function_info_for. Move intra_create_variable_infos call and
+       function-return-values-escape bit to ...
+       (create_function_info_for): ... here, and merge
+       intra_create_variable_infos call with argument loop.  Add and handle
+       nonlocal_p parameter.
+
 2015-10-31  Tom de Vries  <tom@codesourcery.com>
 
        * tree-ssa-structalias.c (create_function_info_for): Make sure prev_vi
index a67e7f3e5e9a25334fae292ae6eef8dc561ff97a..7b6553cd99fbeb87b9facee581c1406b8b65dc5e 100644 (file)
@@ -5409,10 +5409,12 @@ count_num_arguments (tree decl, bool *is_varargs)
 }
 
 /* Creation function node for DECL, using NAME, and return the index
-   of the variable we've created for the function.  */
+   of the variable we've created for the function.  If NONLOCAL_p, create
+   initial constraints.  */
 
 static varinfo_t
-create_function_info_for (tree decl, const char *name, bool add_id)
+create_function_info_for (tree decl, const char *name, bool add_id,
+                         bool nonlocal_p)
 {
   struct function *fn = DECL_STRUCT_FUNCTION (decl);
   varinfo_t vi, prev_vi;
@@ -5493,6 +5495,10 @@ create_function_info_for (tree decl, const char *name, bool add_id)
 
       insert_vi_for_tree (fn->static_chain_decl, chainvi);
 
+      if (nonlocal_p
+         && chainvi->may_have_pointers)
+       make_constraint_from (chainvi, nonlocal_id);
+
       gcc_assert (prev_vi->offset < chainvi->offset);
       prev_vi->next = chainvi->id;
       prev_vi = chainvi;
@@ -5530,6 +5536,18 @@ create_function_info_for (tree decl, const char *name, bool add_id)
       prev_vi = resultvi;
     }
 
+  /* We also need to make function return values escape.  Nothing
+     escapes by returning from main though.  */
+  if (nonlocal_p
+      && !MAIN_NAME_P (DECL_NAME (decl)))
+    {
+      varinfo_t fi, rvi;
+      fi = lookup_vi_for_tree (decl);
+      rvi = first_vi_for_offset (fi, fi_result);
+      if (rvi && rvi->offset == fi_result)
+       make_copy_constraint (get_varinfo (escaped_id), rvi->id);
+    }
+
   /* Set up variables for each argument.  */
   arg = DECL_ARGUMENTS (decl);
   for (i = 0; i < num_args; i++)
@@ -5557,6 +5575,10 @@ create_function_info_for (tree decl, const char *name, bool add_id)
       if (arg)
        insert_vi_for_tree (arg, argvi);
 
+      if (nonlocal_p
+         && argvi->may_have_pointers)
+       make_constraint_from (argvi, nonlocal_id);
+
       gcc_assert (prev_vi->offset < argvi->offset);
       prev_vi->next = argvi->id;
       prev_vi = argvi;
@@ -5586,6 +5608,10 @@ create_function_info_for (tree decl, const char *name, bool add_id)
       argvi->is_heap_var = true;
       argvi->fullsize = vi->fullsize;
 
+      if (nonlocal_p
+         && argvi->may_have_pointers)
+       make_constraint_from (argvi, nonlocal_id);
+
       gcc_assert (prev_vi->offset < argvi->offset);
       prev_vi->next = argvi->id;
       prev_vi = argvi;
@@ -7312,8 +7338,34 @@ ipa_pta_execute (void)
 
       gcc_assert (!node->clone_of);
 
+      /* For externally visible or attribute used annotated functions use
+        local constraints for their arguments.
+        For local functions we see all callers and thus do not need initial
+        constraints for parameters.  */
+      bool nonlocal_p = (node->used_from_other_partition
+                        || node->externally_visible
+                        || node->force_output
+                        || node->address_taken);
+
       vi = create_function_info_for (node->decl,
-                                    alias_get_name (node->decl), false);
+                                    alias_get_name (node->decl), false,
+                                    nonlocal_p);
+      if (dump_file
+         && from != constraints.length ())
+       {
+         fprintf (dump_file,
+                  "Generating intial constraints for %s", node->name ());
+         if (DECL_ASSEMBLER_NAME_SET_P (node->decl))
+           fprintf (dump_file, " (%s)",
+                    IDENTIFIER_POINTER
+                      (DECL_ASSEMBLER_NAME (node->decl)));
+         fprintf (dump_file, "\n\n");
+         dump_constraints (dump_file, from);
+         fprintf (dump_file, "\n");
+
+         from = constraints.length ();
+       }
+
       node->call_for_symbol_thunks_and_aliases
        (associate_varinfo_to_alias, vi, true);
     }
@@ -7360,29 +7412,6 @@ ipa_pta_execute (void)
       func = DECL_STRUCT_FUNCTION (node->decl);
       gcc_assert (cfun == NULL);
 
-      /* For externally visible or attribute used annotated functions use
-        local constraints for their arguments.
-        For local functions we see all callers and thus do not need initial
-        constraints for parameters.  */
-      if (node->used_from_other_partition
-         || node->externally_visible
-         || node->force_output
-         || node->address_taken)
-       {
-         intra_create_variable_infos (func);
-
-         /* We also need to make function return values escape.  Nothing
-            escapes by returning from main though.  */
-         if (!MAIN_NAME_P (DECL_NAME (node->decl)))
-           {
-             varinfo_t fi, rvi;
-             fi = lookup_vi_for_tree (node->decl);
-             rvi = first_vi_for_offset (fi, fi_result);
-             if (rvi && rvi->offset == fi_result)
-               make_copy_constraint (get_varinfo (escaped_id), rvi->id);
-           }
-       }
-
       /* Build constriants for the function body.  */
       FOR_EACH_BB_FN (bb, func)
        {