http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36842
--- Comment #6 from rguenther at suse dot de <rguenther at suse dot de> 2011-09-07 14:32:55 UTC --- On Wed, 7 Sep 2011, burnus at gcc dot gnu.org wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36842 > > --- Comment #5 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-09-07 > 14:30:11 UTC --- > (In reply to comment #4) > > I think the report asks for performing loop versioning in the frontend [...] > > where of course the tricky part is creating the appropriate condition > > and deciding if it is worthwhile doing the versioning. > > > (In reply to comment #4) > > if (Rx and Ry may overlap) > > That would be something like: > > Rx_min = Rx > Rx_max = &Rx[((rx.dim[0].stride >= 0 && rx.dim[0].ubound >= rx.dim[0].lbound > || rx.dim[0].stride < 0) || rx.dim[0].stride < 0 && rx.dim[0].lbound == 1 ? > (integer(kind=8)) (integer(kind=4)) rx.dim[0].ubound : 0) * stride.1 + > offset.2] > > Something similar for Ry - but a bit more complicated as it has two dimensions > - and then: > if (Rx_min <= Ry_max && Rx_max >= Ry_min) > /* They are overlapping. */ > > For the LHS one already needs to calculate the extend for the memory > allocation > - thus, that extend one gets for free. The effort for the RHS depends on the > number of variables which possibly alias with the LHS. The costs would be the > additional extend calculations, the additional code and in particular the > branching. > > In terms of the code, it would mean a larger restructuring as currently > gfc_check_dependency only checks for the dependency; for loop versioning one > needs a function which extracts all the possibly aliasing bounds of the RHS > expression. > > The more difficult question is: When should it be applied? Not for -Os, but > otherwise? Conditional on a new frontend flag I suppose, eventually enabled at -O3 by default.