mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
This adds preliminary support for iterators in map clauses within OpenMP 'target' constructs (which includes constructs such as 'target enter data'). Iterators with non-constant loop bounds are not currently supported. gcc/c/ * c-parser.cc (c_parser_omp_variable_list): Use location of the map expression as the clause location. (c_parser_omp_clause_map): Parse 'iterator' modifier. * c-typeck.cc (c_finish_omp_clauses): Finish iterators. Apply iterators to generated clauses. gcc/cp/ * parser.cc (cp_parser_omp_clause_map): Parse 'iterator' modifier. * semantics.cc (finish_omp_clauses): Finish iterators. Apply iterators to generated clauses. gcc/ * gimple-pretty-print.cc (dump_gimple_omp_target): Print expanded iterator loops. * gimple.cc (gimple_build_omp_target): Add argument for iterator loops sequence. Initialize iterator loops field. * gimple.def (GIMPLE_OMP_TARGET): Set GSS symbol to GSS_OMP_TARGET. * gimple.h (gomp_target): Set GSS symbol to GSS_OMP_TARGET. Add extra field for iterator loops. (gimple_build_omp_target): Add argument for iterator loops sequence. (gimple_omp_target_iterator_loops): New. (gimple_omp_target_iterator_loops_ptr): New. (gimple_omp_target_set_iterator_loops): New. * gimplify.cc (find_var_decl): New. (copy_omp_iterator): New. (remap_omp_iterator_var_1): New. (remap_omp_iterator_var): New. (remove_unused_omp_iterator_vars): New. (struct iterator_loop_info_t): New type. (iterator_loop_info_map_t): New type. (build_omp_iterators_loops): New. (enter_omp_iterator_loop_context_1): New. (enter_omp_iterator_loop_context): New. (enter_omp_iterator_loop_context): New. (exit_omp_iterator_loop_context): New. (gimplify_adjust_omp_clauses): Add argument for iterator loop sequence. Gimplify the clause decl and size into the iterator loop if iterators are used. (gimplify_omp_workshare): Call remove_unused_omp_iterator_vars and build_omp_iterators_loops for OpenMP target expressions. Add loop sequence as argument when calling gimplify_adjust_omp_clauses and building the Gimple statement. * gimplify.h (enter_omp_iterator_loop_context): New prototype. (exit_omp_iterator_loop_context): New prototype. * gsstruct.def (GSS_OMP_TARGET): New. * omp-low.cc (lower_omp_map_iterator_expr): New. (lower_omp_map_iterator_size): New. (finish_omp_map_iterators): New. (lower_omp_target): Add sorry if iterators used with deep mapping. Call lower_omp_map_iterator_expr before assigning to sender ref. Call lower_omp_map_iterator_size before setting the size. Insert iterator loop sequence before the statements for the target clause. * tree-nested.cc (convert_nonlocal_reference_stmt): Walk the iterator loop sequence of OpenMP target statements. (convert_local_reference_stmt): Likewise. (convert_tramp_reference_stmt): Likewise. * tree-pretty-print.cc (dump_omp_iterators): Dump extra iterator information if present. (dump_omp_clause): Call dump_omp_iterators for iterators in map clauses. * tree.cc (omp_clause_num_ops): Add operand for OMP_CLAUSE_MAP. (walk_tree_1): Do not walk last operand of OMP_CLAUSE_MAP. * tree.h (OMP_CLAUSE_HAS_ITERATORS): New. (OMP_CLAUSE_ITERATORS): New. gcc/testsuite/ * c-c++-common/gomp/map-6.c (foo): Amend expected error message. * c-c++-common/gomp/target-map-iterators-1.c: New. * c-c++-common/gomp/target-map-iterators-2.c: New. * c-c++-common/gomp/target-map-iterators-3.c: New. * c-c++-common/gomp/target-map-iterators-4.c: New. libgomp/ * target.c (kind_to_name): New. (gomp_merge_iterator_maps): New. (gomp_map_vars_internal): Call gomp_merge_iterator_maps. Copy address of only the first iteration to target vars. Free allocated variables. * testsuite/libgomp.c-c++-common/target-map-iterators-1.c: New. * testsuite/libgomp.c-c++-common/target-map-iterators-2.c: New. * testsuite/libgomp.c-c++-common/target-map-iterators-3.c: New. Co-authored-by: Andrew Stubbs <ams@baylibre.com>
98 lines
3.7 KiB
C
98 lines
3.7 KiB
C
/* Header file for gimplification.
|
|
Copyright (C) 2013-2025 Free Software Foundation, Inc.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GCC; see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef GCC_GIMPLIFY_H
|
|
#define GCC_GIMPLIFY_H
|
|
|
|
/* Validation of GIMPLE expressions. Note that these predicates only check
|
|
the basic form of the expression, they don't recurse to make sure that
|
|
underlying nodes are also of the right form. */
|
|
typedef bool (*gimple_predicate)(tree);
|
|
|
|
/* FIXME we should deduce this from the predicate. */
|
|
enum fallback {
|
|
fb_none = 0, /* Do not generate a temporary. */
|
|
|
|
fb_rvalue = 1, /* Generate an rvalue to hold the result of a
|
|
gimplified expression. */
|
|
|
|
fb_lvalue = 2, /* Generate an lvalue to hold the result of a
|
|
gimplified expression. */
|
|
|
|
fb_mayfail = 4, /* Gimplification may fail. Error issued
|
|
afterwards. */
|
|
fb_either= fb_rvalue | fb_lvalue
|
|
};
|
|
|
|
typedef int fallback_t;
|
|
|
|
enum gimplify_status {
|
|
GS_ERROR = -2, /* Something Bad Seen. */
|
|
GS_UNHANDLED = -1, /* A langhook result for "I dunno". */
|
|
GS_OK = 0, /* We did something, maybe more to do. */
|
|
GS_ALL_DONE = 1 /* The expression is fully gimplified. */
|
|
};
|
|
|
|
extern void free_gimplify_stack (void);
|
|
extern void push_gimplify_context (bool in_ssa = false,
|
|
bool rhs_cond_ok = false);
|
|
extern void pop_gimplify_context (gimple *);
|
|
extern gbind *gimple_current_bind_expr (void);
|
|
extern vec<gbind *> gimple_bind_expr_stack (void);
|
|
extern void gimplify_and_add (tree, gimple_seq *);
|
|
extern tree get_formal_tmp_var (tree, gimple_seq *);
|
|
extern tree get_initialized_tmp_var (tree, gimple_seq *, gimple_seq * = NULL,
|
|
bool = true);
|
|
extern void declare_vars (tree, gimple *, bool);
|
|
extern void gimple_add_tmp_var (tree);
|
|
extern void gimple_add_tmp_var_fn (struct function *, tree);
|
|
extern void copy_if_shared (tree *, void * = NULL);
|
|
extern tree unshare_expr (tree);
|
|
extern tree unshare_expr_without_location (tree);
|
|
extern tree voidify_wrapper_expr (tree, tree);
|
|
extern tree build_and_jump (tree *);
|
|
extern enum gimplify_status gimplify_self_mod_expr (tree *, gimple_seq *,
|
|
gimple_seq *, bool, tree);
|
|
extern tree gimple_boolify (tree);
|
|
extern gimple_predicate rhs_predicate_for (tree);
|
|
extern bool gimplify_stmt (tree *, gimple_seq *);
|
|
extern void omp_firstprivatize_variable (struct gimplify_omp_ctx *, tree);
|
|
extern enum gimplify_status gimplify_expr (tree *, gimple_seq *, gimple_seq *,
|
|
bool (*) (tree), fallback_t);
|
|
|
|
extern tree omp_get_construct_context (void);
|
|
int omp_has_novariants (void);
|
|
|
|
extern gimple_seq *enter_omp_iterator_loop_context (tree, gomp_target *,
|
|
gimple_seq * = NULL);
|
|
extern void exit_omp_iterator_loop_context (tree);
|
|
|
|
extern void gimplify_type_sizes (tree, gimple_seq *);
|
|
extern void gimplify_one_sizepos (tree *, gimple_seq *);
|
|
extern gbind *gimplify_body (tree, bool);
|
|
extern enum gimplify_status gimplify_arg (tree *, gimple_seq *, location_t,
|
|
bool = true);
|
|
extern void gimplify_function_tree (tree);
|
|
extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *,
|
|
gimple_seq *);
|
|
extern bool generic_expr_could_trap_p (tree expr);
|
|
gimple *gimplify_assign (tree, tree, gimple_seq *);
|
|
|
|
#endif /* GCC_GIMPLIFY_H */
|