On 27/10/15 13:24, Tom de Vries wrote: it over a bit more, I realized the constraint handling started
to be messy. I've reworked the patch series to simplify that first.1 Simplify constraint handling 2 Rename make_restrict_var_constraints to make_param_constraints 3 Add recursion to make_param_constraints 4 Add handle_param parameter to create_variable_info_for_1 5 Handle recursive restrict pointer in create_variable_info_for_1 6 Handle restrict struct fields recursively Currently doing bootstrap and regtest on x86_64. I'll repost the patch series in reply to this message.
A repost of the patch at https://gcc.gnu.org/ml/gcc-patches/2015-10/msg02776.html .
I've changed the structure a bit such that it's clear that the remaining 'build_fake_var_decl' bit is in 'the lookup_vi_for_tree (t) != NULL' branch.
Thanks, - Tom
Add handle_param parameter to create_variable_info_for_1 2015-10-26 Tom de Vries <[email protected]> * 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(-) diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 93bc325..a639944 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -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
