re PR middle-end/66820 (internal compiler error: in get_expr_operands, at tree-ssa...
authorJakub Jelinek <jakub@redhat.com>
Fri, 10 Jul 2015 10:26:19 +0000 (12:26 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 10 Jul 2015 10:26:19 +0000 (12:26 +0200)
PR middle-end/66820
* gimplify.c (maybe_fold_stmt): Don't fold in ORT_PARALLEL
or ORT_TASK contexts.
* omp-low.c (lower_omp): Call fold_stmt even if taskreg_nesting_level
is non-zero.

* gcc.dg/gomp/pr66820.c: New test.

From-SVN: r225661

gcc/ChangeLog
gcc/gimplify.c
gcc/omp-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/pr66820.c [new file with mode: 0644]

index 8d4d499060a20fd0600a1a96240c1953a45e99d4..e3b8d27da864bcd665a444a2d1643dfbeb05ee47 100644 (file)
@@ -1,3 +1,11 @@
+2015-07-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/66820
+       * gimplify.c (maybe_fold_stmt): Don't fold in ORT_PARALLEL
+       or ORT_TASK contexts.
+       * omp-low.c (lower_omp): Call fold_stmt even if taskreg_nesting_level
+       is non-zero.
+
 2015-07-10  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * expr.c (expand_cond_expr_using_cmove): Fix typos in comment
index c621305fe6bb126cf95b1af525cd736bace40f99..07ea2a7aa61b25e356aef9711fa078493065d83e 100644 (file)
@@ -2245,16 +2245,17 @@ gimplify_arg (tree *arg_p, gimple_seq *pre_p, location_t call_location)
   return gimplify_expr (arg_p, pre_p, NULL, test, fb);
 }
 
-/* Don't fold inside offloading regions: it can break code by adding decl
-   references that weren't in the source.  We'll do it during omplower pass
-   instead.  */
+/* Don't fold inside offloading or taskreg regions: it can break code by
+   adding decl references that weren't in the source.  We'll do it during
+   omplower pass instead.  */
 
 static bool
 maybe_fold_stmt (gimple_stmt_iterator *gsi)
 {
   struct gimplify_omp_ctx *ctx;
   for (ctx = gimplify_omp_ctxp; ctx; ctx = ctx->outer_context)
-    if (ctx->region_type == ORT_TARGET)
+    if (ctx->region_type == ORT_TARGET
+       || (ctx->region_type & (ORT_PARALLEL | ORT_TASK)) != 0)
       return false;
   return fold_stmt (gsi);
 }
index 2517f1873cda90acd97a6adffaf62f55dbd12fb5..aa1e6666dbdc447008f2c2bdd491de04e5f59f19 100644 (file)
@@ -11890,8 +11890,8 @@ lower_omp (gimple_seq *body, omp_context *ctx)
   for (gsi = gsi_start (*body); !gsi_end_p (gsi); gsi_next (&gsi))
     lower_omp_1 (&gsi, ctx);
   /* During gimplification, we haven't folded statments inside offloading
-     regions (gimplify.c:maybe_fold_stmt); do that now.  */
-  if (target_nesting_level)
+     or taskreg regions (gimplify.c:maybe_fold_stmt); do that now.  */
+  if (target_nesting_level || taskreg_nesting_level)
     for (gsi = gsi_start (*body); !gsi_end_p (gsi); gsi_next (&gsi))
       fold_stmt (&gsi);
   input_location = saved_location;
index eb59054b49a809bb090d12b298fb63a0f9d2003a..04c64c45ff930cb2b24b441a75380112762366ea 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/66820
+       * gcc.dg/gomp/pr66820.c: New test.
+
 2015-07-10  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/65592
diff --git a/gcc/testsuite/gcc.dg/gomp/pr66820.c b/gcc/testsuite/gcc.dg/gomp/pr66820.c
new file mode 100644 (file)
index 0000000..2fe4af1
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR middle-end/66820 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void bar (char *);
+
+void
+foo (char **x)
+{
+#pragma omp parallel for
+  for (int i = 0; i < 16; i++)
+    {
+      char y[50];
+      __builtin_strcpy (y, x[i]);
+      __builtin_strcat (y, "foo");
+      bar (y);
+    }
+}