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

Reply via email to