https://gcc.gnu.org/g:1adb0ccac34ca39b6539108bdaa0262256c842d5
commit 1adb0ccac34ca39b6539108bdaa0262256c842d5 Author: Kwok Cheung Yeung <kcye...@baylibre.com> Date: Thu Sep 12 21:33:58 2024 +0100 openmp: Disable strided target updates when iterators are used Non-contiguous target updates result in the new strided target updates code being used, resulting in new clauses such as GOMP_MAP_GRID_DIM, GOMP_MAP_GRID_STRIDE etc. These are not currently supported in conjunction with iterators, so this code-path is disabled when used together with iterators. The older target updates supports non-contiguous updates as long as a stride is not applied. gcc/c/ * c-typeck.cc (handle_omp_array_sections): Add extra argument. Set argument to true if array section has a stride that is not one. (c_finish_omp_clauses): Disable strided updates when iterators are used in the clause. Emit sorry if strided. gcc/cp/ * semantics.cc (handle_omp_array_sections): Add extra argument. Set argument to true if array section has a stride that is not one. (finish_omp_clauses): Disable strided updates when iterators are used in the clause. Emit sorry if strided. gcc/fortran/ * trans-openmp.cc (gfc_trans_omp_clauses): Disable strided updates when iterators are used in the clause. Diff: --- gcc/c/ChangeLog.omp | 7 +++++++ gcc/c/c-typeck.cc | 17 ++++++++++++++--- gcc/cp/ChangeLog.omp | 7 +++++++ gcc/cp/semantics.cc | 18 ++++++++++++++---- gcc/fortran/ChangeLog.omp | 5 +++++ gcc/fortran/trans-openmp.cc | 3 +++ 6 files changed, 50 insertions(+), 7 deletions(-) diff --git a/gcc/c/ChangeLog.omp b/gcc/c/ChangeLog.omp index af995a398571..80a771f50207 100644 --- a/gcc/c/ChangeLog.omp +++ b/gcc/c/ChangeLog.omp @@ -1,3 +1,10 @@ +2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> + + * c-typeck.cc (handle_omp_array_sections): Add extra argument. Set + argument to true if array section has a stride that is not one. + (c_finish_omp_clauses): Disable strided updates when iterators are + used in the clause. Emit sorry if strided. + 2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> * c-parser.cc (c_parser_omp_clause_from_to): Parse 'iterator' modifier. diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index e6ec927c6bc2..78272d582357 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -14597,7 +14597,7 @@ omp_array_section_low_bound (location_t loc, tree node) static bool handle_omp_array_sections (tree *pc, tree **pnext, enum c_omp_region_type ort, - int *discontiguous) + int *discontiguous, bool *strided = NULL) { tree c = *pc; bool maybe_zero_len = false; @@ -14686,6 +14686,8 @@ handle_omp_array_sections (tree *pc, tree **pnext, enum c_omp_region_type ort, if (stride == NULL_TREE) stride = size_one_node; + if (strided && !integer_onep (stride)) + *strided = true; if (discontiguous && *discontiguous) { /* This condition is similar to the error check below, but @@ -16214,13 +16216,22 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort) grp_sentinel = OMP_CLAUSE_CHAIN (c); tree *pnext = NULL; + /* FIXME: Strided target updates not supported together with + iterators yet. */ int discontiguous = (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO - || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM); - if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous)) + || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM) + && !OMP_CLAUSE_ITERATORS (c); + bool strided = false; + if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous, + &strided)) remove = true; else { + if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO + || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM) + && OMP_CLAUSE_ITERATORS (c) && strided) + sorry ("strided target updates with iterators"); c = *pc; t = OMP_CLAUSE_DECL (c); if (!omp_mappable_type (TREE_TYPE (t))) diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp index 80d2c3b5069e..95e2b32e60e3 100644 --- a/gcc/cp/ChangeLog.omp +++ b/gcc/cp/ChangeLog.omp @@ -1,3 +1,10 @@ +2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> + + * semantics.cc (handle_omp_array_sections): Add extra argument. Set + argument to true if array section has a stride that is not one. + (finish_omp_clauses): Disable strided updates when iterators are + used in the clause. Emit sorry if strided. + 2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> * parser.cc (cp_parser_omp_clause_from_to): Parse 'iterator' modifier. diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index dc102f15cf7c..e7c2e69e0e26 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -5993,7 +5993,7 @@ omp_array_section_low_bound (location_t loc, tree node) static bool handle_omp_array_sections (tree *pc, tree **pnext, enum c_omp_region_type ort, - int *discontiguous) + int *discontiguous, bool *strided = NULL) { tree c = *pc; bool maybe_zero_len = false; @@ -6087,6 +6087,8 @@ handle_omp_array_sections (tree *pc, tree **pnext, enum c_omp_region_type ort, if (stride == NULL_TREE) stride = size_one_node; + if (strided && !integer_onep (stride)) + *strided = true; if (discontiguous && *discontiguous) { /* This condition is similar to the error check below, but @@ -8976,15 +8978,23 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) { grp_start_p = pc; grp_sentinel = OMP_CLAUSE_CHAIN (c); - + /* FIXME: Strided target updates not supported together with + iterators yet. */ int discontiguous = (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO - || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM); + || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM) + && !OMP_CLAUSE_ITERATORS (c); + bool strided = false; tree *pnext = NULL; - if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous)) + if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous, + &strided)) remove = true; else { + if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO + || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM) + && OMP_CLAUSE_ITERATORS (c) && strided) + sorry ("strided target updates with iterators"); /* We might have replaced the clause, so refresh C. */ c = *pc; t = OMP_CLAUSE_DECL (c); diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp index ebbdf3d149e7..e1533c56b347 100644 --- a/gcc/fortran/ChangeLog.omp +++ b/gcc/fortran/ChangeLog.omp @@ -1,3 +1,8 @@ +2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> + + * trans-openmp.cc (gfc_trans_omp_clauses): Disable strided updates + when iterators are used in the clause. + 2025-04-17 Kwok Cheung Yeung <kcye...@baylibre.com> * dump-parse-tree.cc (show_omp_namelist): Add iterator support for diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc index 5d62ea396df3..8154e7850509 100644 --- a/gcc/fortran/trans-openmp.cc +++ b/gcc/fortran/trans-openmp.cc @@ -6465,7 +6465,10 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, if (ref->type == REF_COMPONENT || ref->type == REF_ARRAY) lastref = ref; + /* FIXME: Currently no support for strided target updates with + iterators. */ if ((list == OMP_LIST_TO || list == OMP_LIST_FROM) + && !iterator && (!n->expr || (lastref && lastref->type == REF_ARRAY)) && !gfc_omp_contiguous_update_p (n)) {