diff options
-rw-r--r-- | gcc/ChangeLog | 28 | ||||
-rw-r--r-- | gcc/cfgexpand.c | 2 | ||||
-rw-r--r-- | gcc/gimple-pretty-print.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/restrict-1.c | 16 | ||||
-rw-r--r-- | gcc/tree-ssa-alias.c | 14 | ||||
-rw-r--r-- | gcc/tree-ssa-alias.h | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 99 |
8 files changed, 87 insertions, 84 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ef215e..6b32e27 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,31 @@ +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. + 2011-10-18 Tom de Vries <tom@codesourcery.com> PR tree-optimization/50672 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 4089b40..ddf3fd1 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -530,7 +530,7 @@ update_alias_info_with_stack_vars (void) /* Make the SSA name point to all partition members. */ pi = get_ptr_info (name); - pt_solution_set (&pi->pt, part, false, false); + pt_solution_set (&pi->pt, part, false); } /* Make all points-to sets that contain one member of a partition diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c index 577d28b..8120158 100644 --- a/gcc/gimple-pretty-print.c +++ b/gcc/gimple-pretty-print.c @@ -610,8 +610,6 @@ pp_points_to_solution (pretty_printer *buffer, struct pt_solution *pt) pp_character (buffer, '}'); if (pt->vars_contains_global) pp_string (buffer, " (glob)"); - if (pt->vars_contains_restrict) - pp_string (buffer, " (restr)"); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 39efdcc..fb5b8fd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-10-18 Richard Guenther <rguenther@suse.de> + + * gcc.dg/torture/restrict-1.c: New testcase. + 2011-10-17 Michael Spertus <mike_spertus@symantec.com> * g++.dg/ext/bases.C: New test. diff --git a/gcc/testsuite/gcc.dg/torture/restrict-1.c b/gcc/testsuite/gcc.dg/torture/restrict-1.c new file mode 100644 index 0000000..e7af4f5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/restrict-1.c @@ -0,0 +1,16 @@ +/* { dg-do run } */ + +extern void abort (void); +void __attribute__((noinline,noclone)) +foo (int ** __restrict__ p, int ** __restrict__ q) +{ + **p = **q; +} +int main() +{ + int x = 0, y = 1, *i = &x, *j = &y; + foo (&i, &j); + if (x != 1) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 2433afa..57fc734 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -219,13 +219,6 @@ ptr_deref_may_alias_decl_p (tree ptr, tree decl) if (!pi) return true; - /* If the decl can be used as a restrict tag and we have a restrict - pointer and that pointers points-to set doesn't contain this decl - then they can't alias. */ - if (DECL_RESTRICTED_P (decl) - && pi->pt.vars_contains_restrict) - return bitmap_bit_p (pi->pt.vars, DECL_PT_UID (decl)); - return pt_solution_includes (&pi->pt, decl); } @@ -316,11 +309,6 @@ ptr_derefs_may_alias_p (tree ptr1, tree ptr2) if (!pi1 || !pi2) return true; - /* If both pointers are restrict-qualified try to disambiguate - with restrict information. */ - if (!pt_solutions_same_restrict_base (&pi1->pt, &pi2->pt)) - return false; - /* ??? This does not use TBAA to prune decls from the intersection that not both pointers may access. */ return pt_solutions_intersect (&pi1->pt, &pi2->pt); @@ -426,8 +414,6 @@ dump_points_to_solution (FILE *file, struct pt_solution *pt) dump_decl_set (file, pt->vars); if (pt->vars_contains_global) fprintf (file, " (includes global vars)"); - if (pt->vars_contains_restrict) - fprintf (file, " (includes restrict tags)"); } } diff --git a/gcc/tree-ssa-alias.h b/gcc/tree-ssa-alias.h index c2ab211..7492123 100644 --- a/gcc/tree-ssa-alias.h +++ b/gcc/tree-ssa-alias.h @@ -54,8 +54,6 @@ struct GTY(()) pt_solution /* Nonzero if the pt_vars bitmap includes a global variable. */ unsigned int vars_contains_global : 1; - /* Nonzero if the pt_vars bitmap includes a restrict tag variable. */ - unsigned int vars_contains_restrict : 1; /* Set of variables that this pointer may point to. */ bitmap vars; @@ -130,10 +128,8 @@ extern bool pt_solution_singleton_p (struct pt_solution *, unsigned *); extern bool pt_solution_includes_global (struct pt_solution *); extern bool pt_solution_includes (struct pt_solution *, const_tree); extern bool pt_solutions_intersect (struct pt_solution *, struct pt_solution *); -extern bool pt_solutions_same_restrict_base (struct pt_solution *, - struct pt_solution *); extern void pt_solution_reset (struct pt_solution *); -extern void pt_solution_set (struct pt_solution *, bitmap, bool, bool); +extern void pt_solution_set (struct pt_solution *, bitmap, bool); extern void pt_solution_set_var (struct pt_solution *, tree); extern void dump_pta_stats (FILE *); diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 7de22aa..51f2aa1 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. */ |