re PR libgomp/80394 (Empty OpenMP task is wrongly removed when optimizing)
authorJakub Jelinek <jakub@redhat.com>
Tue, 11 Apr 2017 17:15:47 +0000 (19:15 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Apr 2017 17:15:47 +0000 (19:15 +0200)
PR libgomp/80394
* omp-low.c (scan_omp_task): Don't optimize away empty tasks
if they have any depend clauses.

* testsuite/libgomp.c/pr80394.c: New test.

From-SVN: r246849

gcc/ChangeLog
gcc/omp-low.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/pr80394.c [new file with mode: 0644]

index 4e62a498246cd0dd27c64d7eb7c03fe5221ac820..900e58ce58e48090e82eff2536b76ac8cbf961af 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR libgomp/80394
+       * omp-low.c (scan_omp_task): Don't optimize away empty tasks
+       if they have any depend clauses.
+
 2017-04-11  Martin Liska  <mliska@suse.cz>
 
        PR ipa/80212
index 253dc8563744d14cccb2079cfb1ec15f9d60c906..22772ba28918eeeab039c8b7db0562334e1de7d0 100644 (file)
@@ -1857,9 +1857,11 @@ scan_omp_task (gimple_stmt_iterator *gsi, omp_context *outer_ctx)
   tree name, t;
   gomp_task *stmt = as_a <gomp_task *> (gsi_stmt (*gsi));
 
-  /* Ignore task directives with empty bodies.  */
+  /* Ignore task directives with empty bodies, unless they have depend
+     clause.  */
   if (optimize > 0
-      && empty_body_p (gimple_omp_body (stmt)))
+      && empty_body_p (gimple_omp_body (stmt))
+      && !omp_find_clause (gimple_omp_task_clauses (stmt), OMP_CLAUSE_DEPEND))
     {
       gsi_replace (gsi, gimple_build_nop (), false);
       return;
index 5beaaa7cfba947476be48d03b86bb9992ff30d1a..67351ae7d11b35e83cc2d28e6ef268f3e57088a1 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR libgomp/80394
+       * testsuite/libgomp.c/pr80394.c: New test.
+
 2017-04-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR libgomp/79876
diff --git a/libgomp/testsuite/libgomp.c/pr80394.c b/libgomp/testsuite/libgomp.c/pr80394.c
new file mode 100644 (file)
index 0000000..6c5a740
--- /dev/null
@@ -0,0 +1,22 @@
+/* PR libgomp/80394 */
+
+int
+main ()
+{
+  int x = 0;
+  #pragma omp parallel shared(x)
+  #pragma omp single
+  {
+    #pragma omp task depend(inout: x)
+    {
+      for (int i = 0; i < 100000; i++)
+        asm volatile ("" : : : "memory");
+      x += 5;
+    }
+    #pragma omp task if (0) depend(inout: x)
+    ;
+    if (x != 5)
+      __builtin_abort ();
+  }
+  return 0;
+}