public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
* Fortran: With OpenACC, ignore OpenMP's cond comp sentinels
@ 2020-11-27 17:18 Tobias Burnus
  2020-11-27 17:31 ` Jakub Jelinek
  0 siblings, 1 reply; 4+ messages in thread
From: Tobias Burnus @ 2020-11-27 17:18 UTC (permalink / raw)
  To: gcc-patches, fortran, Thomas Schwinge

[-- Attachment #1: Type: text/plain, Size: 602 bytes --]

'!' starts in Fortran a comment (+ fixed-form variants)
OpenACC defines as sentinel "!$acc" (likewise)
But OpenMP has two: Besides "!$omp" there is additionally
"!$ " (with space) to permit conditional compilation.

Currently, -fopenacc also executes the '!$ ' code, which I
think does not make sense.

Hence, this patch ignores it.
Comments? If not, I intent to commit it in the next days

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter

[-- Attachment #2: oacc-scanner.diff --]
[-- Type: text/x-patch, Size: 2186 bytes --]

Fortran: With OpenACC, ignore OpenMP's cond comp sentinels

gcc/fortran/ChangeLog:

	PR fortran/98011
	* scanner.c (skip_free_comments): If only -fopenacc but not -fopenmp
	is used, ignore OpenMP's conditional compilation sentinels.

gcc/testsuite/ChangeLog:

	PR fortran/98011
	* gfortran.dg/goacc/sentinel-free-form.f95: Update as OpenMP's "!$ "
	conditional compilation sentinels are now ignored.

 gcc/fortran/scanner.c                              | 23 ++++++++--------------
 .../gfortran.dg/goacc/sentinel-free-form.f95       |  7 +++++--
 2 files changed, 13 insertions(+), 17 deletions(-)

diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index fd11f5a244a..b70728d6bd1 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -899,21 +899,14 @@ skip_free_comments (void)
 		if (next_char () == '$')
 		  {
 		    c = next_char ();
-		      if (c == 'a' || c == 'A')
-			{
-			  if (skip_free_oacc_sentinel (start, old_loc))
-			    return false;
-			  gfc_current_locus = old_loc;
-			  next_char();
-			  c = next_char();
-			}
-		      if (continue_flag || c == ' ' || c == '\t')
-			{
-			  gfc_current_locus = old_loc;
-			  next_char();
-			  openacc_flag = 0;
-			  return true;
-			}
+		    if (c == 'a' || c == 'A')
+		      {
+			if (skip_free_oacc_sentinel (start, old_loc))
+			  return false;
+			gfc_current_locus = old_loc;
+			next_char();
+			c = next_char();
+		      }
 		  }
 		gfc_current_locus = old_loc;
 	      }
diff --git a/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95 b/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95
index 1a3189cb34e..00dac667ef1 100644
--- a/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95
@@ -10,7 +10,10 @@ program test
   x = 0.0 !$acc parallel ! comment
   ! sentinel must appear as a single word
   ! $acc parallel ! comment
-  !$ acc parallel ! { dg-error "Unclassifiable statement" }
+
+  ! note that '!$ ' is OpenMP's conditional compilation sentinel
+  !$ acc ignored_due_to_space  ! comment
+
   ! directive lines must have space after sentinel
   !$accparallel ! { dg-warning "followed by a space" }
   do i = 1,10

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Fortran: With OpenACC, ignore OpenMP's cond comp sentinels
  2020-11-27 17:18 Fortran: With OpenACC, ignore OpenMP's cond comp sentinels Tobias Burnus
@ 2020-11-27 17:31 ` Jakub Jelinek
  2020-11-27 22:14   ` Fortran: With OpenACC, ignore OpenMP's cond comp sentinels [PR98011] Tobias Burnus
  0 siblings, 1 reply; 4+ messages in thread
From: Jakub Jelinek @ 2020-11-27 17:31 UTC (permalink / raw)
  To: Tobias Burnus; +Cc: gcc-patches, fortran, Thomas Schwinge

On Fri, Nov 27, 2020 at 06:18:46PM +0100, Tobias Burnus wrote:
> '!' starts in Fortran a comment (+ fixed-form variants)
> OpenACC defines as sentinel "!$acc" (likewise)
> But OpenMP has two: Besides "!$omp" there is additionally
> "!$ " (with space) to permit conditional compilation.
> 
> Currently, -fopenacc also executes the '!$ ' code, which I
> think does not make sense.
> 
> Hence, this patch ignores it.
> Comments? If not, I intent to commit it in the next days

Depends on what does the OpenACC standard say.
If it has similar wording to OpenMP that '!$ ' stands for OpenACC
conditional compilation, then the patch is incorrect, if it is silent on
that, then the patch is correct.

What about fixed-form parsing?  Does it also recognize the conditional
compilation in OpenACC or not?  Tests should cover that too, I guess
including -fopenmp -fopenacc goacc-gomp test that would test that it still
works (both free form and fixed form).

	Jakub


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Fortran: With OpenACC, ignore OpenMP's cond comp sentinels [PR98011]
  2020-11-27 17:31 ` Jakub Jelinek
@ 2020-11-27 22:14   ` Tobias Burnus
  2020-11-30 14:39     ` Tobias Burnus
  0 siblings, 1 reply; 4+ messages in thread
From: Tobias Burnus @ 2020-11-27 22:14 UTC (permalink / raw)
  To: Jakub Jelinek, gcc-patches; +Cc: Thomas Schwinge, fortran

[-- Attachment #1: Type: text/plain, Size: 777 bytes --]

On 27.11.20 18:31, Jakub Jelinek via Fortran wrote:
> Depends on what does the OpenACC standard say.
> If it has similar wording to OpenMP that '!$ ' stands ...

It only has '!$acc' (free) and !$acc + c$acc + *$acc (fixed).
cf. https://www.openacc.org/sites/default/files/inline-images/Specification/OpenACC-3.1-final.pdf
(2.1 Directive Form)

> .. if it is silent on that, then the patch is correct.
>
> What about fixed-form parsing?

Missed that somehow. I have now added two fixed-form testcases
(goacc + goacc-gomp) and a free one (goacc-gomp).

Thanks,

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter

[-- Attachment #2: oacc-scanner-v2.diff --]
[-- Type: text/x-patch, Size: 7372 bytes --]

Fortran: With OpenACC, ignore OpenMP's cond comp sentinels

gcc/fortran/ChangeLog:

	PR fortran/98011
	* scanner.c (skip_free_comments, skip_fixed_comments): If only
	-fopenacc but not -fopenmp is used, ignore OpenMP's conditional
	compilation sentinels. Fix indentation, use 'else if' for readability.

gcc/testsuite/ChangeLog:

	PR fortran/98011
	* gfortran.dg/goacc/sentinel-free-form.f95:
	* gfortran.dg/goacc-gomp/fixed-1.f: New test.
	* gfortran.dg/goacc-gomp/free-1.f: New test.
	* gfortran.dg/goacc/fixed-5.f: New test.

 gcc/fortran/scanner.c                              | 32 +++------
 gcc/testsuite/gfortran.dg/goacc-gomp/fixed-1.f     | 81 ++++++++++++++++++++++
 gcc/testsuite/gfortran.dg/goacc-gomp/free-1.f90    | 34 +++++++++
 gcc/testsuite/gfortran.dg/goacc/fixed-5.f          | 30 ++++++++
 .../gfortran.dg/goacc/sentinel-free-form.f95       |  7 +-
 5 files changed, 161 insertions(+), 23 deletions(-)

diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index fd11f5a244a..304ae2d8d6a 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -899,21 +899,14 @@ skip_free_comments (void)
 		if (next_char () == '$')
 		  {
 		    c = next_char ();
-		      if (c == 'a' || c == 'A')
-			{
-			  if (skip_free_oacc_sentinel (start, old_loc))
-			    return false;
-			  gfc_current_locus = old_loc;
-			  next_char();
-			  c = next_char();
-			}
-		      if (continue_flag || c == ' ' || c == '\t')
-			{
-			  gfc_current_locus = old_loc;
-			  next_char();
-			  openacc_flag = 0;
-			  return true;
-			}
+		    if (c == 'a' || c == 'A')
+		      {
+			if (skip_free_oacc_sentinel (start, old_loc))
+			  return false;
+			gfc_current_locus = old_loc;
+			next_char();
+			c = next_char();
+		      }
 		  }
 		gfc_current_locus = old_loc;
 	      }
@@ -1076,8 +1069,7 @@ skip_fixed_comments (void)
 		}
 	      gfc_current_locus = start;
 	    }
-
-	  if (flag_openacc && !(flag_openmp || flag_openmp_simd))
+	  else if (flag_openacc && !(flag_openmp || flag_openmp_simd))
 	    {
 	      if (next_char () == '$')
 		{
@@ -1087,13 +1079,10 @@ skip_fixed_comments (void)
 		      if (skip_fixed_oacc_sentinel (&start))
 			return;
 		    }
-		  else
-		    goto check_for_digits;
 		}
 	      gfc_current_locus = start;
 	    }
-
-	  if (flag_openacc || flag_openmp || flag_openmp_simd)
+	  else if (flag_openacc || flag_openmp || flag_openmp_simd)
 	    {
 	      if (next_char () == '$')
 		{
@@ -1120,6 +1109,7 @@ skip_fixed_comments (void)
 	  gcc_unreachable ();
 check_for_digits:
 	  {
+	    /* Required for OpenMP's conditional compilation sentinel. */
 	    int digit_seen = 0;
 
 	    for (col = 3; col < 6; col++, c = next_char ())
diff --git a/gcc/testsuite/gfortran.dg/goacc-gomp/fixed-1.f b/gcc/testsuite/gfortran.dg/goacc-gomp/fixed-1.f
new file mode 100644
index 00000000000..b6bab4ce902
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc-gomp/fixed-1.f
@@ -0,0 +1,81 @@
+! { dg-additional-options "-fdump-tree-original -Wunused-variable" }
+      implicit none
+      integer :: a,b,c,d,e,f,g,h,i,j,k,ll
+
+c$bogus
+!$bogus
+*$bogus
+
+c$ bogus
+!$ bogus
+*$ bogus
+
+c$a23 bogus
+!$ a  bogus
+*$12a bogus
+
+! The following should be parsed as OpenMP conditional sentinel
+! If not, expect a unused-variable warning
+
+c$    a = 1
+!$    b = 2
+*$    c = 3
+
+c$ 1  d = 4
+!$ 22 e = 5
+*$34  f = 6
+
+c$    g = 
+c$   *7
+!$ 2  h =
+*$   & 8
+*$ 3  i
+!$   & = 9
+
+c$    j
+*$   &= 
+c$   *10
+!$ 5  k
+*$   * =
+c$   & 1
+*$   & 1
+*$9 9 ll
+!$   & =
+!$   *  12
+
+c$ bogus
+!$ bogus
+*$ bogus
+
+c$bogus
+!$bogus
+*$bogus
+
+c$ acc bogus
+!$ acc bogus
+*$ acc bogus
+
+c$ omp bogus
+!$ omp bogus
+*$ omp bogus
+      end
+
+!{ dg-final { scan-tree-dump-times "a = 1;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "b = 2;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "c = 3;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "d = 4;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "e = 5;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "f = 6;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "g = 7;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "h = 8;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "i = 9;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "j = 10;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "k = 11;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "ll = 12;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000001:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000022:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000034:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000002:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000003:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000005:;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "__label_000099:;" 1 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/goacc-gomp/free-1.f90 b/gcc/testsuite/gfortran.dg/goacc-gomp/free-1.f90
new file mode 100644
index 00000000000..0d6f2b2e3a6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc-gomp/free-1.f90
@@ -0,0 +1,34 @@
+! { dg-additional-options "-fdump-tree-original -Wunused-variable" }
+implicit none
+integer :: a,b,c,d,e,f,g,h
+
+!$bogus
+
+    !$bogus
+!$& bogus
+   !$& bogus
+
+!$    a = 1
+!$ b = 2
+!$ c = &
+!$3
+
+!$ d = &
+!$&4
+
+  !$    e = 5
+ !$ f = 6
+   !$ g = &
+ !$7
+
+ !$ h = &
+!$&8
+      end
+
+!{ dg-final { scan-tree-dump-times "a = 1;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "b = 2;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "c = 3;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "d = 4;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "e = 5;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "f = 6;" 1 "original" } }
+!{ dg-final { scan-tree-dump-times "g = 7;" 1 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/goacc/fixed-5.f b/gcc/testsuite/gfortran.dg/goacc/fixed-5.f
new file mode 100644
index 00000000000..ab51b218d80
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/fixed-5.f
@@ -0,0 +1,30 @@
+! Check that OpenMP conditional compilations sentinels ('!$ ') are ignored
+
+c$ bogus
+!$ bogus
+*$ bogus
+c$    bogus
+!$    bogus
+*$    bogus
+
+c$a23 bogus
+!$ a  bogus
+*$12a bogus
+
+c$ 1  bogus
+!$ 22 bogus
+*$34  bogus
+
+c$bogus
+!$bogus
+*$bogus
+
+c$ acc bogus
+!$ acc bogus
+*$ acc bogus
+
+c$ acc bogus
+!$ acc bogus
+*$ acc bogus
+
+      end
diff --git a/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95 b/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95
index 1a3189cb34e..00dac667ef1 100644
--- a/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95
@@ -10,7 +10,10 @@ program test
   x = 0.0 !$acc parallel ! comment
   ! sentinel must appear as a single word
   ! $acc parallel ! comment
-  !$ acc parallel ! { dg-error "Unclassifiable statement" }
+
+  ! note that '!$ ' is OpenMP's conditional compilation sentinel
+  !$ acc ignored_due_to_space  ! comment
+
   ! directive lines must have space after sentinel
   !$accparallel ! { dg-warning "followed by a space" }
   do i = 1,10
@@ -18,4 +21,4 @@ program test
   enddo
   !$acc end parallel ! { dg-error "Unexpected" }
   print *, x
-end
\ No newline at end of file
+end

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Fortran: With OpenACC, ignore OpenMP's cond comp sentinels [PR98011]
  2020-11-27 22:14   ` Fortran: With OpenACC, ignore OpenMP's cond comp sentinels [PR98011] Tobias Burnus
@ 2020-11-30 14:39     ` Tobias Burnus
  0 siblings, 0 replies; 4+ messages in thread
From: Tobias Burnus @ 2020-11-30 14:39 UTC (permalink / raw)
  To: Jakub Jelinek, gcc-patches; +Cc: Thomas Schwinge, fortran

... and now committed as r11-5572-g1d6f6ac693a8601bef9fe4ba72eb6fbf7b60b5cd.

Thanks again for the suggestions!

Tobias

On 27.11.20 23:14, Tobias Burnus wrote:
> On 27.11.20 18:31, Jakub Jelinek via Fortran wrote:
>> Depends on what does the OpenACC standard say.
>> If it has similar wording to OpenMP that '!$ ' stands ...
>
> It only has '!$acc' (free) and !$acc + c$acc + *$acc (fixed).
> cf.
> https://www.openacc.org/sites/default/files/inline-images/Specification/OpenACC-3.1-final.pdf
> (2.1 Directive Form)
>
>> .. if it is silent on that, then the patch is correct.
>>
>> What about fixed-form parsing?
>
> Missed that somehow. I have now added two fixed-form testcases
> (goacc + goacc-gomp) and a free one (goacc-gomp).
>
> Thanks,
>
> Tobias
>
-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-11-30 14:39 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-27 17:18 Fortran: With OpenACC, ignore OpenMP's cond comp sentinels Tobias Burnus
2020-11-27 17:31 ` Jakub Jelinek
2020-11-27 22:14   ` Fortran: With OpenACC, ignore OpenMP's cond comp sentinels [PR98011] Tobias Burnus
2020-11-30 14:39     ` Tobias Burnus

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).