diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-07-15 16:34:54 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-07-15 16:45:02 +0200 |
commit | 79c12969ec3e9185fdbb90d3b1699d64b1cd0901 (patch) | |
tree | aec0feded362940cca6749ea627409f3e9fcc89f /gcc/omp-general.c | |
parent | 765fbbf9bb398560f45987ea9858dfaaefff5ce0 (diff) | |
download | gcc-79c12969ec3e9185fdbb90d3b1699d64b1cd0901.zip gcc-79c12969ec3e9185fdbb90d3b1699d64b1cd0901.tar.gz gcc-79c12969ec3e9185fdbb90d3b1699d64b1cd0901.tar.bz2 |
openmp: Fix up loop-21.c
I've missed
+FAIL: libgomp.c/loop-21.c execution test
during testing of the recent patch. The problem is that while
for the number of iterations computation it doesn't matter if we compute
min_inner_iterations as (m2 * first + n2 + (adjusted step) + m1 * first + n1) / step
or (m2 * last + n2 + (adjusted step) + m1 * last + n1) / step provided that
in the second case we use as factor (m1 - m2) * ostep / step rather than
(m2 - m1) * ostep / step, for the logical to actual iterator values computation
it does matter and in my hand written C implementations of all the cases (outer
vs. inner loop with increasing vs. decreasing iterator) I'm using the same computation
and it worked well for all the pseudo-random iterators testing it was doing.
It also means min_inner_iterations is misnamed, because it is not really
minimum number of inner iterations, whether the first or last outer iteration
results in the smaller or larger value of this can be (sometimes) only
determined at runtime.
So this patch also renames it to first_inner_iterations.
2020-07-15 Jakub Jelinek <jakub@redhat.com>
PR libgomp/96198
* omp-general.h (struct omp_for_data): Rename min_inner_iterations
member to first_inner_iterations, adjust comment.
* omp-general.c (omp_extract_for_data): Adjust for the above change.
Always use n1first and n2first to compute it, rather than depending
on single_nonrect_cond_code. Similarly, always compute factor
as (m2 - m1) * outer_step / inner_step rather than sometimes m1 - m2
depending on single_nonrect_cond_code.
* omp-expand.c (expand_omp_for_init_vars): Rename min_inner_iterations
to first_inner_iterations and min_inner_iterationsd to
first_inner_iterationsd.
Diffstat (limited to 'gcc/omp-general.c')
-rw-r--r-- | gcc/omp-general.c | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/gcc/omp-general.c b/gcc/omp-general.c index b2ce408..c539038 100644 --- a/gcc/omp-general.c +++ b/gcc/omp-general.c @@ -212,7 +212,7 @@ omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, fd->sched_modifiers = 0; fd->chunk_size = NULL_TREE; fd->simd_schedule = false; - fd->min_inner_iterations = NULL_TREE; + fd->first_inner_iterations = NULL_TREE; fd->factor = NULL_TREE; fd->adjn1 = NULL_TREE; collapse_iter = NULL; @@ -726,16 +726,8 @@ omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, if (loop->m1 || loop->m2) { gcc_assert (single_nonrect != -1); - if (single_nonrect_cond_code == LT_EXPR) - { - n1 = n1first; - n2 = n2first; - } - else - { - n1 = n1last; - n2 = n2last; - } + n1 = n1first; + n2 = n2first; } t = fold_build2 (PLUS_EXPR, itype, t, fold_convert (itype, n2)); t = fold_build2 (MINUS_EXPR, itype, t, fold_convert (itype, n1)); @@ -754,8 +746,6 @@ omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, or last value of the outer iterator (the one with fewer iterations). Compute t2 = ((m2 - m1) * ostep) / step - (for single_nonrect_cond_code GT_EXPR - t2 = ((m1 - m2) * ostep) / step instead) and niters = outer_count * t + t2 * ((outer_count - 1) * outer_count / 2) */ @@ -763,11 +753,7 @@ omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, tree m2 = loop->m2 ? loop->m2 : integer_zero_node; m1 = fold_convert (itype, m1); m2 = fold_convert (itype, m2); - tree t2; - if (single_nonrect_cond_code == LT_EXPR) - t2 = fold_build2 (MINUS_EXPR, itype, m2, m1); - else - t2 = fold_build2 (MINUS_EXPR, itype, m1, m2); + tree t2 = fold_build2 (MINUS_EXPR, itype, m2, m1); t2 = fold_build2 (MULT_EXPR, itype, t2, ostep); if (TYPE_UNSIGNED (itype) && loop->cond_code == GT_EXPR) t2 = fold_build2 (TRUNC_DIV_EXPR, itype, @@ -776,7 +762,7 @@ omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, else t2 = fold_build2 (TRUNC_DIV_EXPR, itype, t2, step); t2 = fold_convert (llutype, t2); - fd->min_inner_iterations = t; + fd->first_inner_iterations = t; fd->factor = t2; t = fold_build2 (MULT_EXPR, llutype, t, single_nonrect_count); @@ -834,11 +820,11 @@ omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, if (count) { *collapse_count = fold_convert_loc (loc, iter_type, count); - if (fd->min_inner_iterations && fd->factor) + if (fd->first_inner_iterations && fd->factor) { t = make_tree_vec (4); TREE_VEC_ELT (t, 0) = *collapse_count; - TREE_VEC_ELT (t, 1) = fd->min_inner_iterations; + TREE_VEC_ELT (t, 1) = fd->first_inner_iterations; TREE_VEC_ELT (t, 2) = fd->factor; TREE_VEC_ELT (t, 3) = fd->adjn1; *collapse_count = t; @@ -856,7 +842,7 @@ omp_extract_for_data (gomp_for *for_stmt, struct omp_for_data *fd, if (TREE_CODE (fd->loop.n2) == TREE_VEC) { gcc_assert (fd->non_rect); - fd->min_inner_iterations = TREE_VEC_ELT (fd->loop.n2, 1); + fd->first_inner_iterations = TREE_VEC_ELT (fd->loop.n2, 1); fd->factor = TREE_VEC_ELT (fd->loop.n2, 2); fd->adjn1 = TREE_VEC_ELT (fd->loop.n2, 3); fd->loop.n2 = TREE_VEC_ELT (fd->loop.n2, 0); |