aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/c-family/ChangeLog7
-rw-r--r--gcc/c-family/c-omp.c21
-rw-r--r--libgomp/ChangeLog6
-rw-r--r--libgomp/testsuite/libgomp.c++/pr45784.C5
-rw-r--r--libgomp/testsuite/libgomp.c/pr45784.c41
5 files changed, 80 insertions, 0 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 12683a6..c05ca12 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -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
diff --git a/gcc/c-family/c-omp.c b/gcc/c-family/c-omp.c
index 519c4e4..977cb0e 100644
--- a/gcc/c-family/c-omp.c
+++ b/gcc/c-family/c-omp.c
@@ -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)
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 187f5a3..0e6258f 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -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
index 0000000..306246c
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c++/pr45784.C
@@ -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
index 0000000..7861210
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/pr45784.c
@@ -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;
+}