Hi!

As the following testcase additions show, even the TYPE_MAX_VALUE var needs
to be forced into temporary if it is a user variable, otherwise if that
variable is changed by the user before taskgroup ends, we don't handle it
correctly.

In addition to that, this patch removes useless NULL second argument from
create_tmp_var, forgot we do have a default argument here.

Tested on x86_64-linux, committed to gomp-5_0-branch.

2018-10-09  Jakub Jelinek  <ja...@redhat.com>

        * omp-low.c (lower_omp_task_reductions): Force TYPE_MAX_VALUE into
        a temporary in the start sequence and even when it is a decl already.

        * omp-low.c (lower_rec_input_clauses, lower_reduction_clauses,
        lower_omp_task_reductions): Remove second argument create_tmp_var
        if it is NULL.
        * gimplify.c (gimplify_omp_depend): Likewise.

        * testsuite/libgomp.c-c++-common/task-reduction-5.c: Add further test
        to verify the array bound var can be changed in taskgroup.

--- gcc/omp-low.c.jj    2018-10-08 17:30:42.147353172 +0200
+++ gcc/omp-low.c       2018-10-09 14:19:54.672380754 +0200
@@ -4091,7 +4091,7 @@ lower_rec_input_clauses (tree clauses, g
                  gimple_seq_add_stmt (ilist, g);
                }
 
-             tree y1 = create_tmp_var (ptype, NULL);
+             tree y1 = create_tmp_var (ptype);
              gimplify_assign (y1, y, ilist);
              tree i2 = NULL_TREE, y2 = NULL_TREE;
              tree body2 = NULL_TREE, end2 = NULL_TREE;
@@ -4102,14 +4102,14 @@ lower_rec_input_clauses (tree clauses, g
                                     size_int (task_reduction_cnt_full
                                               + task_reduction_cntorig - 1),
                                     NULL_TREE, NULL_TREE);
-                 y3 = create_tmp_var (ptype, NULL);
+                 y3 = create_tmp_var (ptype);
                  gimplify_assign (y3, ref, ilist);
                }
              else if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) || is_simd)
                {
                  if (pass != 3)
                    {
-                     y2 = create_tmp_var (ptype, NULL);
+                     y2 = create_tmp_var (ptype);
                      gimplify_assign (y2, y, ilist);
                    }
                  if (is_simd || OMP_CLAUSE_REDUCTION_OMP_ORIG_REF (c))
@@ -4126,23 +4126,23 @@ lower_rec_input_clauses (tree clauses, g
                      if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)
                          && OMP_CLAUSE_REDUCTION_OMP_ORIG_REF (c))
                        {
-                         y3 = create_tmp_var (ptype, NULL);
+                         y3 = create_tmp_var (ptype);
                          gimplify_assign (y3, unshare_expr (ref), ilist);
                        }
                      if (is_simd)
                        {
-                         y4 = create_tmp_var (ptype, NULL);
+                         y4 = create_tmp_var (ptype);
                          gimplify_assign (y4, ref, dlist);
                        }
                    }
                }
-             tree i = create_tmp_var (TREE_TYPE (v), NULL);
+             tree i = create_tmp_var (TREE_TYPE (v));
              gimplify_assign (i, build_int_cst (TREE_TYPE (v), 0), ilist);
              tree body = create_artificial_label (UNKNOWN_LOCATION);
              gimple_seq_add_stmt (ilist, gimple_build_label (body));
              if (y2)
                {
-                 i2 = create_tmp_var (TREE_TYPE (v), NULL);
+                 i2 = create_tmp_var (TREE_TYPE (v));
                  gimplify_assign (i2, build_int_cst (TREE_TYPE (v), 0), dlist);
                  body2 = create_artificial_label (UNKNOWN_LOCATION);
                  end2 = create_artificial_label (UNKNOWN_LOCATION);
@@ -5603,7 +5603,7 @@ lower_reduction_clauses (tree clauses, g
          tree d = OMP_CLAUSE_DECL (c);
          tree type = TREE_TYPE (d);
          tree v = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
-         tree i = create_tmp_var (TREE_TYPE (v), NULL);
+         tree i = create_tmp_var (TREE_TYPE (v));
          tree ptype = build_pointer_type (TREE_TYPE (type));
          tree bias = TREE_OPERAND (d, 1);
          d = TREE_OPERAND (d, 0);
@@ -5667,10 +5667,10 @@ lower_reduction_clauses (tree clauses, g
            }
          new_var = fold_convert_loc (clause_loc, ptype, new_var);
          ref = fold_convert_loc (clause_loc, ptype, ref);
-         tree m = create_tmp_var (ptype, NULL);
+         tree m = create_tmp_var (ptype);
          gimplify_assign (m, new_var, stmt_seqp);
          new_var = m;
-         m = create_tmp_var (ptype, NULL);
+         m = create_tmp_var (ptype);
          gimplify_assign (m, ref, stmt_seqp);
          ref = m;
          gimplify_assign (i, build_int_cst (TREE_TYPE (v), 0), stmt_seqp);
@@ -6896,22 +6896,24 @@ lower_omp_task_reductions (omp_context *
            {
              tree type = TREE_TYPE (new_var);
              tree v = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
-             tree i = create_tmp_var (TREE_TYPE (v), NULL);
+             tree i = create_tmp_var (TREE_TYPE (v));
              tree ptype = build_pointer_type (TREE_TYPE (type));
              if (DECL_P (v))
                {
                  v = maybe_lookup_decl_in_outer_ctx (v, ctx);
-                 gimplify_expr (&v, end, NULL, is_gimple_val, fb_rvalue);
+                 tree vv = create_tmp_var (TREE_TYPE (v));
+                 gimplify_assign (vv, v, start);
+                 v = vv;
                }
              ref = build4 (ARRAY_REF, pointer_sized_int_node, avar,
                            size_int (7 + cnt * 3), NULL_TREE, NULL_TREE);
              new_var = build_fold_addr_expr (new_var);
              new_var = fold_convert (ptype, new_var);
              ref = fold_convert (ptype, ref);
-             tree m = create_tmp_var (ptype, NULL);
+             tree m = create_tmp_var (ptype);
              gimplify_assign (m, new_var, end);
              new_var = m;
-             m = create_tmp_var (ptype, NULL);
+             m = create_tmp_var (ptype);
              gimplify_assign (m, ref, end);
              ref = m;
              gimplify_assign (i, build_int_cst (TREE_TYPE (v), 0), end);
--- gcc/gimplify.c.jj   2018-08-02 17:59:48.980047042 +0200
+++ gcc/gimplify.c      2018-10-09 14:13:25.243928507 +0200
@@ -7736,7 +7736,7 @@ gimplify_omp_depend (tree *list_p, gimpl
          cnts[i] = cnts[i - 1];
          continue;
        }
-      cnts[i] = create_tmp_var (sizetype, NULL);
+      cnts[i] = create_tmp_var (sizetype);
       if (i == 0)
        g = gimple_build_assign (cnts[i], size_int (is_old ? 2 : 5));
       else
--- libgomp/testsuite/libgomp.c-c++-common/task-reduction-5.c.jj        
2018-10-08 17:22:33.200531039 +0200
+++ libgomp/testsuite/libgomp.c-c++-common/task-reduction-5.c   2018-10-09 
13:56:38.907851288 +0200
@@ -7,49 +7,58 @@ void abort (void);
 int *q;
 
 void
-bar (int *p, int *r, int s)
+bar (int *p, int *r, int *t, int s, __SIZE_TYPE__ u)
 {
-  #pragma omp task in_reduction (*: p[0], q[0], r[s - 1])
+  #pragma omp task in_reduction (*: p[0], q[0], r[s - 1], t[0:u + 1])
   {
     *p *= 4;
     *q *= 5;
     r[s - 1] *= 6;
+    t[0] *= 8;
+    t[1] *= 9;
   }
 }
 
 void
-foo (int *p, int *r, int s)
+foo (int *p, int *r, int *t, int s, __SIZE_TYPE__ u)
 {
   int *p2 = p;
-  #pragma omp taskgroup task_reduction (*: p[0], q[0], r[s])
+  #pragma omp taskgroup task_reduction (*: p[0], q[0], r[s], t[0:u + 1])
   {
     p = (int *) 0;
     s++;
-    bar (p2, r, s);
+    bar (p2, r, t, s, u);
     r++;
     #pragma omp taskwait
-    #pragma omp task in_reduction (*: p2[0], q[0], r[s - 2])
+    #pragma omp task in_reduction (*: p2[0], q[0], r[s - 2], t[0:u + 1])
     {
       *p2 *= 2;
       *q *= 3;
       r[s - 2] *= 7;
+      t[0] *= 10;
+      t[1] *= 11;
     }
+    u = __SIZE_MAX__ / 4;
     s++;
     p2 = (int *) 0;
     q = (int *) 0;
     r = (int *) 0;
+    t = (int *) 0;
   }
 }
 
 int
 main ()
 {
-  int a = 1, b = 1, c[2] = { 1, 0 };
+  int a = 1, b = 1, c[2] = { 1, 0 }, d[3] = { 1, 1, -1 };
+  volatile int zero;
+  zero = 0;
   q = &b;
   #pragma omp parallel num_threads (2)
   #pragma omp master
-  foo (&a, &c[0], 0);
-  if (a != 8 || b != 15 || c[0] != 42 || c[1] != 0)
+  foo (&a, &c[0], &d[0], zero, zero + 1);
+  if (a != 8 || b != 15 || c[0] != 42 || c[1] != 0
+      || d[0] != 80 || d[1] != 99 || d[2] != -1)
     abort ();
   return 0;
 }

        Jakub

Reply via email to