re PR c/45784 (gcc OpenMP - error: invalid controlling predicate)
authorJakub Jelinek <jakub@redhat.com>
Thu, 27 Jul 2017 19:13:42 +0000 (21:13 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 27 Jul 2017 19:13:42 +0000 (21:13 +0200)
PR c/45784
* c-omp.c (c_finish_omp_for): If the condition is wrapped in
rhs of COMPOUND_EXPR(s), skip them and readd their lhs into
new COMPOUND_EXPRs around the rhs of the comparison.

* testsuite/libgomp.c/pr45784.c: New test.
* testsuite/libgomp.c++/pr45784.C: New test.

From-SVN: r250635

gcc/c-family/ChangeLog
gcc/c-family/c-omp.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c++/pr45784.C [new file with mode: 0644]
libgomp/testsuite/libgomp.c/pr45784.c [new file with mode: 0644]

index 12683a641779c62d69210fa866d2e9e5634a7d0f..c05ca124ddc93fabd2fb8209e6a8385bd74a12d9 100644 (file)
@@ -1,3 +1,10 @@
+2017-07-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/45784
+       * c-omp.c (c_finish_omp_for): If the condition is wrapped in
+       rhs of COMPOUND_EXPR(s), skip them and readd their lhs into
+       new COMPOUND_EXPRs around the rhs of the comparison.
+
 2017-07-27  Marek Polacek  <polacek@redhat.com>
 
        PR c/81417
index 519c4e4ce6690bd09d9608d2221177caf3bb1624..977cb0ea15303d22486769541faf070cfcb91002 100644 (file)
@@ -531,6 +531,12 @@ c_finish_omp_for (location_t locus, enum tree_code code, tree declv,
        {
          bool cond_ok = false;
 
+         /* E.g. C sizeof (vla) could add COMPOUND_EXPRs with
+            evaluation of the vla VAR_DECL.  We need to readd
+            them to the non-decl operand.  See PR45784.  */
+         while (TREE_CODE (cond) == COMPOUND_EXPR)
+           cond = TREE_OPERAND (cond, 1);
+
          if (EXPR_HAS_LOCATION (cond))
            elocus = EXPR_LOCATION (cond);
 
@@ -605,6 +611,21 @@ c_finish_omp_for (location_t locus, enum tree_code code, tree declv,
                  else if (code != CILK_SIMD && code != CILK_FOR)
                    cond_ok = false;
                }
+
+             if (cond_ok && TREE_VEC_ELT (condv, i) != cond)
+               {
+                 tree ce = NULL_TREE, *pce = &ce;
+                 tree type = TREE_TYPE (TREE_OPERAND (cond, 1));
+                 for (tree c = TREE_VEC_ELT (condv, i); c != cond;
+                      c = TREE_OPERAND (c, 1))
+                   {
+                     *pce = build2 (COMPOUND_EXPR, type, TREE_OPERAND (c, 0),
+                                    TREE_OPERAND (cond, 1));
+                     pce = &TREE_OPERAND (*pce, 1);
+                   }
+                 TREE_OPERAND (cond, 1) = ce;
+                 TREE_VEC_ELT (condv, i) = cond;
+               }
            }
 
          if (!cond_ok)
index 187f5a3e356da52ecbad41542311c8fd613c43ed..0e6258ff87a3af8d98e52ae21c5e24df057d40f1 100644 (file)
@@ -1,3 +1,9 @@
+2017-07-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/45784
+       * testsuite/libgomp.c/pr45784.c: New test.
+       * testsuite/libgomp.c++/pr45784.C: New test.
+
 2017-07-19  Tom de Vries  <tom@codesourcery.com>
 
        * testsuite/libgomp.oacc-c/vec.c: New test.
diff --git a/libgomp/testsuite/libgomp.c++/pr45784.C b/libgomp/testsuite/libgomp.c++/pr45784.C
new file mode 100644 (file)
index 0000000..306246c
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c/45784
+// { dg-do run }
+
+#include "../libgomp.c/pr45784.c"
+
diff --git a/libgomp/testsuite/libgomp.c/pr45784.c b/libgomp/testsuite/libgomp.c/pr45784.c
new file mode 100644 (file)
index 0000000..7861210
--- /dev/null
@@ -0,0 +1,41 @@
+/* PR c/45784 */
+/* { dg-do run } */
+
+void
+foo (int n)
+{
+  char *p, vla[2 * n];
+  int i;
+  #pragma omp parallel for
+  for (p = vla; p < vla + (sizeof (vla) / sizeof (vla[0])); p++)
+    *p = ' ';
+  #pragma omp parallel for
+  for (i = 0; i < 2 * n; i++)
+    if (vla[i] != ' ')
+      __builtin_abort ();
+}
+
+void
+bar (int n)
+{
+  char *p, vla1[n], vla2[n * 2], vla3[n * 3], vla4[n * 4];
+  int i;
+  __builtin_memset (vla4, ' ', n * 4);
+  #pragma omp parallel for
+  for (p = vla4 + sizeof (vla1); p < vla4 + sizeof (vla3) - sizeof (vla2) + sizeof (vla1); p += sizeof (vla4) / sizeof (vla4))
+    p[0] = '!';
+  #pragma omp parallel for
+  for (i = 0; i < n * 4; i++)
+    if (vla4[i] != ((i >= n && i < 2 * n) ? '!' : ' '))
+      __builtin_abort ();
+}
+
+int
+main ()
+{
+  volatile int n;
+  n = 128;
+  foo (n);
+  bar (n);
+  return 0;
+}