Commit 6943af07 by Alexander Monakov

omp-low: introduce omplow_simd_context

	* omp-low.c (omplow_simd_context): New struct.  Use it...
	(lower_rec_simd_input_clauses): ...here and...
	(lower_rec_input_clauses): ...here to hold common data.  Adjust all
	references to idx, lane, max_vf, is_simt.

From-SVN: r244713
parent 7b96920e
2017-01-20 Alexander Monakov <amonakov@ispras.ru>
* omp-low.c (omplow_simd_context): New struct. Use it...
(lower_rec_simd_input_clauses): ...here and...
(lower_rec_input_clauses): ...here to hold common data. Adjust all
references to idx, lane, max_vf, is_simt.
2017-01-20 Graham Markall <graham.markall@embecosm.com> 2017-01-20 Graham Markall <graham.markall@embecosm.com>
* config/arc/arc.h (LINK_SPEC): Use arclinux_nps emulation when * config/arc/arc.h (LINK_SPEC): Use arclinux_nps emulation when
...@@ -5,19 +12,19 @@ ...@@ -5,19 +12,19 @@
2017-01-20 Martin Jambor <mjambor@suse.cz> 2017-01-20 Martin Jambor <mjambor@suse.cz>
* hsa.h: Renaed to hsa-common.h. Adjusted a comment. * hsa.h: Renaed to hsa-common.h. Adjusted a comment.
* hsa.c: Renaed to hsa-common.c. Change include of gt-hsa.h to * hsa.c: Renaed to hsa-common.c. Change include of gt-hsa.h to
gt-hsa-common.h. gt-hsa-common.h.
* Makefile.in (OBJS): Rename hsa.o to hsa-common.o. * Makefile.in (OBJS): Rename hsa.o to hsa-common.o.
(GTFILES): Rename hsa.c to hsa-common.c. (GTFILES): Rename hsa.c to hsa-common.c.
* hsa-brig.c: Change include of hsa.h to hsa-common.h. * hsa-brig.c: Change include of hsa.h to hsa-common.h.
* hsa-dump.c: Likewise. * hsa-dump.c: Likewise.
* hsa-gen.c: Likewise. * hsa-gen.c: Likewise.
* hsa-regalloc.c: Likewise. * hsa-regalloc.c: Likewise.
* ipa-hsa.c: Likewise. * ipa-hsa.c: Likewise.
* omp-expand.c: Likewise. * omp-expand.c: Likewise.
* omp-low.c: Likewise. * omp-low.c: Likewise.
* toplev.c: Likewise. * toplev.c: Likewise.
2017-01-20 Marek Polacek <polacek@redhat.com> 2017-01-20 Marek Polacek <polacek@redhat.com>
......
...@@ -3445,42 +3445,49 @@ omp_clause_aligned_alignment (tree clause) ...@@ -3445,42 +3445,49 @@ omp_clause_aligned_alignment (tree clause)
return build_int_cst (integer_type_node, al); return build_int_cst (integer_type_node, al);
} }
/* This structure is part of the interface between lower_rec_simd_input_clauses
and lower_rec_input_clauses. */
struct omplow_simd_context {
tree idx;
tree lane;
int max_vf;
bool is_simt;
};
/* Helper function of lower_rec_input_clauses, used for #pragma omp simd /* Helper function of lower_rec_input_clauses, used for #pragma omp simd
privatization. */ privatization. */
static bool static bool
lower_rec_simd_input_clauses (tree new_var, omp_context *ctx, int &max_vf, lower_rec_simd_input_clauses (tree new_var, omp_context *ctx,
tree &idx, tree &lane, tree &ivar, tree &lvar) omplow_simd_context *sctx, tree &ivar, tree &lvar)
{ {
if (max_vf == 0) if (sctx->max_vf == 0)
{ {
if (omp_find_clause (gimple_omp_for_clauses (ctx->stmt), sctx->max_vf = sctx->is_simt ? omp_max_simt_vf () : omp_max_vf ();
OMP_CLAUSE__SIMT_)) if (sctx->max_vf > 1)
max_vf = omp_max_simt_vf ();
else
max_vf = omp_max_vf ();
if (max_vf > 1)
{ {
tree c = omp_find_clause (gimple_omp_for_clauses (ctx->stmt), tree c = omp_find_clause (gimple_omp_for_clauses (ctx->stmt),
OMP_CLAUSE_SAFELEN); OMP_CLAUSE_SAFELEN);
if (c if (c
&& (TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) != INTEGER_CST && (TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) != INTEGER_CST
|| tree_int_cst_sgn (OMP_CLAUSE_SAFELEN_EXPR (c)) != 1)) || tree_int_cst_sgn (OMP_CLAUSE_SAFELEN_EXPR (c)) != 1))
max_vf = 1; sctx->max_vf = 1;
else if (c && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c), else if (c && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c),
max_vf) == -1) sctx->max_vf) == -1)
max_vf = tree_to_shwi (OMP_CLAUSE_SAFELEN_EXPR (c)); sctx->max_vf = tree_to_shwi (OMP_CLAUSE_SAFELEN_EXPR (c));
} }
if (max_vf > 1) if (sctx->max_vf > 1)
{ {
idx = create_tmp_var (unsigned_type_node); sctx->idx = create_tmp_var (unsigned_type_node);
lane = create_tmp_var (unsigned_type_node); sctx->lane = create_tmp_var (unsigned_type_node);
} }
} }
if (max_vf == 1) if (sctx->max_vf == 1)
return false; return false;
tree atype = build_array_type_nelts (TREE_TYPE (new_var), max_vf); tree atype = build_array_type_nelts (TREE_TYPE (new_var), sctx->max_vf);
tree avar = create_tmp_var_raw (atype); tree avar = create_tmp_var_raw (atype);
if (TREE_ADDRESSABLE (new_var)) if (TREE_ADDRESSABLE (new_var))
TREE_ADDRESSABLE (avar) = 1; TREE_ADDRESSABLE (avar) = 1;
...@@ -3488,9 +3495,9 @@ lower_rec_simd_input_clauses (tree new_var, omp_context *ctx, int &max_vf, ...@@ -3488,9 +3495,9 @@ lower_rec_simd_input_clauses (tree new_var, omp_context *ctx, int &max_vf,
= tree_cons (get_identifier ("omp simd array"), NULL, = tree_cons (get_identifier ("omp simd array"), NULL,
DECL_ATTRIBUTES (avar)); DECL_ATTRIBUTES (avar));
gimple_add_tmp_var (avar); gimple_add_tmp_var (avar);
ivar = build4 (ARRAY_REF, TREE_TYPE (new_var), avar, idx, ivar = build4 (ARRAY_REF, TREE_TYPE (new_var), avar, sctx->idx,
NULL_TREE, NULL_TREE); NULL_TREE, NULL_TREE);
lvar = build4 (ARRAY_REF, TREE_TYPE (new_var), avar, lane, lvar = build4 (ARRAY_REF, TREE_TYPE (new_var), avar, sctx->lane,
NULL_TREE, NULL_TREE); NULL_TREE, NULL_TREE);
if (DECL_P (new_var)) if (DECL_P (new_var))
{ {
...@@ -3534,14 +3541,13 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -3534,14 +3541,13 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
int pass; int pass;
bool is_simd = (gimple_code (ctx->stmt) == GIMPLE_OMP_FOR bool is_simd = (gimple_code (ctx->stmt) == GIMPLE_OMP_FOR
&& gimple_omp_for_kind (ctx->stmt) & GF_OMP_FOR_SIMD); && gimple_omp_for_kind (ctx->stmt) & GF_OMP_FOR_SIMD);
bool maybe_simt = is_simd && omp_find_clause (clauses, OMP_CLAUSE__SIMT_); omplow_simd_context sctx = omplow_simd_context ();
int max_vf = 0;
tree lane = NULL_TREE, idx = NULL_TREE;
tree simt_lane = NULL_TREE; tree simt_lane = NULL_TREE;
tree ivar = NULL_TREE, lvar = NULL_TREE; tree ivar = NULL_TREE, lvar = NULL_TREE;
gimple_seq llist[3] = { }; gimple_seq llist[3] = { };
copyin_seq = NULL; copyin_seq = NULL;
sctx.is_simt = is_simd && omp_find_clause (clauses, OMP_CLAUSE__SIMT_);
/* Set max_vf=1 (which will later enforce safelen=1) in simd loops /* Set max_vf=1 (which will later enforce safelen=1) in simd loops
with data sharing clauses referencing variable sized vars. That with data sharing clauses referencing variable sized vars. That
...@@ -3553,18 +3559,18 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -3553,18 +3559,18 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
{ {
case OMP_CLAUSE_LINEAR: case OMP_CLAUSE_LINEAR:
if (OMP_CLAUSE_LINEAR_ARRAY (c)) if (OMP_CLAUSE_LINEAR_ARRAY (c))
max_vf = 1; sctx.max_vf = 1;
/* FALLTHRU */ /* FALLTHRU */
case OMP_CLAUSE_PRIVATE: case OMP_CLAUSE_PRIVATE:
case OMP_CLAUSE_FIRSTPRIVATE: case OMP_CLAUSE_FIRSTPRIVATE:
case OMP_CLAUSE_LASTPRIVATE: case OMP_CLAUSE_LASTPRIVATE:
if (is_variable_sized (OMP_CLAUSE_DECL (c))) if (is_variable_sized (OMP_CLAUSE_DECL (c)))
max_vf = 1; sctx.max_vf = 1;
break; break;
case OMP_CLAUSE_REDUCTION: case OMP_CLAUSE_REDUCTION:
if (TREE_CODE (OMP_CLAUSE_DECL (c)) == MEM_REF if (TREE_CODE (OMP_CLAUSE_DECL (c)) == MEM_REF
|| is_variable_sized (OMP_CLAUSE_DECL (c))) || is_variable_sized (OMP_CLAUSE_DECL (c)))
max_vf = 1; sctx.max_vf = 1;
break; break;
default: default:
continue; continue;
...@@ -4119,8 +4125,8 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4119,8 +4125,8 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
tree y = lang_hooks.decls.omp_clause_dtor (c, new_var); tree y = lang_hooks.decls.omp_clause_dtor (c, new_var);
if ((TREE_ADDRESSABLE (new_var) || nx || y if ((TREE_ADDRESSABLE (new_var) || nx || y
|| OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE) || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE)
&& lower_rec_simd_input_clauses (new_var, ctx, max_vf, && lower_rec_simd_input_clauses (new_var, ctx, &sctx,
idx, lane, ivar, lvar)) ivar, lvar))
{ {
if (nx) if (nx)
x = lang_hooks.decls.omp_clause_default_ctor x = lang_hooks.decls.omp_clause_default_ctor
...@@ -4229,8 +4235,8 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4229,8 +4235,8 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
if ((OMP_CLAUSE_CODE (c) != OMP_CLAUSE_LINEAR if ((OMP_CLAUSE_CODE (c) != OMP_CLAUSE_LINEAR
|| TREE_ADDRESSABLE (new_var)) || TREE_ADDRESSABLE (new_var))
&& lower_rec_simd_input_clauses (new_var, ctx, max_vf, && lower_rec_simd_input_clauses (new_var, ctx, &sctx,
idx, lane, ivar, lvar)) ivar, lvar))
{ {
if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR) if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR)
{ {
...@@ -4312,8 +4318,8 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4312,8 +4318,8 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
gcc_assert (DECL_P (new_vard)); gcc_assert (DECL_P (new_vard));
} }
if (is_simd if (is_simd
&& lower_rec_simd_input_clauses (new_var, ctx, max_vf, && lower_rec_simd_input_clauses (new_var, ctx, &sctx,
idx, lane, ivar, lvar)) ivar, lvar))
{ {
if (new_vard == new_var) if (new_vard == new_var)
{ {
...@@ -4406,14 +4412,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4406,14 +4412,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
gcc_assert (DECL_P (new_vard)); gcc_assert (DECL_P (new_vard));
} }
if (is_simd if (is_simd
&& lower_rec_simd_input_clauses (new_var, ctx, max_vf, && lower_rec_simd_input_clauses (new_var, ctx, &sctx,
idx, lane, ivar, lvar)) ivar, lvar))
{ {
tree ref = build_outer_var_ref (var, ctx); tree ref = build_outer_var_ref (var, ctx);
gimplify_assign (unshare_expr (ivar), x, &llist[0]); gimplify_assign (unshare_expr (ivar), x, &llist[0]);
if (maybe_simt) if (sctx.is_simt)
{ {
if (!simt_lane) if (!simt_lane)
simt_lane = create_tmp_var (unsigned_type_node); simt_lane = create_tmp_var (unsigned_type_node);
...@@ -4457,7 +4463,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4457,7 +4463,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
} }
} }
if (lane) if (sctx.lane)
{ {
tree uid = create_tmp_var (ptr_type_node, "simduid"); tree uid = create_tmp_var (ptr_type_node, "simduid");
/* Don't want uninit warnings on simduid, it is always uninitialized, /* Don't want uninit warnings on simduid, it is always uninitialized,
...@@ -4465,14 +4471,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4465,14 +4471,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
TREE_NO_WARNING (uid) = 1; TREE_NO_WARNING (uid) = 1;
gimple *g gimple *g
= gimple_build_call_internal (IFN_GOMP_SIMD_LANE, 1, uid); = gimple_build_call_internal (IFN_GOMP_SIMD_LANE, 1, uid);
gimple_call_set_lhs (g, lane); gimple_call_set_lhs (g, sctx.lane);
gimple_stmt_iterator gsi = gsi_start_1 (gimple_omp_body_ptr (ctx->stmt)); gimple_stmt_iterator gsi = gsi_start_1 (gimple_omp_body_ptr (ctx->stmt));
gsi_insert_before_without_update (&gsi, g, GSI_SAME_STMT); gsi_insert_before_without_update (&gsi, g, GSI_SAME_STMT);
c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE__SIMDUID_); c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE__SIMDUID_);
OMP_CLAUSE__SIMDUID__DECL (c) = uid; OMP_CLAUSE__SIMDUID__DECL (c) = uid;
OMP_CLAUSE_CHAIN (c) = gimple_omp_for_clauses (ctx->stmt); OMP_CLAUSE_CHAIN (c) = gimple_omp_for_clauses (ctx->stmt);
gimple_omp_for_set_clauses (ctx->stmt, c); gimple_omp_for_set_clauses (ctx->stmt, c);
g = gimple_build_assign (lane, INTEGER_CST, g = gimple_build_assign (sctx.lane, INTEGER_CST,
build_int_cst (unsigned_type_node, 0)); build_int_cst (unsigned_type_node, 0));
gimple_seq_add_stmt (ilist, g); gimple_seq_add_stmt (ilist, g);
/* Emit reductions across SIMT lanes in log_2(simt_vf) steps. */ /* Emit reductions across SIMT lanes in log_2(simt_vf) steps. */
...@@ -4488,7 +4494,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4488,7 +4494,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
gimple_seq_add_stmt (dlist, g); gimple_seq_add_stmt (dlist, g);
t = build_int_cst (unsigned_type_node, 0); t = build_int_cst (unsigned_type_node, 0);
g = gimple_build_assign (idx, INTEGER_CST, t); g = gimple_build_assign (sctx.idx, INTEGER_CST, t);
gimple_seq_add_stmt (dlist, g); gimple_seq_add_stmt (dlist, g);
tree body = create_artificial_label (UNKNOWN_LOCATION); tree body = create_artificial_label (UNKNOWN_LOCATION);
...@@ -4517,7 +4523,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4517,7 +4523,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
gimple_seq *seq = i == 0 ? ilist : dlist; gimple_seq *seq = i == 0 ? ilist : dlist;
gimple_seq_add_stmt (seq, g); gimple_seq_add_stmt (seq, g);
tree t = build_int_cst (unsigned_type_node, 0); tree t = build_int_cst (unsigned_type_node, 0);
g = gimple_build_assign (idx, INTEGER_CST, t); g = gimple_build_assign (sctx.idx, INTEGER_CST, t);
gimple_seq_add_stmt (seq, g); gimple_seq_add_stmt (seq, g);
tree body = create_artificial_label (UNKNOWN_LOCATION); tree body = create_artificial_label (UNKNOWN_LOCATION);
tree header = create_artificial_label (UNKNOWN_LOCATION); tree header = create_artificial_label (UNKNOWN_LOCATION);
...@@ -4526,10 +4532,10 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4526,10 +4532,10 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
gimple_seq_add_stmt (seq, gimple_build_label (body)); gimple_seq_add_stmt (seq, gimple_build_label (body));
gimple_seq_add_seq (seq, llist[i]); gimple_seq_add_seq (seq, llist[i]);
t = build_int_cst (unsigned_type_node, 1); t = build_int_cst (unsigned_type_node, 1);
g = gimple_build_assign (idx, PLUS_EXPR, idx, t); g = gimple_build_assign (sctx.idx, PLUS_EXPR, sctx.idx, t);
gimple_seq_add_stmt (seq, g); gimple_seq_add_stmt (seq, g);
gimple_seq_add_stmt (seq, gimple_build_label (header)); gimple_seq_add_stmt (seq, gimple_build_label (header));
g = gimple_build_cond (LT_EXPR, idx, vf, body, end); g = gimple_build_cond (LT_EXPR, sctx.idx, vf, body, end);
gimple_seq_add_stmt (seq, g); gimple_seq_add_stmt (seq, g);
gimple_seq_add_stmt (seq, gimple_build_label (end)); gimple_seq_add_stmt (seq, gimple_build_label (end));
} }
...@@ -4565,18 +4571,18 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -4565,18 +4571,18 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
/* If max_vf is non-zero, then we can use only a vectorization factor /* If max_vf is non-zero, then we can use only a vectorization factor
up to the max_vf we chose. So stick it into the safelen clause. */ up to the max_vf we chose. So stick it into the safelen clause. */
if (max_vf) if (sctx.max_vf)
{ {
tree c = omp_find_clause (gimple_omp_for_clauses (ctx->stmt), tree c = omp_find_clause (gimple_omp_for_clauses (ctx->stmt),
OMP_CLAUSE_SAFELEN); OMP_CLAUSE_SAFELEN);
if (c == NULL_TREE if (c == NULL_TREE
|| (TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) == INTEGER_CST || (TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) == INTEGER_CST
&& compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c), && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c),
max_vf) == 1)) sctx.max_vf) == 1))
{ {
c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_SAFELEN); c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_SAFELEN);
OMP_CLAUSE_SAFELEN_EXPR (c) = build_int_cst (integer_type_node, OMP_CLAUSE_SAFELEN_EXPR (c) = build_int_cst (integer_type_node,
max_vf); sctx.max_vf);
OMP_CLAUSE_CHAIN (c) = gimple_omp_for_clauses (ctx->stmt); OMP_CLAUSE_CHAIN (c) = gimple_omp_for_clauses (ctx->stmt);
gimple_omp_for_set_clauses (ctx->stmt, c); gimple_omp_for_set_clauses (ctx->stmt, c);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment