Skip to content
Snippets Groups Projects
  • Jakub Jelinek's avatar
    7f78783d
    openmp: Add omp_all_memory support (C/C++ only so far) · 7f78783d
    Jakub Jelinek authored
    The ugly part is that OpenMP 5.1 made omp_all_memory a reserved identifier
    which isn't allowed to be used anywhere but in the depend clause, this is
    against how everything else has been handled in OpenMP so far (where
    some identifiers could have special meaning in some OpenMP clauses or
    pragmas but not elsewhere).
    The patch handles it by making it a conditional keyword (for -fopenmp
    only) and emitting a better diagnostics when it is used in a primary
    expression.  Having a nicer diagnostics when e.g. trying to do
    int omp_all_memory;
    or
    int *omp_all_memory[10];
    etc. would mean changing too many spots and hooking into name lookups
    to reject declaring any such symbols would be too ugly and I'm afraid
    there are way too many spots where one can introduce a name
    (variables, functions, namespaces, struct, enum, enumerators, template
    arguments, ...).
    
    Otherwise, the handling is quite simple, normal depend clauses lower
    into addresses of variables being handed over to the library, for
    omp_all_memory I'm using NULL pointers.  omp_all_memory can only be
    used with inout or out depend kinds and means that a task is dependent
    on all previously created sibling tasks that have any dependency (of
    any depend kind) and that any later created sibling tasks will be
    dependent on it if they have any dependency.
    
    2022-05-12  Jakub Jelinek  <jakub@redhat.com>
    
    gcc/
    	* gimplify.cc (gimplify_omp_depend): Don't build_fold_addr_expr
    	if null_pointer_node.
    	(gimplify_scan_omp_clauses): Likewise.
    	* tree-pretty-print.cc (dump_omp_clause): Print null_pointer_node
    	as omp_all_memory.
    gcc/c-family/
    	* c-common.h (enum rid): Add RID_OMP_ALL_MEMORY.
    	* c-omp.cc (c_finish_omp_depobj): Don't build_fold_addr_expr
    	if null_pointer_node.
    gcc/c/
    	* c-parser.cc (c_parse_init): Register omp_all_memory as keyword
    	if flag_openmp.
    	(c_parser_postfix_expression): Diagnose uses of omp_all_memory
    	in postfix expressions.
    	(c_parser_omp_variable_list): Handle omp_all_memory in depend
    	clause.
    	* c-typeck.cc (c_finish_omp_clauses): Handle omp_all_memory
    	keyword in depend clause as null_pointer_node, diagnose invalid
    	uses.
    gcc/cp/
    	* lex.cc (init_reswords): Register omp_all_memory as keyword
    	if flag_openmp.
    	* parser.cc (cp_parser_primary_expression): Diagnose uses of
    	omp_all_memory in postfix expressions.
    	(cp_parser_omp_var_list_no_open): Handle omp_all_memory in depend
    	clause.
    	* semantics.cc (finish_omp_clauses): Handle omp_all_memory
    	keyword in depend clause as null_pointer_node, diagnose invalid
    	uses.
    	* pt.cc (tsubst_omp_clause_decl): Pass through omp_all_memory.
    gcc/testsuite/
    	* c-c++-common/gomp/all-memory-1.c: New test.
    	* c-c++-common/gomp/all-memory-2.c: New test.
    	* c-c++-common/gomp/all-memory-3.c: New test.
    	* g++.dg/gomp/all-memory-1.C: New test.
    	* g++.dg/gomp/all-memory-2.C: New test.
    libgomp/
    	* libgomp.h (struct gomp_task): Add depend_all_memory member.
    	* task.c (gomp_init_task): Initialize depend_all_memory.
    	(gomp_task_handle_depend): Handle omp_all_memory.
    	(gomp_task_run_post_handle_depend_hash): Clear
    	parent->depend_all_memory if equal to current task.
    	(gomp_task_maybe_wait_for_dependencies): Handle omp_all_memory.
    	* testsuite/libgomp.c-c++-common/depend-1.c: New test.
    	* testsuite/libgomp.c-c++-common/depend-2.c: New test.
    	* testsuite/libgomp.c-c++-common/depend-3.c: New test.
    7f78783d
    History
    openmp: Add omp_all_memory support (C/C++ only so far)
    Jakub Jelinek authored
    The ugly part is that OpenMP 5.1 made omp_all_memory a reserved identifier
    which isn't allowed to be used anywhere but in the depend clause, this is
    against how everything else has been handled in OpenMP so far (where
    some identifiers could have special meaning in some OpenMP clauses or
    pragmas but not elsewhere).
    The patch handles it by making it a conditional keyword (for -fopenmp
    only) and emitting a better diagnostics when it is used in a primary
    expression.  Having a nicer diagnostics when e.g. trying to do
    int omp_all_memory;
    or
    int *omp_all_memory[10];
    etc. would mean changing too many spots and hooking into name lookups
    to reject declaring any such symbols would be too ugly and I'm afraid
    there are way too many spots where one can introduce a name
    (variables, functions, namespaces, struct, enum, enumerators, template
    arguments, ...).
    
    Otherwise, the handling is quite simple, normal depend clauses lower
    into addresses of variables being handed over to the library, for
    omp_all_memory I'm using NULL pointers.  omp_all_memory can only be
    used with inout or out depend kinds and means that a task is dependent
    on all previously created sibling tasks that have any dependency (of
    any depend kind) and that any later created sibling tasks will be
    dependent on it if they have any dependency.
    
    2022-05-12  Jakub Jelinek  <jakub@redhat.com>
    
    gcc/
    	* gimplify.cc (gimplify_omp_depend): Don't build_fold_addr_expr
    	if null_pointer_node.
    	(gimplify_scan_omp_clauses): Likewise.
    	* tree-pretty-print.cc (dump_omp_clause): Print null_pointer_node
    	as omp_all_memory.
    gcc/c-family/
    	* c-common.h (enum rid): Add RID_OMP_ALL_MEMORY.
    	* c-omp.cc (c_finish_omp_depobj): Don't build_fold_addr_expr
    	if null_pointer_node.
    gcc/c/
    	* c-parser.cc (c_parse_init): Register omp_all_memory as keyword
    	if flag_openmp.
    	(c_parser_postfix_expression): Diagnose uses of omp_all_memory
    	in postfix expressions.
    	(c_parser_omp_variable_list): Handle omp_all_memory in depend
    	clause.
    	* c-typeck.cc (c_finish_omp_clauses): Handle omp_all_memory
    	keyword in depend clause as null_pointer_node, diagnose invalid
    	uses.
    gcc/cp/
    	* lex.cc (init_reswords): Register omp_all_memory as keyword
    	if flag_openmp.
    	* parser.cc (cp_parser_primary_expression): Diagnose uses of
    	omp_all_memory in postfix expressions.
    	(cp_parser_omp_var_list_no_open): Handle omp_all_memory in depend
    	clause.
    	* semantics.cc (finish_omp_clauses): Handle omp_all_memory
    	keyword in depend clause as null_pointer_node, diagnose invalid
    	uses.
    	* pt.cc (tsubst_omp_clause_decl): Pass through omp_all_memory.
    gcc/testsuite/
    	* c-c++-common/gomp/all-memory-1.c: New test.
    	* c-c++-common/gomp/all-memory-2.c: New test.
    	* c-c++-common/gomp/all-memory-3.c: New test.
    	* g++.dg/gomp/all-memory-1.C: New test.
    	* g++.dg/gomp/all-memory-2.C: New test.
    libgomp/
    	* libgomp.h (struct gomp_task): Add depend_all_memory member.
    	* task.c (gomp_init_task): Initialize depend_all_memory.
    	(gomp_task_handle_depend): Handle omp_all_memory.
    	(gomp_task_run_post_handle_depend_hash): Clear
    	parent->depend_all_memory if equal to current task.
    	(gomp_task_maybe_wait_for_dependencies): Handle omp_all_memory.
    	* testsuite/libgomp.c-c++-common/depend-1.c: New test.
    	* testsuite/libgomp.c-c++-common/depend-2.c: New test.
    	* testsuite/libgomp.c-c++-common/depend-3.c: New test.