diff options
author | Kwok Cheung Yeung <kcy@codesourcery.com> | 2021-03-01 14:15:30 -0800 |
---|---|---|
committer | Sandra Loosemore <sloosemore@baylibre.com> | 2025-05-15 20:25:46 +0000 |
commit | 81d73ad786759aadd926273e8ddd4adc7e6015bc (patch) | |
tree | ae4086affe064603d1c21d8fb378642c99f4e3f2 /gcc | |
parent | 48db8148b94ab2d93d9d5301f44950adf2a9c786 (diff) | |
download | gcc-81d73ad786759aadd926273e8ddd4adc7e6015bc.zip gcc-81d73ad786759aadd926273e8ddd4adc7e6015bc.tar.gz gcc-81d73ad786759aadd926273e8ddd4adc7e6015bc.tar.bz2 |
openmp: Scale type precision of collapsed iterator variable
This sets the type precision of the collapsed iterator variable to the
sum of the precision of the collapsed loop variables, up to a maximum of
sizeof(long long) (i.e. 64-bits).
gcc/ChangeLog
* omp-expand.cc (expand_oacc_for): Convert .tile variable to
diff_type before multiplying.
* omp-general.cc (omp_extract_for_data): Use accumulated precision
of all collapsed for-loops as precision of iteration variable, up
to the precision of a long long.
libgomp/ChangeLog
* testsuite/libgomp.c-c++-common/collapse-4.c: New.
* testsuite/libgomp.fortran/collapse5.f90: New.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/omp-expand.cc | 5 | ||||
-rw-r--r-- | gcc/omp-general.cc | 39 |
2 files changed, 31 insertions, 13 deletions
diff --git a/gcc/omp-expand.cc b/gcc/omp-expand.cc index 2414dd5..0ed943d 100644 --- a/gcc/omp-expand.cc +++ b/gcc/omp-expand.cc @@ -7814,7 +7814,10 @@ expand_oacc_for (struct omp_region *region, struct omp_for_data *fd) tile_size = create_tmp_var (diff_type, ".tile_size"); expr = build_int_cst (diff_type, 1); for (int ix = 0; ix < fd->collapse; ix++) - expr = fold_build2 (MULT_EXPR, diff_type, counts[ix].tile, expr); + { + tree tile = fold_convert (diff_type, counts[ix].tile); + expr = fold_build2 (MULT_EXPR, diff_type, tile, expr); + } expr = force_gimple_operand_gsi (&gsi, expr, true, NULL_TREE, true, GSI_SAME_STMT); ass = gimple_build_assign (tile_size, expr); diff --git a/gcc/omp-general.cc b/gcc/omp-general.cc index 0b7c3b9..e4d1425 100644 --- a/gcc/omp-general.cc +++ b/gcc/omp-general.cc @@ -406,6 +406,7 @@ omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, fd->non_rect = true; } } + int accum_iter_precision = 0; for (i = 0; i < cnt; i++) { if (i == 0 @@ -489,19 +490,33 @@ omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, { if (fd->collapse == 1 && !fd->tiling) iter_type = TREE_TYPE (loop->v); - else if (i == 0 - || TYPE_PRECISION (iter_type) - < TYPE_PRECISION (TREE_TYPE (loop->v))) + else { - if (TREE_CODE (iter_type) == BITINT_TYPE - || TREE_CODE (TREE_TYPE (loop->v)) == BITINT_TYPE) - iter_type - = build_bitint_type (TYPE_PRECISION (TREE_TYPE (loop->v)), - 1); - else - iter_type - = build_nonstandard_integer_type - (TYPE_PRECISION (TREE_TYPE (loop->v)), 1); + int loop_precision = TYPE_PRECISION (TREE_TYPE (loop->v)); + int iter_type_precision = 0; + const int max_accum_precision + = TYPE_PRECISION (long_long_unsigned_type_node); + + accum_iter_precision += loop_precision; + + if (i == 0 + || (loop_precision >= max_accum_precision + && loop_precision >= TYPE_PRECISION (iter_type))) + iter_type_precision = loop_precision; + else if (TYPE_PRECISION (iter_type) < max_accum_precision) + iter_type_precision + = MIN (1 << ceil_log2 (accum_iter_precision), + max_accum_precision); + + if (iter_type_precision) + { + if (TREE_CODE (iter_type) == BITINT_TYPE + || TREE_CODE (TREE_TYPE (loop->v)) == BITINT_TYPE) + iter_type = build_bitint_type (iter_type_precision, 1); + else + iter_type + = build_nonstandard_integer_type (iter_type_precision, 1); + } } } else if (iter_type != long_long_unsigned_type_node) |