------- Comment #23 from rakdver at kam dot mff dot cuni dot cz 2010-07-07 10:51 ------- Subject: Re: [4.6 regression] RTL loop unrolling causes FAIL: gcc.dg/pr39794.c
> > > > > > > Consider this simplified example: > > > > > > > > > > > > > > for (i ...) > > > > > > > { > > > > > > > /*A*/ t = a[i]; > > > > > > > /*B*/ a[i+1] = t; > > > > > > > } > > > > > > > MEM_ATTRS would indicate that memory references in A and B do not > > > > > > > alias. > > > > > > > > > > > > but this is clearly wrong, since B in iteration X aliases with A in > > > > > > iteration > > > > > > X+1. > > > > > > So, not a problem in unroller. > > > > > > > > > > It is not wrong. You have the two identical pointers p = &a[i] and > > > > > q = p + 1. *p and *q do not alias. Never. > > > > > > > > Well, then you have some other definition of aliasing than me. For me, > > > > two > > > > memory references M1 and M2 do not alias, if on every code path, the > > > > locations > > > > accessed by M1 and M2 are different. With this definition, *p and *q > > > > may > > > > alias, > > > > as the example above shows. What is your definition? > > > > > > > > > > My definition is that the two statements in sequence A, B have a > > > true dependence if stmt B accesses memory written to by A. > > > Thus, in this context *p and *q do not "alias" (and this is what > > > the scheduler and every other optimization pass queries). > > > > what do you mean by "statements in sequence"? > > statement B executes after A. which means what? In the example above, due to the loop, you cannot say which statement executes after which. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44838