diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-18 09:04:54 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-18 09:04:54 +0000 |
commit | 6fc569059b7a519c78eb12d7fa32cf4eec3bc436 (patch) | |
tree | ad64e7e5ce1fd4cc1b53fc1e3855b9d08b561592 /gcc/tree-ssa-structalias.c | |
parent | 4c3030b9f7724b3d623a0dae095116a524c5441f (diff) | |
download | gcc-6fc569059b7a519c78eb12d7fa32cf4eec3bc436.tar.gz |
2011-10-18 Richard Guenther <rguenther@suse.de>
* tree-ssa-alias.h (struct pt_solution): Remove
vars_contains_restrict member.
(pt_solutions_same_restrict_base): Remove.
(pt_solution_set): Adjust.
* tree-ssa-alias.c (ptr_deref_may_alias_decl_p): Remove
vars_contains_restrict handling.
(dump_points_to_solution): Likewise.
(ptr_derefs_may_alias_p): Do not call pt_solutions_same_restrict_base.
* tree-ssa-structalias.c (struct variable_info): Remove is_restrict_var
field.
(new_var_info): Do not initialize it.
(ipa_escaped_pt): Adjust.
(make_constraint_from_restrict): Make the tag global.
(make_constraint_from_global_restrict): New function.
(make_constraint_from_heapvar): Remove.
(create_variable_info_for): Do not make restrict vars point
to NONLOCAL.
(intra_create_variable_infos): Likewise.
(find_what_var_points_to): Remove vars_contains_restrict handling.
(pt_solution_set): Adjust.
(pt_solution_ior_into): Likewise.
(pt_solutions_same_restrict_base): Remove.
(compute_points_to_sets): Do not test is_restrict_var.
* cfgexpand.c (update_alias_info_with_stack_vars): Adjust.
* gimple-pretty-print.c (pp_points_to_solution): Likewise.
* gcc.dg/torture/restrict-1.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180127 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r-- | gcc/tree-ssa-structalias.c | 99 |
1 files changed, 37 insertions, 62 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 7de22aabcb3..51f2aa1bf7c 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -261,9 +261,6 @@ struct variable_info /* True if this is a heap variable. */ unsigned int is_heap_var : 1; - /* True if this is a variable tracking a restrict pointer source. */ - unsigned int is_restrict_var : 1; - /* True if this field may contain pointers. */ unsigned int may_have_pointers : 1; @@ -350,7 +347,6 @@ new_var_info (tree t, const char *name) ret->is_unknown_size_var = false; ret->is_full_var = (t == NULL_TREE); ret->is_heap_var = false; - ret->is_restrict_var = false; ret->may_have_pointers = true; ret->only_restrict_pointers = false; ret->is_global_var = (t == NULL_TREE); @@ -3643,30 +3639,30 @@ make_heapvar (const char *name) } /* Create a new artificial heap variable with NAME and make a - constraint from it to LHS. Return the created variable. */ + constraint from it to LHS. Set flags according to a tag used + for tracking restrict pointers. */ static varinfo_t -make_constraint_from_heapvar (varinfo_t lhs, const char *name) +make_constraint_from_restrict (varinfo_t lhs, const char *name) { varinfo_t vi = make_heapvar (name); + vi->is_global_var = 1; + vi->may_have_pointers = 1; make_constraint_from (lhs, vi->id); - return vi; } /* Create a new artificial heap variable with NAME and make a constraint from it to LHS. Set flags according to a tag used - for tracking restrict pointers. */ + for tracking restrict pointers and make the artificial heap + point to global memory. */ -static void -make_constraint_from_restrict (varinfo_t lhs, const char *name) +static varinfo_t +make_constraint_from_global_restrict (varinfo_t lhs, const char *name) { - varinfo_t vi; - vi = make_constraint_from_heapvar (lhs, name); - vi->is_restrict_var = 1; - vi->is_global_var = 0; - vi->is_special_var = 1; - vi->may_have_pointers = 0; + varinfo_t vi = make_constraint_from_restrict (lhs, name); + make_copy_constraint (vi, nonlocal_id); + return vi; } /* In IPA mode there are varinfos for different aspects of reach @@ -5504,13 +5500,18 @@ create_variable_info_for (tree decl, const char *name) if ((POINTER_TYPE_P (TREE_TYPE (decl)) && TYPE_RESTRICT (TREE_TYPE (decl))) || vi->only_restrict_pointers) - make_constraint_from_restrict (vi, "GLOBAL_RESTRICT"); + { + make_constraint_from_global_restrict (vi, "GLOBAL_RESTRICT"); + continue; + } /* In non-IPA mode the initializer from nonlocal is all we need. */ if (!in_ipa_mode || DECL_HARD_REGISTER (decl)) make_copy_constraint (vi, nonlocal_id); + /* In IPA mode parse the initializer and generate proper constraints + for it. */ else { struct varpool_node *vnode = varpool_get_node (decl); @@ -5595,7 +5596,7 @@ intra_create_variable_infos (void) passed-by-reference argument. */ for (t = DECL_ARGUMENTS (current_function_decl); t; t = DECL_CHAIN (t)) { - varinfo_t p; + varinfo_t p = get_vi_for_tree (t); /* For restrict qualified pointers to objects passed by reference build a real representative for the pointed-to object. @@ -5610,34 +5611,37 @@ intra_create_variable_infos (void) DECL_EXTERNAL (heapvar) = 1; vi = create_variable_info_for_1 (heapvar, "PARM_NOALIAS"); insert_vi_for_tree (heapvar, vi); - lhsc.var = get_vi_for_tree (t)->id; + lhsc.var = p->id; lhsc.type = SCALAR; lhsc.offset = 0; rhsc.var = vi->id; rhsc.type = ADDRESSOF; rhsc.offset = 0; process_constraint (new_constraint (lhsc, rhsc)); - vi->is_restrict_var = 1; for (; vi; vi = vi->next) if (vi->may_have_pointers) { if (vi->only_restrict_pointers) - make_constraint_from_restrict (vi, "GLOBAL_RESTRICT"); - make_copy_constraint (vi, nonlocal_id); + make_constraint_from_global_restrict (vi, "GLOBAL_RESTRICT"); + else + make_copy_constraint (vi, nonlocal_id); } continue; } - for (p = get_vi_for_tree (t); p; p = p->next) - { - if (p->may_have_pointers) - make_constraint_from (p, nonlocal_id); - if (p->only_restrict_pointers) - make_constraint_from_restrict (p, "PARM_RESTRICT"); - } if (POINTER_TYPE_P (TREE_TYPE (t)) && TYPE_RESTRICT (TREE_TYPE (t))) - make_constraint_from_restrict (get_vi_for_tree (t), "PARM_RESTRICT"); + make_constraint_from_global_restrict (p, "PARM_RESTRICT"); + else + { + for (; p; p = p->next) + { + if (p->only_restrict_pointers) + make_constraint_from_global_restrict (p, "PARM_RESTRICT"); + else if (p->may_have_pointers) + make_constraint_from (p, nonlocal_id); + } + } } /* Add a constraint for a result decl that is passed by reference. */ @@ -5813,15 +5817,11 @@ find_what_var_points_to (varinfo_t orig_vi, struct pt_solution *pt) || vi->id == integer_id) pt->anything = 1; } - if (vi->is_restrict_var) - pt->vars_contains_restrict = true; } /* Instead of doing extra work, simply do not create elaborate points-to information for pt_anything pointers. */ - if (pt->anything - && (orig_vi->is_artificial_var - || !pt->vars_contains_restrict)) + if (pt->anything) return; /* Share the final set of variables when possible. */ @@ -5912,13 +5912,11 @@ pt_solution_reset (struct pt_solution *pt) it contains restrict tag variables. */ void -pt_solution_set (struct pt_solution *pt, bitmap vars, - bool vars_contains_global, bool vars_contains_restrict) +pt_solution_set (struct pt_solution *pt, bitmap vars, bool vars_contains_global) { memset (pt, 0, sizeof (struct pt_solution)); pt->vars = vars; pt->vars_contains_global = vars_contains_global; - pt->vars_contains_restrict = vars_contains_restrict; } /* Set the points-to solution *PT to point only to the variable VAR. */ @@ -5953,7 +5951,6 @@ pt_solution_ior_into (struct pt_solution *dest, struct pt_solution *src) dest->ipa_escaped |= src->ipa_escaped; dest->null |= src->null; dest->vars_contains_global |= src->vars_contains_global; - dest->vars_contains_restrict |= src->vars_contains_restrict; if (!src->vars) return; @@ -6141,27 +6138,6 @@ pt_solutions_intersect (struct pt_solution *pt1, struct pt_solution *pt2) return res; } -/* Return true if both points-to solutions PT1 and PT2 for two restrict - qualified pointers are possibly based on the same pointer. */ - -bool -pt_solutions_same_restrict_base (struct pt_solution *pt1, - struct pt_solution *pt2) -{ - /* If we deal with points-to solutions of two restrict qualified - pointers solely rely on the pointed-to variable bitmap intersection. - For two pointers that are based on each other the bitmaps will - intersect. */ - if (pt1->vars_contains_restrict - && pt2->vars_contains_restrict) - { - gcc_assert (pt1->vars && pt2->vars); - return bitmap_intersect_p (pt1->vars, pt2->vars); - } - - return true; -} - /* Dump points-to information to OUTFILE. */ @@ -6574,7 +6550,6 @@ compute_points_to_sets (void) /* Mark escaped HEAP variables as global. */ FOR_EACH_VEC_ELT (varinfo_t, varmap, i, vi) if (vi->is_heap_var - && !vi->is_restrict_var && !vi->is_global_var) DECL_EXTERNAL (vi->decl) = vi->is_global_var = pt_solution_includes (&cfun->gimple_df->escaped, vi->decl); @@ -6794,7 +6769,7 @@ gate_ipa_pta (void) /* IPA PTA solutions for ESCAPED. */ struct pt_solution ipa_escaped_pt - = { true, false, false, false, false, false, false, NULL }; + = { true, false, false, false, false, false, NULL }; /* Associate node with varinfo DATA. Worker for cgraph_for_node_and_aliases. */ |