[committed] openmp: Fix OpenMP expansion of scope with non-fallthrugh body [PR102415]

Message ID 20210922073917.GB304296@tucnak
State Committed
Headers
Series [committed] openmp: Fix OpenMP expansion of scope with non-fallthrugh body [PR102415] |

Commit Message

Jakub Jelinek Sept. 22, 2021, 7:39 a.m. UTC
  Hi!

I've used function for omp single expansion also for omp scope.  That is
mostly ok, but as the testcase shows, there is one important difference.
The omp single expansion always has a fallthru body, because it during
omp lowering expands the body as if wrapped in an if to simulate that
one thread runs the body and others wait (unless nowait) until it completes
and continue.  omp scope is invoked by all threads and so if the body
is non-fallthru, the barrier (unless nowait) at the end will not be reached
by any of the threads.

The following patch fixes that by handling the case where cfg pass optimizes
away the exit bb of it gracefully.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

2021-09-22  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/102415
	* omp-expand.c (expand_omp_single): If region->exit is NULL,
	assert region->entry is GIMPLE_OMP_SCOPE region and return.
	
	* c-c++-common/gomp/scope-3.c: New test.


	Jakub
  

Patch

--- gcc/omp-expand.c.jj	2021-09-11 09:33:37.895331824 +0200
+++ gcc/omp-expand.c	2021-09-21 19:08:18.841588400 +0200
@@ -8428,11 +8428,17 @@  expand_omp_single (struct omp_region *re
   exit_bb = region->exit;
 
   si = gsi_last_nondebug_bb (entry_bb);
-  gcc_assert (gimple_code (gsi_stmt (si)) == GIMPLE_OMP_SINGLE
-	      || gimple_code (gsi_stmt (si)) == GIMPLE_OMP_SCOPE);
+  enum gimple_code code = gimple_code (gsi_stmt (si));
+  gcc_assert (code == GIMPLE_OMP_SINGLE || code == GIMPLE_OMP_SCOPE);
   gsi_remove (&si, true);
   single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU;
 
+  if (exit_bb == NULL)
+    {
+      gcc_assert (code == GIMPLE_OMP_SCOPE);
+      return;
+    }
+
   si = gsi_last_nondebug_bb (exit_bb);
   if (!gimple_omp_return_nowait_p (gsi_stmt (si)))
     {
--- gcc/testsuite/c-c++-common/gomp/scope-3.c.jj	2021-09-21 19:04:19.124972662 +0200
+++ gcc/testsuite/c-c++-common/gomp/scope-3.c	2021-09-21 19:09:39.699446866 +0200
@@ -0,0 +1,21 @@ 
+/* PR middle-end/102415 */
+
+extern
+#ifdef __cplusplus
+"C"
+#endif
+void abort ();
+
+void
+foo (void)
+{
+  #pragma omp scope nowait
+  abort ();
+}
+
+void
+bar (void)
+{
+  #pragma omp scope
+  abort ();
+}