Fix PR85782: C++ ICE with continue statements inside acc loops

Message ID 089cec5d-9cec-d507-10b0-9ffd73963d6d@codesourcery.com
State New
Headers show
Series
  • Fix PR85782: C++ ICE with continue statements inside acc loops
Related show

Commit Message

Cesar Philippidis May 15, 2018, 2:11 p.m.
This patch resolves the issue in PR85782, which involves a C++ ICE
caused by OpenACC loops which contain continue statements. The problem
is that genericize_continue_stmt expects a continue label for the loop,
but that wasn't getting set up acc loops. This patch fixes that by
calling genericize_omp_for_stmt for OACC_LOOP statements, because
OACC_LOOP and OMP_FOR statements are almost identical at this point of
parsing.

I regression tested it on x86_64-linux with nvptx offloading.

Is this ok for trunk and the stable branches?  The patch for the stable
branches is slightly different, because cp_genericize_r uses if
statements to check for statement types instead of a huge switch statement.

Cesar

Comments

Cesar Philippidis May 18, 2018, 3:30 p.m. | #1
Ping.

For reference, I've attached the patch for gcc7.

Cesar

On 05/15/2018 07:11 AM, Cesar Philippidis wrote:
> This patch resolves the issue in PR85782, which involves a C++ ICE
> caused by OpenACC loops which contain continue statements. The problem
> is that genericize_continue_stmt expects a continue label for the loop,
> but that wasn't getting set up acc loops. This patch fixes that by
> calling genericize_omp_for_stmt for OACC_LOOP statements, because
> OACC_LOOP and OMP_FOR statements are almost identical at this point of
> parsing.
> 
> I regression tested it on x86_64-linux with nvptx offloading.
> 
> Is this ok for trunk and the stable branches?  The patch for the stable
> branches is slightly different, because cp_genericize_r uses if
> statements to check for statement types instead of a huge switch statement.
> 
> Cesar
> 
> 
> trunk-pr85782.diff
> 
> 
> 2018-05-15  Cesar Philippidis  <cesar@codesourcery.com>
> 
> 	PR c++/85782
> 
> 	gcc/cp/
> 	* cp-gimplify.c (cp_genericize_r): Call genericize_omp_for_stmt for
> 	OACC_LOOPs.
> 
> 	gcc/testsuite/
> 	* c-c++-common/goacc/pr85782.c: New test.
> 
> 	libgomp/
> 	* testsuite/libgomp.oacc-c-c++-common/pr85782.c: New test.
> 
> 
> diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
> index eda5f05..55aef86 100644
> --- a/gcc/cp/cp-gimplify.c
> +++ b/gcc/cp/cp-gimplify.c
> @@ -1463,6 +1463,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
>      case OMP_FOR:
>      case OMP_SIMD:
>      case OMP_DISTRIBUTE:
> +    case OACC_LOOP:
>        genericize_omp_for_stmt (stmt_p, walk_subtrees, data);
>        break;
>  
> diff --git a/gcc/testsuite/c-c++-common/goacc/pr85782.c b/gcc/testsuite/c-c++-common/goacc/pr85782.c
> new file mode 100644
> index 0000000..f213a24
> --- /dev/null
> +++ b/gcc/testsuite/c-c++-common/goacc/pr85782.c
> @@ -0,0 +1,11 @@
> +/* PR c++/85782 */
> +
> +void
> +foo ()
> +{
> +  int i;
> +  
> +  #pragma acc parallel loop
> +  for (i = 0; i < 100; i++)
> +    continue;
> +}
> diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/pr85782.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/pr85782.c
> new file mode 100644
> index 0000000..6f84dfc
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/pr85782.c
> @@ -0,0 +1,32 @@
> +/* PR c++/85782 */
> +
> +#include <assert.h>
> +
> +#define N 100
> +
> +int
> +main ()
> +{
> +  int i, a[N];
> +
> +  for (i = 0; i < N; i++)
> +    a[i] = i+1;
> +
> +  #pragma acc parallel loop copy(a)
> +  for (i = 0; i < N; i++)
> +    {
> +      if (i % 2)
> +	continue;
> +      a[i] = 0;
> +    }
> +
> +  for (i = 0; i < N; i++)
> +    {
> +      if (i % 2)
> +	assert (a[i] == i+1);
> +      else
> +	assert (a[i] == 0);
> +    }
> +
> +    return 0;
> +}
>
2018-05-18  Cesar Philippidis  <cesar@codesourcery.com>

	PR c++/85782

	gcc/cp/
	* cp-gimplify.c (cp_genericize_r): Call genericize_omp_for_stmt for
	OACC_LOOPs.

	gcc/testsuite/
	* c-c++-common/goacc/pr85782.c: New test.

	libgomp/
	* testsuite/libgomp.oacc-c-c++-common/pr85782.c: New test.


diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 00214e9..4fbb8b5 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1473,7 +1473,8 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
     genericize_break_stmt (stmt_p);
   else if (TREE_CODE (stmt) == OMP_FOR
 	   || TREE_CODE (stmt) == OMP_SIMD
-	   || TREE_CODE (stmt) == OMP_DISTRIBUTE)
+	   || TREE_CODE (stmt) == OMP_DISTRIBUTE
+	   || TREE_CODE (stmt) == OACC_LOOP)
     genericize_omp_for_stmt (stmt_p, walk_subtrees, data);
   else if (TREE_CODE (stmt) == PTRMEM_CST)
     {
diff --git a/gcc/testsuite/c-c++-common/goacc/pr85782.c b/gcc/testsuite/c-c++-common/goacc/pr85782.c
new file mode 100644
index 0000000..f213a24
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/goacc/pr85782.c
@@ -0,0 +1,11 @@
+/* PR c++/85782 */
+
+void
+foo ()
+{
+  int i;
+  
+  #pragma acc parallel loop
+  for (i = 0; i < 100; i++)
+    continue;
+}
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/pr85782.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/pr85782.c
new file mode 100644
index 0000000..6f84dfc
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/pr85782.c
@@ -0,0 +1,32 @@
+/* PR c++/85782 */
+
+#include <assert.h>
+
+#define N 100
+
+int
+main ()
+{
+  int i, a[N];
+
+  for (i = 0; i < N; i++)
+    a[i] = i+1;
+
+  #pragma acc parallel loop copy(a)
+  for (i = 0; i < N; i++)
+    {
+      if (i % 2)
+	continue;
+      a[i] = 0;
+    }
+
+  for (i = 0; i < N; i++)
+    {
+      if (i % 2)
+	assert (a[i] == i+1);
+      else
+	assert (a[i] == 0);
+    }
+
+    return 0;
+}
Jakub Jelinek May 18, 2018, 3:34 p.m. | #2
On Fri, May 18, 2018 at 08:30:44AM -0700, Cesar Philippidis wrote:
> Ping.

Ok.

> For reference, I've attached the patch for gcc7.

	Jakub

Patch

2018-05-15  Cesar Philippidis  <cesar@codesourcery.com>

	PR c++/85782

	gcc/cp/
	* cp-gimplify.c (cp_genericize_r): Call genericize_omp_for_stmt for
	OACC_LOOPs.

	gcc/testsuite/
	* c-c++-common/goacc/pr85782.c: New test.

	libgomp/
	* testsuite/libgomp.oacc-c-c++-common/pr85782.c: New test.


diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index eda5f05..55aef86 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1463,6 +1463,7 @@  cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
     case OMP_FOR:
     case OMP_SIMD:
     case OMP_DISTRIBUTE:
+    case OACC_LOOP:
       genericize_omp_for_stmt (stmt_p, walk_subtrees, data);
       break;
 
diff --git a/gcc/testsuite/c-c++-common/goacc/pr85782.c b/gcc/testsuite/c-c++-common/goacc/pr85782.c
new file mode 100644
index 0000000..f213a24
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/goacc/pr85782.c
@@ -0,0 +1,11 @@ 
+/* PR c++/85782 */
+
+void
+foo ()
+{
+  int i;
+  
+  #pragma acc parallel loop
+  for (i = 0; i < 100; i++)
+    continue;
+}
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/pr85782.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/pr85782.c
new file mode 100644
index 0000000..6f84dfc
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/pr85782.c
@@ -0,0 +1,32 @@ 
+/* PR c++/85782 */
+
+#include <assert.h>
+
+#define N 100
+
+int
+main ()
+{
+  int i, a[N];
+
+  for (i = 0; i < N; i++)
+    a[i] = i+1;
+
+  #pragma acc parallel loop copy(a)
+  for (i = 0; i < N; i++)
+    {
+      if (i % 2)
+	continue;
+      a[i] = 0;
+    }
+
+  for (i = 0; i < N; i++)
+    {
+      if (i % 2)
+	assert (a[i] == i+1);
+      else
+	assert (a[i] == 0);
+    }
+
+    return 0;
+}