1 /* General types and functions that are uselful for processing of OpenMP, 2 OpenACC and similar directivers at various stages of compilation. 3 4 Copyright (C) 2005-2018 Free Software Foundation, Inc. 5 6 This file is part of GCC. 7 8 GCC is free software; you can redistribute it and/or modify it under 9 the terms of the GNU General Public License as published by the Free 10 Software Foundation; either version 3, or (at your option) any later 11 version. 12 13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 14 WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16 for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GCC; see the file COPYING3. If not see 20 <http://www.gnu.org/licenses/>. */ 21 22 #ifndef GCC_OMP_GENERAL_H 23 #define GCC_OMP_GENERAL_H 24 25 #include "gomp-constants.h" 26 27 /* Flags for an OpenACC loop. */ 28 29 enum oacc_loop_flags { 30 OLF_SEQ = 1u << 0, /* Explicitly sequential */ 31 OLF_AUTO = 1u << 1, /* Compiler chooses axes. */ 32 OLF_INDEPENDENT = 1u << 2, /* Iterations are known independent. */ 33 OLF_GANG_STATIC = 1u << 3, /* Gang partitioning is static (has op). */ 34 OLF_TILE = 1u << 4, /* Tiled loop. */ 35 36 /* Explicitly specified loop axes. */ 37 OLF_DIM_BASE = 5, 38 OLF_DIM_GANG = 1u << (OLF_DIM_BASE + GOMP_DIM_GANG), 39 OLF_DIM_WORKER = 1u << (OLF_DIM_BASE + GOMP_DIM_WORKER), 40 OLF_DIM_VECTOR = 1u << (OLF_DIM_BASE + GOMP_DIM_VECTOR), 41 42 OLF_MAX = OLF_DIM_BASE + GOMP_DIM_MAX 43 }; 44 45 /* A structure holding the elements of: 46 for (V = N1; V cond N2; V += STEP) [...] */ 47 48 struct omp_for_data_loop 49 { 50 tree v, n1, n2, step; 51 enum tree_code cond_code; 52 }; 53 54 /* A structure describing the main elements of a parallel loop. */ 55 56 struct omp_for_data 57 { 58 struct omp_for_data_loop loop; 59 tree chunk_size; 60 gomp_for *for_stmt; 61 tree pre, iter_type; 62 tree tiling; /* Tiling values (if non null). */ 63 int collapse; /* Collapsed loops, 1 for a non-collapsed loop. */ 64 int ordered; 65 bool have_nowait, have_ordered, simd_schedule; 66 unsigned char sched_modifiers; 67 enum omp_clause_schedule_kind sched_kind; 68 struct omp_for_data_loop *loops; 69 }; 70 71 #define OACC_FN_ATTRIB "oacc function" 72 73 extern tree omp_find_clause (tree clauses, enum omp_clause_code kind); 74 extern bool omp_is_reference (tree decl); 75 extern void omp_adjust_for_condition (location_t loc, enum tree_code *cond_code, 76 tree *n2); 77 extern tree omp_get_for_step_from_incr (location_t loc, tree incr); 78 extern void omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, 79 struct omp_for_data_loop *loops); 80 extern gimple *omp_build_barrier (tree lhs); 81 extern poly_uint64 omp_max_vf (void); 82 extern int omp_max_simt_vf (void); 83 extern tree oacc_launch_pack (unsigned code, tree device, unsigned op); 84 extern void oacc_replace_fn_attrib (tree fn, tree dims); 85 extern void oacc_set_fn_attrib (tree fn, tree clauses, vec<tree> *args); 86 extern tree oacc_build_routine_dims (tree clauses); 87 extern tree oacc_get_fn_attrib (tree fn); 88 extern bool offloading_function_p (tree fn); 89 extern int oacc_get_fn_dim_size (tree fn, int axis); 90 extern int oacc_get_ifn_dim_arg (const gimple *stmt); 91 92 #endif /* GCC_OMP_GENERAL_H */ 93