On Fri, 28 Oct 2011, Jakub Jelinek wrote:
> On Fri, Oct 28, 2011 at 02:01:36PM +0400, Kirill Yukhin wrote:
> > this looks really cool. I have a liitle question, since I do not
> > understand vectorizer as good.
> >
> > Say, we have a snippet:
> > int *p;
> > int idx[N];
> > int arr[M];
> > for (...)
> > {
> > p[i%4] += arr[idx[I]];
> > }
> > As far as I understand, we cannot do gather we, since p may point to
> > somewere in arr,
> > and, idx may took it twice.
> > E.g. lets take
> > idx = {0, 1, 1, 2, 3, 4, 5, 6}
> > arr = {0, 1, 0, 0, 0, 0, 0, 0}
> > p = arr;
> > Correct case will have, we'll have something like arr = {0, 2, 2, 0,...}
> > If we'll have gather, arr may look like arr = {0,
> > 2, 1, 0, ...}
> >
> > So my question, does your patch catch such a cases?
>
> Yes, it does. It should be caught by the vect_analyze_data_refs
> part after vect_check_gather succeeds, which updates all the data
> dependence relations with the new dr, and if the other dr in the
> dependence relation has DR_IS_WRITE, then if dr_may_alias_p
> in initialize_data_dependent_relation didn't say that those two
> aren't known not to alias, we set bad and give up on vectorizing
> the loop. I'm doing it there, because the vectorizer would otherwise
> attempt later on to version for aliasing, but for gather it is not possible
> (or sometimes is at least much more difficult) to add such a runtime
> check. For the above it will not say chrec_known and thus we give up.
>
> A very unfortunate thing is that dr_may_alias_p doesn't use TBAA
> if one dr is a write and the other is a read, I think that is because
> of placement new. It would be nice if we could use TBAA, at least
It is also because of re-use of memory via memcpy (yes, some dubious
TBAA case from C, but essentially we don't want to break that). Thus
we can't use TBAA on anonymous memory.
Consider a loop like (gimple IL, thus gimple memory model TBAA):
for (i=0;i<256;++i)
{
tem = intptr[i];
floatptr[i] = (float)tem;
}
with intptr == floatptr. In C you'd have to use a memcpy but
I think we'd just fold that to an assignment.
Richard.