From: Thomas Koenig Date: Sat, 14 Apr 2018 13:38:41 +0000 (+0000) Subject: re PR fortran/85387 (incorrect output with optimization /= 0) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=acd1559a0e07edca7e130e5fbc2d230ac8ba841c;p=gcc.git re PR fortran/85387 (incorrect output with optimization /= 0) 2018-04-14 Thomas Koenig 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 PR fortran/85387 * gfortran.dg/implied_do_io_5.f90: New test. From-SVN: r259384 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3064ab6e921..c6ec69e86c0 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-04-14 Thomas Koenig + + 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 PR fortran/83064 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 6888224cd81..40e88b1a7d4 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 13bb25b5b2a..4c9fdf7bac7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-04-14 Thomas Koenig + + PR fortran/85387 + * gfortran.dg/implied_do_io_5.f90: New test. + 2018-04-13 Paul A. Clarke 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 00000000000..988d0040e91 --- /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