Another array reference dependency improvement
Brooks Moses
bmoses@stanford.edu
Fri Mar 3 22:00:00 GMT 2006
Roger Sayle wrote:
> In gfc_check_element_vs_element we could return GFC_DEP_EQUAL for
> two unordered scalar subscripts (elements). Originally, when
> examining subscripts if we discovered that X and Y were unordered
> in a(X,...) vs. a(Y,...) we'd return GFC_DEP_NODEP (a bug) which was
> treated by the caller like X<Y or X>Y, and incorrectly returned
> "no dependency" without examining the "...". This was fixed
> yesterday by taking the pessimistic assumption that unordered X
> and Y, should return GFC_DEP_OVERLAP. This causes the caller to
> inspect the remaining dimensions such that if it finds a later
> NODEP, there's no dependency as in a(X,0,:) = a(Y,1,:) where
> the 0 != 1 guarantees independence. The tweak below is to
> optimistically/safely return GFC_DEP_EQUAL, which again forces
> the examination of "...", but allows us to notice independence
> at the end. i.e. elements that return GFC_DEP_EQUAL are effectively
> ignored in the dependency analysis.
>
> Fortunately, there's a whole paper on this, if the above explanation
> wasn't too confusing. dependency.c actually does slightly better
> (or will shortly be slightly better) than the analysis described in
> that paper, which was used in SUN's and Cray's F90 compilers.
It seems to me that a simple way of explaining this would be that, if
the indices are scalar and their relationship is unknown, there are two
possibilities -- GFC_DEP_NODEP and GFC_DEP_EQUAL. GFC_DEP_OVERLAP is
not possible, and GFC_DEP_EQUAL is the most pessimistic of the two that
are possible, so it is what should be returned.
(It also seems to me that the "This used to be GFC_DEP_OVERLAP"
statement in the comment is likely to be more confusing than useful in
the long run.)
- Brooks
More information about the Gcc-patches
mailing list