* [committed] Optimize lastprivate conditional in worksharing constructs nested in parallel constructs
@ 2019-05-30 21:27 Jakub Jelinek
0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2019-05-30 21:27 UTC (permalink / raw)
To: gcc-patches
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.
--- 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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2019-05-30 21:22 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-30 21:27 [committed] Optimize lastprivate conditional in worksharing constructs nested in parallel constructs Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).