[PATCH] Limit VDEF walking in IPA-SRA when looking for potential modifications
Martin Jambor
mjambor@suse.cz
Wed Nov 4 16:19:00 GMT 2009
Hi,
On Tue, Nov 03, 2009 at 11:03:01AM +0100, Richard Guenther wrote:
> On Mon, 2 Nov 2009, Martin Jambor wrote:
>
> > Hi,
> >
> > the patch below limits walking of VDEFs when searching for potential
> > modifications of what a parameter points to by providing a common
> > bitmap to various invocations of walk_aliased_vdefs which look for
> > alias vdefs of the same thing...
>
> I wonder if it is correct.
It is not. Unfortunately I suffer a weird form of blindness whenever
I look at this function and see what I want to see rather than what is
actually there. The function, as it is now, is bogus, albeit in a
conservative way and so does not cause trouble.
I intended to loop over accesses of a group and analyze them for
potential modifications together, instead the loop is now over all
accesses of the same base. In order to change this, I have built a
linked list of group members, overloading the next_sibling access
field which is not used in IPA-SRA. I also moved ao_ref_init outside
the inner loop.
I have successfully bootstrapped and tested a very similiar patch, I
am bootstrapping and testing this exact version now. OK if it passes?
Thanks,
Martin
2009-11-04 Martin Jambor <mjambor@suse.cz>
* 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.
Index: mine/gcc/tree-sra.c
===================================================================
*** mine.orig/gcc/tree-sra.c
--- mine/gcc/tree-sra.c
*************** struct access
*** 144,150 ****
points to the first one. */
struct access *first_child;
! /* Pointer to the next sibling in the access tree as described above. */
struct access *next_sibling;
/* Pointers to the first and last element in the linked list of assign
--- 144,152 ----
points to the first one. */
struct access *first_child;
! /* 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
*************** analyze_modified_params (VEC (access_p,
*** 2824,2856 ****
repr;
repr = repr->next_grp)
{
! VEC (access_p, heap) *access_vec;
! int j, access_count;
! tree parm;
if (no_accesses_p (repr))
continue;
! parm = repr->base;
! if (!POINTER_TYPE_P (TREE_TYPE (parm))
|| 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++)
{
- 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);
if (repr->grp_maybe_modified)
break;
}
}
}
}
--- 2826,2853 ----
repr;
repr = repr->next_grp)
{
! struct access *access;
! bitmap visited;
! ao_ref ar;
if (no_accesses_p (repr))
continue;
! if (!POINTER_TYPE_P (TREE_TYPE (repr->base))
|| repr->grp_maybe_modified)
continue;
! ao_ref_init (&ar, repr->expr);
! visited = BITMAP_ALLOC (NULL);
! for (access = repr; access; access = access->next_sibling)
{
/* All accesses are read ones, otherwise grp_maybe_modified would
be trivially set. */
walk_aliased_vdefs (&ar, gimple_vuse (access->stmt),
! mark_maybe_modified, repr, &visited);
if (repr->grp_maybe_modified)
break;
}
+ BITMAP_FREE (visited);
}
}
}
*************** static struct access *
*** 3019,3042 ****
unmodified_by_ref_scalar_representative (tree parm)
{
int i, access_count;
! struct access *access;
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);
! for (i = 0; i < access_count; i++)
{
! access = VEC_index (access_p, access_vec, i);
if (access->write)
return NULL;
}
! access = VEC_index (access_p, access_vec, 0);
! access->grp_read = 1;
! access->grp_scalar_ptr = 1;
! return access;
}
/* Sort collected accesses for parameter PARM, identify representatives for
--- 3016,3045 ----
unmodified_by_ref_scalar_representative (tree parm)
{
int i, access_count;
! struct access *repr;
VEC (access_p, heap) *access_vec;
access_vec = get_base_access_vector (parm);
gcc_assert (access_vec);
! repr = VEC_index (access_p, access_vec, 0);
! if (repr->write)
! return NULL;
! repr->group_representative = repr;
! access_count = VEC_length (access_p, access_vec);
! for (i = 1; i < access_count; 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;
}
! repr->grp_read = 1;
! repr->grp_scalar_ptr = 1;
! return repr;
}
/* Sort collected accesses for parameter PARM, identify representatives for
*************** splice_param_accesses (tree parm, bool *
*** 3091,3096 ****
--- 3094,3102 ----
return NULL;
modification |= ac2->write;
+ ac2->group_representative = access;
+ ac2->next_sibling = access->next_sibling;
+ access->next_sibling = ac2;
j++;
}
More information about the Gcc-patches
mailing list