diff mbox series

[committed] Optimize lastprivate conditional in worksharing constructs nested in parallel constructs

Message ID 20190530212207.GC19695@tucnak
State New
Headers show
Series [committed] Optimize lastprivate conditional in worksharing constructs nested in parallel constructs | expand

Commit Message

Jakub Jelinek May 30, 2019, 9:22 p.m. UTC
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  <jakub@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.


	Jakub
diff mbox series

Patch

--- 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;