Skip to content
Snippets Groups Projects
  • Jakub Jelinek's avatar
    2c16eb31
    openmp: Add support for inoutset depend-kind · 2c16eb31
    Jakub Jelinek authored
    This patch adds support for inoutset depend-kind in depend
    clauses.  It is very similar to the in depend-kind in that
    a task with a dependency with that depend-kind is dependent
    on all previously created sibling tasks with matching address
    unless they have the same depend-kind.
    In the in depend-kind case everything is dependent except
    for in -> in dependency, for inoutset everything is
    dependent except for inoutset -> inoutset dependency.
    mutexinoutset is also similar (everything is dependent except
    for mutexinoutset -> mutexinoutset dependency), but there is
    also the additional restriction that only one task with
    mutexinoutset for each address can be scheduled at once (i.e.
    mutual exclusitivty).  For now we support mutexinoutset
    the same as inout/out, but the inoutset support is full.
    
    In order not to bump the ABI for dependencies each time
    (we've bumped it already once, the old ABI supports only
    inout/out and in depend-kind, the new ABI supports
    inout/out, mutexinoutset, in and depobj), this patch arranges
    for inoutset to be at least for the time being always handled
    as if it was specified through depobj even when it is not.
    So it uses the new ABI for that and inoutset are represented
    like depobj - pointer to a pair of pointers where the first one
    will be the actual address of the object mentioned in depend
    clause and second pointer will be (void *) GOMP_DEPEND_INOUTSET.
    
    2022-05-17  Jakub Jelinek  <jakub@redhat.com>
    
    gcc/
    	* tree-core.h (enum omp_clause_depend_kind): Add
    	OMP_CLAUSE_DEPEND_INOUTSET.
    	* tree-pretty-print.cc (dump_omp_clause): Handle
    	OMP_CLAUSE_DEPEND_INOUTSET.
    	* gimplify.cc (gimplify_omp_depend): Likewise.
    	* omp-low.cc (lower_depend_clauses): Likewise.
    gcc/c-family/
    	* c-omp.cc (c_finish_omp_depobj): Handle
    	OMP_CLAUSE_DEPEND_INOUTSET.
    gcc/c/
    	* c-parser.cc (c_parser_omp_clause_depend): Parse
    	inoutset depend-kind.
    	(c_parser_omp_depobj): Likewise.
    gcc/cp/
    	* parser.cc (cp_parser_omp_clause_depend): Parse
    	inoutset depend-kind.
    	(cp_parser_omp_depobj): Likewise.
    	* cxx-pretty-print.cc (cxx_pretty_printer::statement): Handle
    	OMP_CLAUSE_DEPEND_INOUTSET.
    gcc/testsuite/
    	* c-c++-common/gomp/all-memory-1.c (boo): Add test with
    	inoutset depend-kind.
    	* c-c++-common/gomp/all-memory-2.c (boo): Likewise.
    	* c-c++-common/gomp/depobj-1.c (f1): Likewise.
    	(f2): Adjusted expected diagnostics.
    	* g++.dg/gomp/depobj-1.C (f4): Adjust expected diagnostics.
    include/
    	* gomp-constants.h (GOMP_DEPEND_INOUTSET): Define.
    libgomp/
    	* libgomp.h (struct gomp_task_depend_entry): Change is_in type
    	from bool to unsigned char.
    	* task.c (gomp_task_handle_depend): Handle GOMP_DEPEND_INOUTSET.
    	Ignore dependencies where
    	task->depend[i].is_in && task->depend[i].is_in == ent->is_in
    	rather than just task->depend[i].is_in && ent->is_in.  Remember
    	whether GOMP_DEPEND_IN loop is needed and guard the loop with that
    	conditional.
    	(gomp_task_maybe_wait_for_dependencies): Handle GOMP_DEPEND_INOUTSET.
    	Ignore dependencies where elem.is_in && elem.is_in == ent->is_in
    	rather than just elem.is_in && ent->is_in.
    	* testsuite/libgomp.c-c++-common/depend-1.c (test): Add task with
    	inoutset depend-kind.
    	* testsuite/libgomp.c-c++-common/depend-2.c (test): Likewise.
    	* testsuite/libgomp.c-c++-common/depend-3.c (test): Likewise.
    	* testsuite/libgomp.c-c++-common/depend-inoutset-1.c: New test.
    2c16eb31
    History
    openmp: Add support for inoutset depend-kind
    Jakub Jelinek authored
    This patch adds support for inoutset depend-kind in depend
    clauses.  It is very similar to the in depend-kind in that
    a task with a dependency with that depend-kind is dependent
    on all previously created sibling tasks with matching address
    unless they have the same depend-kind.
    In the in depend-kind case everything is dependent except
    for in -> in dependency, for inoutset everything is
    dependent except for inoutset -> inoutset dependency.
    mutexinoutset is also similar (everything is dependent except
    for mutexinoutset -> mutexinoutset dependency), but there is
    also the additional restriction that only one task with
    mutexinoutset for each address can be scheduled at once (i.e.
    mutual exclusitivty).  For now we support mutexinoutset
    the same as inout/out, but the inoutset support is full.
    
    In order not to bump the ABI for dependencies each time
    (we've bumped it already once, the old ABI supports only
    inout/out and in depend-kind, the new ABI supports
    inout/out, mutexinoutset, in and depobj), this patch arranges
    for inoutset to be at least for the time being always handled
    as if it was specified through depobj even when it is not.
    So it uses the new ABI for that and inoutset are represented
    like depobj - pointer to a pair of pointers where the first one
    will be the actual address of the object mentioned in depend
    clause and second pointer will be (void *) GOMP_DEPEND_INOUTSET.
    
    2022-05-17  Jakub Jelinek  <jakub@redhat.com>
    
    gcc/
    	* tree-core.h (enum omp_clause_depend_kind): Add
    	OMP_CLAUSE_DEPEND_INOUTSET.
    	* tree-pretty-print.cc (dump_omp_clause): Handle
    	OMP_CLAUSE_DEPEND_INOUTSET.
    	* gimplify.cc (gimplify_omp_depend): Likewise.
    	* omp-low.cc (lower_depend_clauses): Likewise.
    gcc/c-family/
    	* c-omp.cc (c_finish_omp_depobj): Handle
    	OMP_CLAUSE_DEPEND_INOUTSET.
    gcc/c/
    	* c-parser.cc (c_parser_omp_clause_depend): Parse
    	inoutset depend-kind.
    	(c_parser_omp_depobj): Likewise.
    gcc/cp/
    	* parser.cc (cp_parser_omp_clause_depend): Parse
    	inoutset depend-kind.
    	(cp_parser_omp_depobj): Likewise.
    	* cxx-pretty-print.cc (cxx_pretty_printer::statement): Handle
    	OMP_CLAUSE_DEPEND_INOUTSET.
    gcc/testsuite/
    	* c-c++-common/gomp/all-memory-1.c (boo): Add test with
    	inoutset depend-kind.
    	* c-c++-common/gomp/all-memory-2.c (boo): Likewise.
    	* c-c++-common/gomp/depobj-1.c (f1): Likewise.
    	(f2): Adjusted expected diagnostics.
    	* g++.dg/gomp/depobj-1.C (f4): Adjust expected diagnostics.
    include/
    	* gomp-constants.h (GOMP_DEPEND_INOUTSET): Define.
    libgomp/
    	* libgomp.h (struct gomp_task_depend_entry): Change is_in type
    	from bool to unsigned char.
    	* task.c (gomp_task_handle_depend): Handle GOMP_DEPEND_INOUTSET.
    	Ignore dependencies where
    	task->depend[i].is_in && task->depend[i].is_in == ent->is_in
    	rather than just task->depend[i].is_in && ent->is_in.  Remember
    	whether GOMP_DEPEND_IN loop is needed and guard the loop with that
    	conditional.
    	(gomp_task_maybe_wait_for_dependencies): Handle GOMP_DEPEND_INOUTSET.
    	Ignore dependencies where elem.is_in && elem.is_in == ent->is_in
    	rather than just elem.is_in && ent->is_in.
    	* testsuite/libgomp.c-c++-common/depend-1.c (test): Add task with
    	inoutset depend-kind.
    	* testsuite/libgomp.c-c++-common/depend-2.c (test): Likewise.
    	* testsuite/libgomp.c-c++-common/depend-3.c (test): Likewise.
    	* testsuite/libgomp.c-c++-common/depend-inoutset-1.c: New test.