Hi!

The following patch implements an optimization.  For orphaned worksharing
constructs we need to ask the runtime library to allocate some memory
in the first thread that encounters the construct, but if it is nested
inside of a parallel construct, we can allocate the memory on the stack of
the initial thread at the start of the parallel construct.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

2019-05-30  Jakub Jelinek  <ja...@redhat.com>

        * gimplify.c (enum gimplify_omp_var_data): Add GOVD_CONDTEMP.
        (gimplify_adjust_omp_clauses_1): Handle GOVD_CONDTEMP.
        (gimplify_omp_for): If worksharing loop with lastprivate conditional
        is nested inside of parallel region, add _condtemp_ clause to both.
        * tree-nested.c (convert_nonlocal_omp_clauses,
        convert_local_omp_clauses): Ignore OMP_CLAUSE__CONDTEMP_ instead of
        assertion failure.
        * omp-general.h (struct omp_for_data): Add have_pointer_condtemp
        member.
        * omp-general.c (omp_extract_for_data): Compute it.
        * omp-low.c (scan_sharing_clauses): Handle OMP_CLAUSE__CONDTEMP_.
        (lower_rec_input_clauses): Likewise.
        (lower_lastprivate_conditional_clauses): If OMP_CLAUSE__CONDTEMP_
        clause is already present, just add one further one after it.
        (lower_lastprivate_clauses): Handle cond_ptr with array type.
        (lower_send_shared_vars): Clear _condtemp_ vars.
        (lower_omp_1) <case GIMPLE_ASSIGN>: Handle target data like critical
        or section or taskgroup.
        * omp-expand.c (determine_parallel_type): Disallow combining only if
        first OMP_CLAUSE__CONDTEMP_ has pointer type.  Disallow combining
        of parallel sections if OMP_CLAUSE__CONDTEMP_ is present.
        (expand_omp_for_generic, expand_omp_for_static_nochunk,
        expand_omp_for_static_chunk, expand_omp_for): Use
        fd->have_pointer_condtemp instead of fd->lastprivate_conditional to
        determine if a special set of API routines are needed and if condtemp
        needs to be initialized, while always initialize cond_var if
        fd->lastprivate_conditional is non-zero.

--- gcc/gimplify.c.jj   2019-05-29 09:49:20.449598524 +0200
+++ gcc/gimplify.c      2019-05-30 13:34:54.139334279 +0200
@@ -116,6 +116,8 @@ enum gimplify_omp_var_data
   /* Flag for GOVD_LASTPRIVATE: conditional modifier.  */
   GOVD_LASTPRIVATE_CONDITIONAL = 0x800000,
 
+  GOVD_CONDTEMP = 0x1000000,
+
   GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
                           | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LINEAR
                           | GOVD_LOCAL)
@@ -9527,6 +9529,11 @@ gimplify_adjust_omp_clauses_1 (splay_tre
     code = OMP_CLAUSE_LASTPRIVATE;
   else if (flags & (GOVD_ALIGNED | GOVD_NONTEMPORAL))
     return 0;
+  else if (flags & GOVD_CONDTEMP)
+    {
+      code = OMP_CLAUSE__CONDTEMP_;
+      gimple_add_tmp_var (decl);
+    }
   else
     gcc_unreachable ();
 
@@ -11523,6 +11530,36 @@ gimplify_omp_for (tree *expr_p, gimple_s
     }
   else
     gimplify_seq_add_stmt (pre_p, gfor);
+
+  if (TREE_CODE (orig_for_stmt) == OMP_FOR)
+    {
+      struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
+      unsigned lastprivate_conditional = 0;
+      while (ctx
+            && (ctx->region_type == ORT_TARGET_DATA
+                || ctx->region_type == ORT_TASKGROUP))
+       ctx = ctx->outer_context;
+      if (ctx && (ctx->region_type & ORT_PARALLEL) != 0)
+       for (tree c = gimple_omp_for_clauses (gfor);
+            c; c = OMP_CLAUSE_CHAIN (c))
+         if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
+             && OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c))
+           ++lastprivate_conditional;
+      if (lastprivate_conditional)
+       {
+         struct omp_for_data fd;
+         omp_extract_for_data (gfor, &fd, NULL);
+         tree type = build_array_type_nelts (unsigned_type_for (fd.iter_type),
+                                             lastprivate_conditional);
+         tree var = create_tmp_var_raw (type);
+         tree c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE__CONDTEMP_);
+         OMP_CLAUSE_DECL (c) = var;
+         OMP_CLAUSE_CHAIN (c) = gimple_omp_for_clauses (gfor);
+         gimple_omp_for_set_clauses (gfor, c);
+         omp_add_variable (ctx, var, GOVD_CONDTEMP | GOVD_SEEN);
+       }
+    }
+
   if (ret != GS_ALL_DONE)
     return GS_ERROR;
   *expr_p = NULL_TREE;
--- gcc/tree-nested.c.jj        2019-05-24 23:30:35.923880583 +0200
+++ gcc/tree-nested.c   2019-05-30 14:25:44.542164529 +0200
@@ -1348,6 +1348,7 @@ convert_nonlocal_omp_clauses (tree *pcla
        case OMP_CLAUSE_AUTO:
        case OMP_CLAUSE_IF_PRESENT:
        case OMP_CLAUSE_FINALIZE:
+       case OMP_CLAUSE__CONDTEMP_:
          break;
 
          /* The following clause belongs to the OpenACC cache directive, which
@@ -1369,7 +1370,6 @@ convert_nonlocal_omp_clauses (tree *pcla
             function decomposition happens before that.  */
        case OMP_CLAUSE__LOOPTEMP_:
        case OMP_CLAUSE__REDUCTEMP_:
-       case OMP_CLAUSE__CONDTEMP_:
        case OMP_CLAUSE__SIMDUID_:
        case OMP_CLAUSE__GRIDDIM_:
        case OMP_CLAUSE__SIMT_:
@@ -2076,6 +2076,7 @@ convert_local_omp_clauses (tree *pclause
        case OMP_CLAUSE_AUTO:
        case OMP_CLAUSE_IF_PRESENT:
        case OMP_CLAUSE_FINALIZE:
+       case OMP_CLAUSE__CONDTEMP_:
          break;
 
          /* The following clause belongs to the OpenACC cache directive, which
@@ -2097,7 +2098,6 @@ convert_local_omp_clauses (tree *pclause
             function decomposition happens before that.  */
        case OMP_CLAUSE__LOOPTEMP_:
        case OMP_CLAUSE__REDUCTEMP_:
-       case OMP_CLAUSE__CONDTEMP_:
        case OMP_CLAUSE__SIMDUID_:
        case OMP_CLAUSE__GRIDDIM_:
        case OMP_CLAUSE__SIMT_:
--- gcc/omp-general.h.jj        2019-05-24 23:30:35.926880534 +0200
+++ gcc/omp-general.h   2019-05-30 19:56:29.750112499 +0200
@@ -63,6 +63,7 @@ struct omp_for_data
   int collapse;  /* Collapsed loops, 1 for a non-collapsed loop.  */
   int ordered;
   bool have_nowait, have_ordered, simd_schedule, have_reductemp;
+  bool have_pointer_condtemp;
   int lastprivate_conditional;
   unsigned char sched_modifiers;
   enum omp_clause_schedule_kind sched_kind;
--- gcc/omp-general.c.jj        2019-05-24 23:30:35.926880534 +0200
+++ gcc/omp-general.c   2019-05-30 19:57:43.493905069 +0200
@@ -168,6 +168,7 @@ omp_extract_for_data (gomp_for *for_stmt
   fd->have_nowait = distribute || simd;
   fd->have_ordered = false;
   fd->have_reductemp = false;
+  fd->have_pointer_condtemp = false;
   fd->lastprivate_conditional = 0;
   fd->tiling = NULL_TREE;
   fd->collapse = 1;
@@ -226,6 +227,10 @@ omp_extract_for_data (gomp_for *for_stmt
        if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (t))
          fd->lastprivate_conditional++;
        break;
+      case OMP_CLAUSE__CONDTEMP_:
+       if (POINTER_TYPE_P (TREE_TYPE (OMP_CLAUSE_DECL (t))))
+         fd->have_pointer_condtemp = true;
+       break;
       default:
        break;
       }
--- gcc/omp-low.c.jj    2019-05-27 23:32:56.299155011 +0200
+++ gcc/omp-low.c       2019-05-30 20:31:48.015550968 +0200
@@ -1413,6 +1413,15 @@ scan_sharing_clauses (tree clauses, omp_
            install_var_local (decl, ctx);
          break;
 
+       case OMP_CLAUSE__CONDTEMP_:
+         if (is_parallel_ctx (ctx))
+           {
+             decl = OMP_CLAUSE_DECL (c);
+             install_var_field (decl, false, 3, ctx);
+             install_var_local (decl, ctx);
+           }
+         break;
+
        case OMP_CLAUSE__CACHE_:
        default:
          gcc_unreachable ();
@@ -1587,6 +1596,7 @@ scan_sharing_clauses (tree clauses, omp_
        case OMP_CLAUSE__SIMT_:
        case OMP_CLAUSE_IF_PRESENT:
        case OMP_CLAUSE_FINALIZE:
+       case OMP_CLAUSE__CONDTEMP_:
          break;
 
        case OMP_CLAUSE__CACHE_:
@@ -4041,6 +4051,10 @@ lower_rec_input_clauses (tree clauses, g
                  DECL_HAS_VALUE_EXPR_P (new_var) = 1;
                }
              continue;
+           case OMP_CLAUSE__CONDTEMP_:
+             if (is_parallel_ctx (ctx))
+               break;
+             continue;
            default:
              continue;
            }
@@ -4707,6 +4721,15 @@ lower_rec_input_clauses (tree clauses, g
                TREE_NO_WARNING (var) = 1;
              break;
 
+           case OMP_CLAUSE__CONDTEMP_:
+             if (is_parallel_ctx (ctx))
+               {
+                 x = build_receiver_ref (var, false, ctx);
+                 SET_DECL_VALUE_EXPR (new_var, x);
+                 DECL_HAS_VALUE_EXPR_P (new_var) = 1;
+               }
+             break;
+
            case OMP_CLAUSE_LASTPRIVATE:
              if (OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c))
                break;
@@ -5388,25 +5411,36 @@ lower_lastprivate_conditional_clauses (t
              }
            else if (gimple_code (ctx->stmt) == GIMPLE_OMP_SECTIONS)
              iter_type = unsigned_type_node;
-           cond_ptr = create_tmp_var_raw (build_pointer_type (iter_type));
-           DECL_CONTEXT (cond_ptr) = current_function_decl;
-           DECL_SEEN_IN_BIND_EXPR_P (cond_ptr) = 1;
-           DECL_CHAIN (cond_ptr) = ctx->block_vars;
-           ctx->block_vars = cond_ptr;
+           tree c2 = omp_find_clause (*clauses, OMP_CLAUSE__CONDTEMP_);
+           if (c2)
+             {
+               cond_ptr
+                 = lookup_decl_in_outer_ctx (OMP_CLAUSE_DECL (c2), ctx);
+               OMP_CLAUSE_DECL (c2) = cond_ptr;
+             }
+           else
+             {
+               cond_ptr = create_tmp_var_raw (build_pointer_type (iter_type));
+               DECL_CONTEXT (cond_ptr) = current_function_decl;
+               DECL_SEEN_IN_BIND_EXPR_P (cond_ptr) = 1;
+               DECL_CHAIN (cond_ptr) = ctx->block_vars;
+               ctx->block_vars = cond_ptr;
+               c2 = build_omp_clause (UNKNOWN_LOCATION,
+                                      OMP_CLAUSE__CONDTEMP_);
+               OMP_CLAUSE_DECL (c2) = cond_ptr;
+               OMP_CLAUSE_CHAIN (c2) = *clauses;
+               *clauses = c2;
+             }
            iter_var = create_tmp_var_raw (iter_type);
            DECL_CONTEXT (iter_var) = current_function_decl;
            DECL_SEEN_IN_BIND_EXPR_P (iter_var) = 1;
            DECL_CHAIN (iter_var) = ctx->block_vars;
            ctx->block_vars = iter_var;
-           tree c2
-             = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE__CONDTEMP_);
            tree c3
              = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE__CONDTEMP_);
-           OMP_CLAUSE_DECL (c2) = cond_ptr;
            OMP_CLAUSE_DECL (c3) = iter_var;
+           OMP_CLAUSE_CHAIN (c3) = OMP_CLAUSE_CHAIN (c2);
            OMP_CLAUSE_CHAIN (c2) = c3;
-           OMP_CLAUSE_CHAIN (c3) = *clauses;
-           *clauses = c2;
            ctx->lastprivate_conditional_map = new hash_map<tree, tree>;
          }
        tree v = create_tmp_var_raw (iter_type);
@@ -5536,11 +5570,18 @@ lower_lastprivate_clauses (tree clauses,
          tree v = *ctx->lastprivate_conditional_map->get (o);
          gimplify_assign (v, build_zero_cst (type), body_p);
          this_stmt_list = cstmt_list;
-         tree mem = build2 (MEM_REF, type, cond_ptr,
-                            build_int_cst (TREE_TYPE (cond_ptr),
-                                           conditional_off));
+         tree mem;
+         if (POINTER_TYPE_P (TREE_TYPE (cond_ptr)))
+           {
+             mem = build2 (MEM_REF, type, cond_ptr,
+                           build_int_cst (TREE_TYPE (cond_ptr),
+                                          conditional_off));
+             conditional_off += tree_to_uhwi (TYPE_SIZE_UNIT (type));
+           }
+         else
+           mem = build4 (ARRAY_REF, type, cond_ptr,
+                         size_int (conditional_off++), NULL_TREE, NULL_TREE);
          tree mem2 = copy_node (mem);
-         conditional_off += tree_to_uhwi (TYPE_SIZE_UNIT (type));
          gimple_seq seq = NULL;
          mem = force_gimple_operand (mem, &seq, true, NULL_TREE);
          gimple_seq_add_seq (this_stmt_list, seq);
@@ -6448,7 +6489,16 @@ lower_send_shared_vars (gimple_seq *ilis
       if (use_pointer_for_field (ovar, ctx))
        {
          x = build_sender_ref (ovar, ctx);
-         var = build_fold_addr_expr (var);
+         if (TREE_CODE (TREE_TYPE (f)) == ARRAY_TYPE
+             && TREE_TYPE (f) == TREE_TYPE (ovar))
+           {
+             gcc_assert (is_parallel_ctx (ctx)
+                         && DECL_ARTIFICIAL (ovar));
+             /* _condtemp_ clause.  */
+             var = build_constructor (TREE_TYPE (x), NULL);
+           }
+         else
+           var = build_fold_addr_expr (var);
          gimplify_assign (x, var, ilist);
        }
       else
@@ -10652,7 +10702,10 @@ lower_omp_1 (gimple_stmt_iterator *gsi_p
          if (gimple_code (up->stmt) == GIMPLE_OMP_ORDERED
              || gimple_code (up->stmt) == GIMPLE_OMP_CRITICAL
              || gimple_code (up->stmt) == GIMPLE_OMP_TASKGROUP
-             || gimple_code (up->stmt) == GIMPLE_OMP_SECTION)
+             || gimple_code (up->stmt) == GIMPLE_OMP_SECTION
+             || (gimple_code (up->stmt) == GIMPLE_OMP_TARGET
+                 && (gimple_omp_target_kind (up->stmt)
+                     == GF_OMP_TARGET_KIND_DATA)))
            continue;
          else if (!up->lastprivate_conditional_map)
            break;
--- gcc/omp-expand.c.jj 2019-05-27 23:32:56.301154978 +0200
+++ gcc/omp-expand.c    2019-05-30 20:32:34.795786537 +0200
@@ -346,12 +346,15 @@ determine_parallel_type (struct omp_regi
                  == OMP_CLAUSE_SCHEDULE_STATIC)
              || omp_find_clause (clauses, OMP_CLAUSE_ORDERED)
              || omp_find_clause (clauses, OMP_CLAUSE__REDUCTEMP_)
-             || omp_find_clause (clauses, OMP_CLAUSE__CONDTEMP_))
+             || ((c = omp_find_clause (clauses, OMP_CLAUSE__CONDTEMP_))
+                 && POINTER_TYPE_P (TREE_TYPE (OMP_CLAUSE_DECL (c)))))
            return;
        }
       else if (region->inner->type == GIMPLE_OMP_SECTIONS
-              && omp_find_clause (gimple_omp_sections_clauses (ws_stmt),
-                                  OMP_CLAUSE__REDUCTEMP_))
+              && (omp_find_clause (gimple_omp_sections_clauses (ws_stmt),
+                                   OMP_CLAUSE__REDUCTEMP_)
+                  || omp_find_clause (gimple_omp_sections_clauses (ws_stmt),
+                                      OMP_CLAUSE__CONDTEMP_)))
        return;
 
       region->is_combined_parallel = true;
@@ -2686,6 +2689,15 @@ expand_omp_for_generic (struct omp_regio
   tree reductions = NULL_TREE;
   tree mem = NULL_TREE, cond_var = NULL_TREE, condtemp = NULL_TREE;
   tree memv = NULL_TREE;
+  if (fd->lastprivate_conditional)
+    {
+      tree c = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
+                               OMP_CLAUSE__CONDTEMP_);
+      if (fd->have_pointer_condtemp)
+       condtemp = OMP_CLAUSE_DECL (c);
+      c = omp_find_clause (OMP_CLAUSE_CHAIN (c), OMP_CLAUSE__CONDTEMP_);
+      cond_var = OMP_CLAUSE_DECL (c);
+    }
   if (sched_arg)
     {
       if (fd->have_reductemp)
@@ -2705,13 +2717,8 @@ expand_omp_for_generic (struct omp_regio
        }
       else
        reductions = null_pointer_node;
-      if (fd->lastprivate_conditional)
+      if (fd->have_pointer_condtemp)
        {
-         tree c = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
-                                   OMP_CLAUSE__CONDTEMP_);
-         condtemp = OMP_CLAUSE_DECL (c);
-         c = omp_find_clause (OMP_CLAUSE_CHAIN (c), OMP_CLAUSE__CONDTEMP_);
-         cond_var = OMP_CLAUSE_DECL (c);
          tree type = TREE_TYPE (condtemp);
          memv = create_tmp_var (type);
          TREE_ADDRESSABLE (memv) = 1;
@@ -2978,7 +2985,7 @@ expand_omp_for_generic (struct omp_regio
       gsi_insert_before (&gsi, gimple_build_assign (arr, clobber),
                         GSI_SAME_STMT);
     }
-  if (fd->lastprivate_conditional)
+  if (fd->have_pointer_condtemp)
     expand_omp_build_assign (&gsi, condtemp, memv, false);
   if (fd->have_reductemp)
     {
@@ -3540,7 +3547,7 @@ expand_omp_for_static_nochunk (struct om
   tree *counts = NULL;
   tree n1, n2, step;
   tree reductions = NULL_TREE;
-  tree cond_var = NULL_TREE;
+  tree cond_var = NULL_TREE, condtemp = NULL_TREE;
 
   itype = type = TREE_TYPE (fd->loop.v);
   if (POINTER_TYPE_P (type))
@@ -3626,7 +3633,16 @@ expand_omp_for_static_nochunk (struct om
       gsi = gsi_last_bb (entry_bb);
     }
 
-  if (fd->have_reductemp || fd->lastprivate_conditional)
+  if (fd->lastprivate_conditional)
+    {
+      tree clauses = gimple_omp_for_clauses (fd->for_stmt);
+      tree c = omp_find_clause (clauses, OMP_CLAUSE__CONDTEMP_);
+      if (fd->have_pointer_condtemp)
+       condtemp = OMP_CLAUSE_DECL (c);
+      c = omp_find_clause (OMP_CLAUSE_CHAIN (c), OMP_CLAUSE__CONDTEMP_);
+      cond_var = OMP_CLAUSE_DECL (c);
+    }
+  if (fd->have_reductemp || fd->have_pointer_condtemp)
     {
       tree t1 = build_int_cst (long_integer_type_node, 0);
       tree t2 = build_int_cst (long_integer_type_node, 1);
@@ -3636,7 +3652,6 @@ expand_omp_for_static_nochunk (struct om
       gimple_stmt_iterator gsi2 = gsi_none ();
       gimple *g = NULL;
       tree mem = null_pointer_node, memv = NULL_TREE;
-      tree condtemp = NULL_TREE;
       if (fd->have_reductemp)
        {
          tree c = omp_find_clause (clauses, OMP_CLAUSE__REDUCTEMP_);
@@ -3655,12 +3670,8 @@ expand_omp_for_static_nochunk (struct om
            gsi2 = gsip;
          reductions = null_pointer_node;
        }
-      if (fd->lastprivate_conditional)
+      if (fd->have_pointer_condtemp)
        {
-         tree c = omp_find_clause (clauses, OMP_CLAUSE__CONDTEMP_);
-         condtemp = OMP_CLAUSE_DECL (c);
-         c = omp_find_clause (OMP_CLAUSE_CHAIN (c), OMP_CLAUSE__CONDTEMP_);
-         cond_var = OMP_CLAUSE_DECL (c);
          tree type = TREE_TYPE (condtemp);
          memv = create_tmp_var (type);
          TREE_ADDRESSABLE (memv) = 1;
@@ -3677,7 +3688,7 @@ expand_omp_for_static_nochunk (struct om
                           null_pointer_node, reductions, mem);
       force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE,
                                true, GSI_SAME_STMT);
-      if (fd->lastprivate_conditional)
+      if (fd->have_pointer_condtemp)
        expand_omp_build_assign (&gsi2, condtemp, memv, false);
       if (fd->have_reductemp)
        {
@@ -3999,7 +4010,7 @@ expand_omp_for_static_nochunk (struct om
   if (!gimple_omp_return_nowait_p (gsi_stmt (gsi)))
     {
       t = gimple_omp_return_lhs (gsi_stmt (gsi));
-      if (fd->have_reductemp || fd->lastprivate_conditional)
+      if (fd->have_reductemp || fd->have_pointer_condtemp)
        {
          tree fn;
          if (t)
@@ -4156,7 +4167,7 @@ expand_omp_for_static_chunk (struct omp_
   tree *counts = NULL;
   tree n1, n2, step;
   tree reductions = NULL_TREE;
-  tree cond_var = NULL_TREE;
+  tree cond_var = NULL_TREE, condtemp = NULL_TREE;
 
   itype = type = TREE_TYPE (fd->loop.v);
   if (POINTER_TYPE_P (type))
@@ -4246,7 +4257,16 @@ expand_omp_for_static_chunk (struct omp_
       gsi = gsi_last_bb (entry_bb);
     }
 
-  if (fd->have_reductemp || fd->lastprivate_conditional)
+  if (fd->lastprivate_conditional)
+    {
+      tree clauses = gimple_omp_for_clauses (fd->for_stmt);
+      tree c = omp_find_clause (clauses, OMP_CLAUSE__CONDTEMP_);
+      if (fd->have_pointer_condtemp)
+       condtemp = OMP_CLAUSE_DECL (c);
+      c = omp_find_clause (OMP_CLAUSE_CHAIN (c), OMP_CLAUSE__CONDTEMP_);
+      cond_var = OMP_CLAUSE_DECL (c);
+    }
+  if (fd->have_reductemp || fd->have_pointer_condtemp)
     {
       tree t1 = build_int_cst (long_integer_type_node, 0);
       tree t2 = build_int_cst (long_integer_type_node, 1);
@@ -4256,7 +4276,6 @@ expand_omp_for_static_chunk (struct omp_
       gimple_stmt_iterator gsi2 = gsi_none ();
       gimple *g = NULL;
       tree mem = null_pointer_node, memv = NULL_TREE;
-      tree condtemp = NULL_TREE;
       if (fd->have_reductemp)
        {
          tree c = omp_find_clause (clauses, OMP_CLAUSE__REDUCTEMP_);
@@ -4275,12 +4294,8 @@ expand_omp_for_static_chunk (struct omp_
            gsi2 = gsip;
          reductions = null_pointer_node;
        }
-      if (fd->lastprivate_conditional)
+      if (fd->have_pointer_condtemp)
        {
-         tree c = omp_find_clause (clauses, OMP_CLAUSE__CONDTEMP_);
-         condtemp = OMP_CLAUSE_DECL (c);
-         c = omp_find_clause (OMP_CLAUSE_CHAIN (c), OMP_CLAUSE__CONDTEMP_);
-         cond_var = OMP_CLAUSE_DECL (c);
          tree type = TREE_TYPE (condtemp);
          memv = create_tmp_var (type);
          TREE_ADDRESSABLE (memv) = 1;
@@ -4297,7 +4312,7 @@ expand_omp_for_static_chunk (struct omp_
                           null_pointer_node, reductions, mem);
       force_gimple_operand_gsi (&gsi2, t, true, NULL_TREE,
                                true, GSI_SAME_STMT);
-      if (fd->lastprivate_conditional)
+      if (fd->have_pointer_condtemp)
        expand_omp_build_assign (&gsi2, condtemp, memv, false);
       if (fd->have_reductemp)
        {
@@ -4635,7 +4650,7 @@ expand_omp_for_static_chunk (struct omp_
   if (!gimple_omp_return_nowait_p (gsi_stmt (gsi)))
     {
       t = gimple_omp_return_lhs (gsi_stmt (gsi));
-      if (fd->have_reductemp || fd->lastprivate_conditional)
+      if (fd->have_reductemp || fd->have_pointer_condtemp)
        {
          tree fn;
          if (t)
@@ -6263,7 +6278,7 @@ expand_omp_for (struct omp_region *regio
       else
        start_ix = ((int)BUILT_IN_GOMP_LOOP_STATIC_START) + fn_index;
       next_ix = ((int)BUILT_IN_GOMP_LOOP_STATIC_NEXT) + fn_index;
-      if (fd.have_reductemp || fd.lastprivate_conditional)
+      if (fd.have_reductemp || fd.have_pointer_condtemp)
        {
          if (fd.ordered)
            start_ix = (int)BUILT_IN_GOMP_LOOP_DOACROSS_START;

        Jakub

Reply via email to