[fortran] Fix PR 85387

Message ID 7b66107b-4f8f-a361-7f88-915b147e2d4f@tkoenig.net
State New
Headers show
Series
  • [fortran] Fix PR 85387
Related show

Commit Message

Thomas König April 14, 2018, 11:35 a.m.
Hello world,

the attached patch fixes the PR, an 8 regression caused by
trying to convert a nested implied DO loop to an array
for a case where this was not possible.

Regression-tested. OK for trunk?

Regards

	Thomas

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.

Comments

Andre Vehreschild April 14, 2018, 1:22 p.m. | #1
Hi Thomas,

this looks good. Ok for trunk. Thanks for the patch.

- Andre

On Sat, 14 Apr 2018 13:35:37 +0200
Thomas König <tk@tkoenig.net> wrote:

> Hello world,
> 
> the attached patch fixes the PR, an 8 regression caused by
> trying to convert a nested implied DO loop to an array
> for a case where this was not possible.
> 
> Regression-tested. OK for trunk?
> 
> Regards
> 
> 	Thomas
> 
> 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.
Thomas König April 14, 2018, 2:01 p.m. | #2
Hi Andre,

> this looks good. Ok for trunk. Thanks for the patch.

Committed as r259384. Thanks for the quick review!

Looking at the serious regressions from the gcc home page,
we are fast approaching the gcc 8 release. Serious regressions
are below 100, and there are currently only

So, if anybody has any bugs that should urgently be fixed
for the release, please go ahead :-)

Regards

	Thomas

Patch

Index: frontend-passes.c
===================================================================
--- frontend-passes.c	(Revision 259222)
+++ frontend-passes.c	(Arbeitskopie)
@@ -1237,6 +1237,23 @@  traverse_io_block (gfc_code *code, bool *has_reach
 	}
     }
 
+  /* 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;