https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106548

--- Comment #2 from Tobias Burnus <burnus at gcc dot gnu.org> ---
The problem is the following code in omp-low.c:

            do_firstprivate:
              lower_private_allocate (var, new_var, allocator, allocate_ptr,
                                      ilist, ctx, false, NULL_TREE);
              x = build_outer_var_ref (var, ctx);
              if (is_simd)
                {
                  if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
                      && gimple_omp_for_combined_into_p (ctx->stmt))
                    {
                      tree t = OMP_CLAUSE_LINEAR_STEP (c);

where the clause ('c') is
 <omp_clause 0x7ffff71432d0 linear
    op-0: <parm_decl 0x7ffff7ffb100 i>  ( == var)
    op-1: <parm_decl 0x7ffff7ffb180 k>

and 't' is
  <parm_decl 0x7ffff7ffb180 k


I think something like the following is needed:

diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -6190,2 +6190,6 @@ lower_rec_input_clausesgimple_seq *dlist,
                      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);
                      tree stept = TREE_TYPE (t);

Reply via email to