diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 905978d7bde..dd3fa834e2b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2009-11-05 Martin Jambor + + * tree-sra.c (struct access): Changed comment of next_sibling field. + (analyze_modified_params): Loop over accesses of a group rather than + over all with the ame base, pass a common bitmap to + walk_aliased_vdefs. + (unmodified_by_ref_scalar_representative): Build link lists of + accesses of a group. + (splice_param_accesses): Likewise. + 2009-11-04 Kenneth Zadeck * df-scan.c (df-uses-record): Add case zero_extract of mem. diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 12b19909db9..67001a64564 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -144,7 +144,9 @@ struct access points to the first one. */ struct access *first_child; - /* Pointer to the next sibling in the access tree as described above. */ + /* In intraprocedural SRA, pointer to the next sibling in the access tree as + described above. In IPA-SRA this is a pointer to the next access + belonging to the same group (having the same representative). */ struct access *next_sibling; /* Pointers to the first and last element in the linked list of assign @@ -2824,33 +2826,28 @@ analyze_modified_params (VEC (access_p, heap) *representatives) repr; repr = repr->next_grp) { - VEC (access_p, heap) *access_vec; - int j, access_count; - tree parm; + struct access *access; + bitmap visited; + ao_ref ar; if (no_accesses_p (repr)) continue; - parm = repr->base; - if (!POINTER_TYPE_P (TREE_TYPE (parm)) + if (!POINTER_TYPE_P (TREE_TYPE (repr->base)) || repr->grp_maybe_modified) continue; - access_vec = get_base_access_vector (parm); - access_count = VEC_length (access_p, access_vec); - for (j = 0; j < access_count; j++) + ao_ref_init (&ar, repr->expr); + visited = BITMAP_ALLOC (NULL); + for (access = repr; access; access = access->next_sibling) { - struct access *access; - ao_ref ar; - /* All accesses are read ones, otherwise grp_maybe_modified would be trivially set. */ - access = VEC_index (access_p, access_vec, j); - ao_ref_init (&ar, access->expr); walk_aliased_vdefs (&ar, gimple_vuse (access->stmt), - mark_maybe_modified, repr, NULL); + mark_maybe_modified, repr, &visited); if (repr->grp_maybe_modified) break; } + BITMAP_FREE (visited); } } } @@ -3019,24 +3016,30 @@ static struct access * unmodified_by_ref_scalar_representative (tree parm) { int i, access_count; - struct access *access; + struct access *repr; VEC (access_p, heap) *access_vec; access_vec = get_base_access_vector (parm); gcc_assert (access_vec); - access_count = VEC_length (access_p, access_vec); + repr = VEC_index (access_p, access_vec, 0); + if (repr->write) + return NULL; + repr->group_representative = repr; - for (i = 0; i < access_count; i++) + access_count = VEC_length (access_p, access_vec); + for (i = 1; i < access_count; i++) { - access = VEC_index (access_p, access_vec, i); + struct access *access = VEC_index (access_p, access_vec, i); if (access->write) return NULL; + access->group_representative = repr; + access->next_sibling = repr->next_sibling; + repr->next_sibling = access; } - access = VEC_index (access_p, access_vec, 0); - access->grp_read = 1; - access->grp_scalar_ptr = 1; - return access; + repr->grp_read = 1; + repr->grp_scalar_ptr = 1; + return repr; } /* Sort collected accesses for parameter PARM, identify representatives for @@ -3091,6 +3094,9 @@ splice_param_accesses (tree parm, bool *ro_grp) return NULL; modification |= ac2->write; + ac2->group_representative = access; + ac2->next_sibling = access->next_sibling; + access->next_sibling = ac2; j++; }