Add handle_param parameter to create_variable_info_for_1
2015-10-26 Tom de Vries <tom@codesourcery.com>
* tree-ssa-structalias.c (create_variable_info_for_1): Add and handle
handle_param parameter.
(create_variable_info_for): Call create_variable_info_for_1 with extra
arg.
(intra_create_variable_infos): Same. Handle case that
lookup_restrict_pointed_var (p) is not NULL.
---
gcc/tree-ssa-structalias.c | 53 ++++++++++++++++++++++++++++------------------
1 file changed, 32 insertions(+), 21 deletions(-)
@@ -5642,10 +5642,10 @@ lookup_restrict_pointed_var (varinfo_t vi)
/* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
This will also create any varinfo structures necessary for fields
- of DECL. */
+ of DECL. DECL is a function parameter if HANDLE_PARAM is set. */
static varinfo_t
-create_variable_info_for_1 (tree decl, const char *name)
+create_variable_info_for_1 (tree decl, const char *name, bool handle_param)
{
varinfo_t vi, newvi;
tree decl_type = TREE_TYPE (decl);
@@ -5721,6 +5721,18 @@ create_variable_info_for_1 (tree decl, const char *name)
if (POINTER_TYPE_P (TREE_TYPE (decl))
&& TYPE_RESTRICT (TREE_TYPE (decl)))
vi->only_restrict_pointers = 1;
+ if (vi->only_restrict_pointers
+ && !type_contains_placeholder_p (TREE_TYPE (TREE_TYPE (decl)))
+ && handle_param)
+ {
+ varinfo_t rvi;
+ tree heapvar = build_fake_var_decl (TREE_TYPE (decl_type));
+ DECL_EXTERNAL (heapvar) = 1;
+ rvi = create_variable_info_for_1 (heapvar, "PARM_NOALIAS", false);
+ rvi->is_restrict_var = 1;
+ insert_vi_for_tree (heapvar, rvi);
+ insert_restrict_pointed_var (vi, rvi);
+ }
fieldstack.release ();
return vi;
}
@@ -5772,7 +5784,7 @@ create_variable_info_for_1 (tree decl, const char *name)
static unsigned int
create_variable_info_for (tree decl, const char *name)
{
- varinfo_t vi = create_variable_info_for_1 (decl, name);
+ varinfo_t vi = create_variable_info_for_1 (decl, name, false);
unsigned int id = vi->id;
insert_vi_for_tree (decl, vi);
@@ -5925,31 +5937,30 @@ intra_create_variable_infos (struct function *fn)
{
bool restrict_pointer_p = (POINTER_TYPE_P (TREE_TYPE (t))
&& TYPE_RESTRICT (TREE_TYPE (t)));
- bool recursive_restrict_p
- = (restrict_pointer_p
- && !type_contains_placeholder_p (TREE_TYPE (TREE_TYPE (t))));
varinfo_t p = lookup_vi_for_tree (t);
if (p == NULL)
{
- p = create_variable_info_for_1 (t, alias_get_name (t));
+ p = create_variable_info_for_1 (t, alias_get_name (t), true);
insert_vi_for_tree (t, p);
}
else if (restrict_pointer_p)
- p->only_restrict_pointers = 1;
-
- /* For restrict qualified pointers build a representative for
- the pointed-to object. Note that this ends up handling
- out-of-bound references conservatively by aggregating them
- in the first/last subfield of the object. */
- if (recursive_restrict_p)
{
- varinfo_t vi;
- tree heapvar = build_fake_var_decl (TREE_TYPE (TREE_TYPE (t)));
- DECL_EXTERNAL (heapvar) = 1;
- vi = create_variable_info_for_1 (heapvar, "PARM_NOALIAS");
- vi->is_restrict_var = 1;
- insert_vi_for_tree (heapvar, vi);
- insert_restrict_pointed_var (p, vi);
+ p->only_restrict_pointers = 1;
+
+ /* For restrict qualified pointers build a representative for
+ the pointed-to object. Note that this ends up handling
+ out-of-bound references conservatively by aggregating them
+ in the first/last subfield of the object. */
+ if (!type_contains_placeholder_p (TREE_TYPE (TREE_TYPE (t))))
+ {
+ tree heapvar = build_fake_var_decl (TREE_TYPE (TREE_TYPE (t)));
+ DECL_EXTERNAL (heapvar) = 1;
+ varinfo_t vi
+ = create_variable_info_for_1 (heapvar, "PARM_NOALIAS", false);
+ vi->is_restrict_var = 1;
+ insert_vi_for_tree (heapvar, vi);
+ insert_restrict_pointed_var (p, vi);
+ }
}
make_param_constraints (p, true);
--
1.9.1