aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2018-04-14 13:38:41 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2018-04-14 13:38:41 +0000
commitacd1559a0e07edca7e130e5fbc2d230ac8ba841c (patch)
treeb09d0087989a89f838fae83355f4777bdf39ea57 /gcc
parent4be91498e272b823f627097cdcb10c7f893e2942 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/frontend-passes.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/implied_do_io_5.f9015
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