diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-alias.c | 69 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 3 |
3 files changed, 77 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0244e455aa3..5258b592c47 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-11-23 Daniel Berlin <dberlin@dberlin.org> + + * tree-ssa-alias.c (tree_pointer_compare): New function. + (compact_name_tags): New function. + (group_aliases): Call compact_name_tags. + 2006-11-23 Manuel Lopez-Ibanez <manu@gcc.gnu.org> * real.h (real_isinteger): Declare. diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 275c2449a0d..a12dca28025 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1436,6 +1436,73 @@ group_aliases_into (tree tag, bitmap tag_aliases, struct alias_info *ai) tag_ann->may_aliases = NULL; } +/* Simple comparison function for qsort that sorts based on pointer + address. */ + +static int +tree_pointer_compare (const void *pa, const void *pb) +{ + const tree a = *((const tree *)pa); + const tree b = *((const tree *)pb); + + return b - a; +} + + +/* Replacing may aliases in name tags during grouping can up with the + same SMT multiple times in the may_alias list. It's quicker to + just remove them post-hoc than it is to avoid them during + replacement. Thus, this routine sorts the may-alias list and + removes duplicates. */ + +static void +compact_name_tags (void) +{ + referenced_var_iterator rvi; + tree var; + + FOR_EACH_REFERENCED_VAR (var, rvi) + { + if (TREE_CODE (var) == NAME_MEMORY_TAG) + { + VEC(tree, gc) *aliases, *new_aliases; + tree alias, last_alias; + int i; + + last_alias = NULL; + aliases = var_ann (var)->may_aliases; + new_aliases = NULL; + + if (VEC_length (tree, aliases) > 1) + { + bool changed = false; + qsort (VEC_address (tree, aliases), VEC_length (tree, aliases), + sizeof (tree), tree_pointer_compare); + + for (i = 0; VEC_iterate (tree, aliases, i, alias); i++) + { + if (alias == last_alias) + { + changed = true; + continue; + } + + VEC_safe_push (tree, gc, new_aliases, alias); + last_alias = alias; + } + + /* Only replace the array if something has changed. */ + if (changed) + { + VEC_free (tree, gc, aliases); + var_ann (var)->may_aliases = new_aliases; + } + else + VEC_free (tree, gc, new_aliases); + } + } + } +} /* Group may-aliases sets to reduce the number of virtual operands due to aliasing. @@ -1597,6 +1664,8 @@ group_aliases (struct alias_info *ai) } } + compact_name_tags (); + if (dump_file) fprintf (dump_file, "%s: Total number of aliased vops after grouping: %ld%s\n", diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 828481c5680..4354b443cba 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -121,7 +121,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Direct constraints are ADDRESSOF constraints that require no extra processing, such as P = &Q Copy constraints are those of the form P = Q. - Complex constraints are all the constraints involving dereferences. + Complex constraints are all the constraints involving dereferences + and offsets (including offsetted copies). 3. All direct constraints of the form P = &Q are processed, such that Q is added to Sol(P) |