This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[gomp4] Some nesting region check adjustments
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 30 Apr 2013 18:08:17 +0200
- Subject: [gomp4] Some nesting region check adjustments
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
I've adjusted what I could now in check_omp_nesting_restrictions to match
the 4.0 draft.
2013-04-30 Jakub Jelinek <jakub@redhat.com>
* omp-low.c (check_omp_nesting_restrictions): Diagnose
OpenMP constructs nested inside simd region. Don't treat
#pragma omp simd as work-sharing region. Disallow work-sharing
constructs inside of critical region. Complain if ordered
region is nested inside of parallel region without loop
region in between.
(scan_omp_1_stmt): Call check_omp_nesting_restrictions even
for GOMP_{cancel{,lation_point},taskyield,taskwait} calls.
* gfortran.dg/gomp/appendix-a/a.35.5.f90: Add dg-error.
--- gcc/omp-low.c.jj 2013-04-23 16:15:06.000000000 +0200
+++ gcc/omp-low.c 2013-04-30 10:26:40.402771053 +0200
@@ -1859,9 +1859,21 @@ scan_omp_single (gimple stmt, omp_contex
static bool
check_omp_nesting_restrictions (gimple stmt, omp_context *ctx)
{
+ if (ctx != NULL
+ && gimple_code (ctx->stmt) == GIMPLE_OMP_FOR
+ && (gimple_omp_for_kind (ctx->stmt) == GF_OMP_FOR_KIND_SIMD
+ || gimple_omp_for_kind (ctx->stmt) == GF_OMP_FOR_KIND_FOR_SIMD))
+ {
+ error_at (gimple_location (stmt),
+ "OpenMP constructs may not be nested inside simd region");
+ return false;
+ }
switch (gimple_code (stmt))
{
case GIMPLE_OMP_FOR:
+ if (gimple_omp_for_kind (stmt) == GF_OMP_FOR_KIND_SIMD)
+ return true;
+ /* FALLTHRU */
case GIMPLE_OMP_SECTIONS:
case GIMPLE_OMP_SINGLE:
case GIMPLE_CALL:
@@ -1874,8 +1886,12 @@ check_omp_nesting_restrictions (gimple s
case GIMPLE_OMP_ORDERED:
case GIMPLE_OMP_MASTER:
case GIMPLE_OMP_TASK:
+ case GIMPLE_OMP_CRITICAL:
if (is_gimple_call (stmt))
{
+ if (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt))
+ != BUILT_IN_GOMP_BARRIER)
+ return true;
error_at (gimple_location (stmt),
"barrier region may not be closely nested inside "
"of work-sharing, critical, ordered, master or "
@@ -1932,7 +1948,10 @@ check_omp_nesting_restrictions (gimple s
}
return true;
case GIMPLE_OMP_PARALLEL:
- return true;
+ error_at (gimple_location (stmt),
+ "ordered region must be closely nested inside "
+ "a loop region with an ordered clause");
+ return false;
default:
break;
}
@@ -2029,9 +2048,20 @@ scan_omp_1_stmt (gimple_stmt_iterator *g
else if (is_gimple_call (stmt))
{
tree fndecl = gimple_call_fndecl (stmt);
- if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
- && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_GOMP_BARRIER)
- remove = !check_omp_nesting_restrictions (stmt, ctx);
+ if (fndecl
+ && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
+ switch (DECL_FUNCTION_CODE (fndecl))
+ {
+ case BUILT_IN_GOMP_BARRIER:
+ case BUILT_IN_GOMP_CANCEL:
+ case BUILT_IN_GOMP_CANCELLATION_POINT:
+ case BUILT_IN_GOMP_TASKYIELD:
+ case BUILT_IN_GOMP_TASKWAIT:
+ remove = !check_omp_nesting_restrictions (stmt, ctx);
+ break;
+ default:
+ break;
+ }
}
if (remove)
{
--- gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.5.f90.jj 2013-03-20 10:05:25.462181487 +0100
+++ gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.5.f90 2013-04-30 17:24:27.805425874 +0200
@@ -6,7 +6,7 @@
!$OMP CRITICAL
CALL WORK(N,1)
! incorrect nesting of barrier region in a critical region
-!$OMP BARRIER
+!$OMP BARRIER ! { dg-error "region may not be closely nested inside of" }
CALL WORK(N,2)
!$OMP END CRITICAL
!$OMP END PARALLEL
Jakub