From patchwork Thu May 30 21:22:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 1107934 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-502009-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45FLBt5fRLz9s3l for ; Fri, 31 May 2019 07:22:25 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:reply-to:mime-version:content-type; q=dns; s=default; b=HqaKqIzIxfaImYPx0OV84Id1UQEiARm/rYyMkGBTDbd uDvHkI40izBpc2QMsFhmqICwfGR/bq80dmyFFIHHBzaQdWrNyv5f2JvgCOIq3J6R s8/Ezc9UntkYUyvNyj5k04sf6sAGXVaHjE7eidZcnhr2ZVFtMYLXW0Gb1np7v6so = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:reply-to:mime-version:content-type; s=default; bh=gHgIf0AjdXNN7vuLY0Qo1WdOqhk=; b=Cu0ooI7g/g7af9TtB 42YrmstlcGeTX8tAhBJ+QFNhaIhhCxl7VpXtomCvRe6kAlg9lzYT1MX5MeWPhhuR zbpufzlt+QFF1cswFQpM9VnQZjS5MA6J7gUX4Iui1lhSTuhINUgss69FEA1yX53w jiaNA2FTXtC1hTIB6p9EYP2p0c= Received: (qmail 38316 invoked by alias); 30 May 2019 21:22:15 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 38308 invoked by uid 89); 30 May 2019 21:22:15 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-6.3 required=5.0 tests=AWL, BAYES_40, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=i686-linux, regtested, i686linux, sk:build_c X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 30 May 2019 21:22:12 +0000 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7E56137EEB for ; Thu, 30 May 2019 21:22:11 +0000 (UTC) Received: from tucnak.zalov.cz (ovpn-116-52.ams2.redhat.com [10.36.116.52]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EFDF2450E for ; Thu, 30 May 2019 21:22:10 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.15.2/8.15.2) with ESMTP id x4ULM8dO020622 for ; Thu, 30 May 2019 23:22:09 +0200 Received: (from jakub@localhost) by tucnak.zalov.cz (8.15.2/8.15.2/Submit) id x4ULM7dV020621 for gcc-patches@gcc.gnu.org; Thu, 30 May 2019 23:22:07 +0200 Date: Thu, 30 May 2019 23:22:07 +0200 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [committed] Optimize lastprivate conditional in worksharing constructs nested in parallel constructs Message-ID: <20190530212207.GC19695@tucnak> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.11.3 (2019-02-01) X-IsSubscribed: yes 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 * 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) : 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 --- 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 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;