diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2018-04-14 13:38:41 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2018-04-14 13:38:41 +0000 |
commit | acd1559a0e07edca7e130e5fbc2d230ac8ba841c (patch) | |
tree | b09d0087989a89f838fae83355f4777bdf39ea57 /gcc | |
parent | 4be91498e272b823f627097cdcb10c7f893e2942 (diff) | |
download | gcc-acd1559a0e07edca7e130e5fbc2d230ac8ba841c.zip gcc-acd1559a0e07edca7e130e5fbc2d230ac8ba841c.tar.gz gcc-acd1559a0e07edca7e130e5fbc2d230ac8ba841c.tar.bz2 |
re PR fortran/85387 (incorrect output with optimization /= 0)
2018-04-14 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/85387
* frontend-passes.c (traverse_io_block): Check for start, end or
stride being defined by an outer implied DO loop.
2018-04-14 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/85387
* gfortran.dg/implied_do_io_5.f90: New test.
From-SVN: r259384
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/frontend-passes.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/implied_do_io_5.f90 | 15 |
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3064ab6..c6ec69e 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-04-14 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/85387 + * frontend-passes.c (traverse_io_block): Check for start, end or + stride being defined by an outer implied DO loop. + 2018-04-12 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/83064 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 6888224..40e88b1 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -1237,6 +1237,23 @@ traverse_io_block (gfc_code *code, bool *has_reached, gfc_code *prev) } } + /* Check for cases like ((a(i, j), i=1, j), j=1, 2). */ + for (int i = 1; i < ref->u.ar.dimen; i++) + { + if (iters[i]) + { + gfc_expr *var = iters[i]->var; + for (int j = i - 1; j < i; j++) + { + if (iters[j] + && (gfc_check_dependency (var, iters[j]->start, true) + || gfc_check_dependency (var, iters[j]->end, true) + || gfc_check_dependency (var, iters[j]->step, true))) + return false; + } + } + } + /* Create new expr. */ new_e = gfc_copy_expr (curr->expr1); new_e->expr_type = EXPR_VARIABLE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 13bb25b..4c9fdf7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-04-14 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/85387 + * gfortran.dg/implied_do_io_5.f90: New test. + 2018-04-13 Paul A. Clarke <pc@us.ibm.com> PR target/83402 diff --git a/gcc/testsuite/gfortran.dg/implied_do_io_5.f90 b/gcc/testsuite/gfortran.dg/implied_do_io_5.f90 new file mode 100644 index 0000000..988d004 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/implied_do_io_5.f90 @@ -0,0 +1,15 @@ +! { dg-do run } +! { dg-additional-options "-ffrontend-optimize" } +! PR fortran/85387 - incorrect output +! Original test case by Vittorio Zecca +program main + real :: efg_pw(2,2) + character (len=80) :: c1, c2 + efg_pw(1,1)=1 + efg_pw(2,1)=2 + efg_pw(1,2)=3 + efg_pw(2,2)=4 + write (unit=c1,fmt='(3F12.5)') ((efg_pw(i, j), i=1, j), j=1, 2) + write (unit=c2,fmt='(3F12.5)') 1.0, 3.0, 4.0 + if (c1 /= c2) stop 1 +end |