On Tue, Aug 16, 2022 at 05:28:40PM +0200, Tobias Burnus wrote:
> The testcase is just a copy of linear-1 with 'omp ... for' replaced by 'omp
> ... for simd',
> matching what the PR report referred to.
>
> The problem occurs for 'omp ... for simd linear( i : step)' when 'step' is a
> variable
> when a omp_fn... is generated - as in this case, the original variable is
> used (in the
> reduced example of the PR, the PARM_DECL of 'f') instead of the replacement.
>
> OK for mainline? Thoughts on backporting (and for which versions)?
>
> Tobias
> -----------------
> Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634
> München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas
> Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht
> München, HRB 106955
> OpenMP: Fix var replacement with 'simd' and linear-step vars [PR106548]
>
> gcc/ChangeLog:
>
> PR middle-end/106548
> * omp-low.cc (lower_rec_input_clauses): Use build_outer_var_ref
> for 'simd' linear-step values that are variable.
>
> libgomp/ChangeLog:
>
> PR middle-end/106548
> * testsuite/libgomp.c/linear-2.c: New test.
>
> diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
> index 3c4b8593c8b..d6d6ff372a1 100644
> --- a/gcc/omp-low.cc
> +++ b/gcc/omp-low.cc
> @@ -6188,6 +6188,10 @@ lower_rec_input_clauses (tree clauses, gimple_seq
> *ilist, gimple_seq *dlist,
> && gimple_omp_for_combined_into_p (ctx->stmt))
> {
> tree t = OMP_CLAUSE_LINEAR_STEP (c);
> + if (VAR_P (t)
> + || TREE_CODE (t) == PARM_DECL
> + || TREE_CODE (t) == RESULT_DECL)
> + t = build_outer_var_ref (t, ctx);
I think this should be just
if (DECL_P (t))
t = build_outer_var_ref (t, ctx);
Ok with that change.
With backports I'd wait a week or two (12.2 is frozen anyway), can be
applied to any open release branches you are willing to backport it to.
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.c/linear-2.c
> @@ -0,0 +1,251 @@
> +/* PR middle-end/106548. */
Usually simd related runtime tests in libgomp use something like
/* { dg-do run } */
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
/* { dg-additional-options "-mavx" { target avx_runtime } } */
to test some actual vectorization if possible.
Jakub