diff mbox series

Fix PR72715 "ICE in gfc_trans_omp_do, at fortran/trans-openmp.c:3164"

Message ID yxfpzhqya31j.fsf@hertz.schwinge.homeip.net
State New
Headers show
Series Fix PR72715 "ICE in gfc_trans_omp_do, at fortran/trans-openmp.c:3164" | expand

Commit Message

Thomas Schwinge Feb. 14, 2019, 1:54 p.m. UTC
Hi!

PR72715 "ICE in gfc_trans_omp_do, at fortran/trans-openmp.c:3164" is the
OpenACC variant of the OpenMP PR60127 "ICE with OpenMP and DO CONCURRENT"
(trunk r210331) changes.

On Mon, 29 Aug 2016 14:33:07 -0700, Cesar Philippidis <cesar@codesourcery.com> wrote:
> It looks like the fortran FE has some preliminary support for do
> concurrent loops, however it was not well tested, nor is do concurrent
> supported by the OpenACC spec.

(Tobias Burnus has written up in some further PRs and emails what the
issues are.)

> This patch teaches the fortran FE to
> error when an acc loop directive is applied to a do concurrent loop.
> 
> The reason why the existing do concurrent wasn't detected earlier is
> because the only tests that utilized do concurrent loops contained other
> expected failures, therefore the FE never successfully left the resolver
> stage. And this ICE occurred as the loop was being translated into gimple.
> 
> There's one other questionably use of EXEC_DO_CONCURRENT that involves
> the OpenACC cache directive. I've decided to leave gfc_exec_oacc_cache
> alone for the time being because the OpenACC spec does not explicitly
> define what it means by 'loop'. Then again, the user isn't required to
> explicitly mark acc loops inside acc kernels regions, so perhaps it
> would be better to leave the end user with more flexibility. On the
> other hand, it's debatable whether do concurrent loops should even be
> permitted inside acc offloaded regions.
> 
> I've applied this patch to gomp-4_0-branch. Is this OK for trunk, gcc-6
> and gcc-5?

Thanks.  As attached committed to trunk in r268875, and will backport to
release branches later.


Grüße
 Thomas
diff mbox series

Patch

From dac1fbf62c5293c4b6b2788a6d9677c73088df5d Mon Sep 17 00:00:00 2001
From: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 14 Feb 2019 13:44:19 +0000
Subject: [PATCH] Fix PR72715 "ICE in gfc_trans_omp_do, at
 fortran/trans-openmp.c:3164"

The OpenACC 'resolve_oacc_nested_loops' function duplicates most code of the
OpenMP 'resolve_omp_do', but didn't include the PR60127 "ICE with OpenMP and DO
CONCURRENT" (trunk r210331) changes.  (Probably the two functions should be
unified?)

The Fortran DO CONCURRENT construct is a way to tell the compiler that loop
iterations don't have any interdependencies -- which is information that would
very well be suitable for OpenACC/OpenMP loops.  There are some "details"
however, see the discussion/references in PR60127, so for the time being, make
this a compile-time error instead of an ICE.

	gcc/fortran/
	* openmp.c (resolve_oacc_nested_loops): Error on do concurrent
	loops.

	gcc/testsuite/
	* gfortran.dg/goacc/loop-3-2.f95: Error on do concurrent loops.
	* gfortran.dg/goacc/loop-3.f95: Likewise.
	* gfortran.dg/goacc/pr72715.f90: New test.

Reviewed-by: Thomas Schwinge <thomas@codesourcery.com>

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@268875 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/fortran/ChangeLog                        | 6 ++++++
 gcc/fortran/openmp.c                         | 8 +++++++-
 gcc/testsuite/ChangeLog                      | 7 +++++++
 gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95 | 4 ++--
 gcc/testsuite/gfortran.dg/goacc/loop-3.f95   | 4 ++--
 gcc/testsuite/gfortran.dg/goacc/pr72715.f90  | 6 ++++++
 6 files changed, 30 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/pr72715.f90

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index c573f77410c..71cef4f1884 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@ 
+2019-02-14  Cesar Philippidis  <cesar@codesourcery.com>
+
+	PR fortran/72715
+	* openmp.c (resolve_oacc_nested_loops): Error on do concurrent
+	loops.
+
 2019-02-13  Martin Liska  <mliska@suse.cz>
 
 	PR fortran/88649
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 15c5842dea4..8651afaee4f 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -5760,7 +5760,13 @@  resolve_oacc_nested_loops (gfc_code *code, gfc_code* do_code, int collapse,
 		     "at %L", &do_code->loc);
 	  break;
 	}
-      gcc_assert (do_code->op == EXEC_DO || do_code->op == EXEC_DO_CONCURRENT);
+      if (do_code->op == EXEC_DO_CONCURRENT)
+	{
+	  gfc_error ("!$ACC LOOP cannot be a DO CONCURRENT loop at %L",
+		     &do_code->loc);
+	  break;
+	}
+      gcc_assert (do_code->op == EXEC_DO);
       if (do_code->ext.iterator->var->ts.type != BT_INTEGER)
 	gfc_error ("!$ACC LOOP iteration variable must be of type integer at %L",
 		   &do_code->loc);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index def998a14ee..6a649831c94 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@ 
+2019-02-14  Cesar Philippidis  <cesar@codesourcery.com>
+
+	PR fortran/72715
+	* gfortran.dg/goacc/loop-3-2.f95: Error on do concurrent loops.
+	* gfortran.dg/goacc/loop-3.f95: Likewise.
+	* gfortran.dg/goacc/pr72715.f90: New test.
+
 2019-02-14  Martin Liska  <mliska@suse.cz>
 
 	PR rtl-optimization/89242
diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95 b/gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95
index 9be74a85919..c091084a4f5 100644
--- a/gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/loop-3-2.f95
@@ -27,9 +27,9 @@  subroutine test1
   !$acc end parallel
   !$acc end loop ! { dg-error "Unexpected" }
 
-  ! OpenACC supports Fortran 2008 do concurrent statement
+  ! OpenACC does not support Fortran 2008 do concurrent statement
   !$acc loop
-  do concurrent (i = 1:5)
+  do concurrent (i = 1:5) ! { dg-error "ACC LOOP cannot be a DO CONCURRENT loop" }
   end do
 
   !$acc loop
diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-3.f95 b/gcc/testsuite/gfortran.dg/goacc/loop-3.f95
index 30930f404f3..ed3e8d50a76 100644
--- a/gcc/testsuite/gfortran.dg/goacc/loop-3.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/loop-3.f95
@@ -24,9 +24,9 @@  subroutine test1
   !$acc end parallel
   !$acc end loop ! { dg-error "Unexpected" }
 
-  ! OpenACC supports Fortran 2008 do concurrent statement
+  ! OpenACC does not support Fortran 2008 do concurrent statement
   !$acc loop
-  do concurrent (i = 1:5)
+  do concurrent (i = 1:5) ! { dg-error "ACC LOOP cannot be a DO CONCURRENT loop" }
   end do
 
   !$acc loop
diff --git a/gcc/testsuite/gfortran.dg/goacc/pr72715.f90 b/gcc/testsuite/gfortran.dg/goacc/pr72715.f90
new file mode 100644
index 00000000000..68580f9f7de
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/pr72715.f90
@@ -0,0 +1,6 @@ 
+program p
+  integer :: i
+  !$acc loop
+  do concurrent (i=1:3) ! { dg-error "ACC LOOP cannot be a DO CONCURRENT loop" }
+  end do
+end program p
-- 
2.17.1