diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2013-07-21 13:44:03 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2013-07-21 13:44:03 +0000 |
commit | 94b150705d06352ec7f38259b2d4a18af4bb7011 (patch) | |
tree | fe1ec330c9c583ea303c069de034b2b9f4ef20ce /gcc/fortran/dependency.c | |
parent | 82a4f54cc5ff37df751528d1a30e9b573d2496ee (diff) | |
download | gcc-94b150705d06352ec7f38259b2d4a18af4bb7011.zip gcc-94b150705d06352ec7f38259b2d4a18af4bb7011.tar.gz gcc-94b150705d06352ec7f38259b2d4a18af4bb7011.tar.bz2 |
re PR fortran/56937 (Unnecessarily temporary with array-vector assignments)
2013-07-21 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/56937
* dependency.c (gfc_dep_resolver): Treat identical
array subscripts as identical; don't unconditionally
return a dependency if an array subscript is found.
2013-07-21 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/56937
* gfortran.dg/dependency_42.f90: New test.
* gfortran.dg/dependency_43.f90: New test.
From-SVN: r201094
Diffstat (limited to 'gcc/fortran/dependency.c')
-rw-r--r-- | gcc/fortran/dependency.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index fcdc1e5..350c7bd 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -2095,11 +2095,23 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) for (n=0; n < lref->u.ar.dimen; n++) { - /* Assume dependency when either of array reference is vector - subscript. */ + /* Handle dependency when either of array reference is vector + subscript. There is no dependency if the vector indices + are equal or if indices are known to be different in a + different dimension. */ if (lref->u.ar.dimen_type[n] == DIMEN_VECTOR || rref->u.ar.dimen_type[n] == DIMEN_VECTOR) - return 1; + { + if (lref->u.ar.dimen_type[n] == DIMEN_VECTOR + && rref->u.ar.dimen_type[n] == DIMEN_VECTOR + && gfc_dep_compare_expr (lref->u.ar.start[n], + rref->u.ar.start[n]) == 0) + this_dep = GFC_DEP_EQUAL; + else + this_dep = GFC_DEP_OVERLAP; + + goto update_fin_dep; + } if (lref->u.ar.dimen_type[n] == DIMEN_RANGE && rref->u.ar.dimen_type[n] == DIMEN_RANGE) @@ -2164,6 +2176,8 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) /* Overlap codes are in order of priority. We only need to know the worst one.*/ + + update_fin_dep: if (this_dep > fin_dep) fin_dep = this_dep; } |