Commit 95782571 by Jakub Jelinek Committed by Jakub Jelinek

gimplify.c (gimplify_adjust_omp_clauses_1): Handle GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE.

	* gimplify.c (gimplify_adjust_omp_clauses_1): Handle
	GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE.
	(gimplify_adjust_omp_clauses): Simd region is never
	directly nested in combined parallel.  Instead, for linear
	with copyin/copyout, if in combined for simd loop, make decl
	firstprivate/lastprivate on OMP_FOR.
	* omp-low.c (expand_omp_for_generic, expand_omp_for_static_nochunk,
	expand_omp_for_static_chunk): When setting endvar, also set
	fd->loop.v to the same value.
libgomp/
	* testsuite/libgomp.c/simd-10.c: New test.
	* testsuite/libgomp.c/simd-11.c: New test.
	* testsuite/libgomp.c/simd-12.c: New test.
	* testsuite/libgomp.c/simd-13.c: New test.

From-SVN: r210009
parent 047f1cec
2014-05-02 Jakub Jelinek <jakub@redhat.com>
* gimplify.c (gimplify_adjust_omp_clauses_1): Handle
GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE.
(gimplify_adjust_omp_clauses): Simd region is never
directly nested in combined parallel. Instead, for linear
with copyin/copyout, if in combined for simd loop, make decl
firstprivate/lastprivate on OMP_FOR.
* omp-low.c (expand_omp_for_generic, expand_omp_for_static_nochunk,
expand_omp_for_static_chunk): When setting endvar, also set
fd->loop.v to the same value.
2014-05-02 Richard Sandiford <rsandifo@linux.vnet.ibm.com> 2014-05-02 Richard Sandiford <rsandifo@linux.vnet.ibm.com>
* hwint.h (zext_hwi): Fix signed overflow for prec == 63. * hwint.h (zext_hwi): Fix signed overflow for prec == 63.
......
...@@ -6273,9 +6273,17 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data) ...@@ -6273,9 +6273,17 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
OMP_CLAUSE_CHAIN (clause) = nc; OMP_CLAUSE_CHAIN (clause) = nc;
} }
} }
if (code == OMP_CLAUSE_FIRSTPRIVATE && (flags & GOVD_LASTPRIVATE) != 0)
{
tree nc = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE);
OMP_CLAUSE_DECL (nc) = decl;
OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (nc) = 1;
OMP_CLAUSE_CHAIN (nc) = *list_p;
OMP_CLAUSE_CHAIN (clause) = nc;
lang_hooks.decls.omp_finish_clause (nc);
}
*list_p = clause; *list_p = clause;
lang_hooks.decls.omp_finish_clause (clause); lang_hooks.decls.omp_finish_clause (clause);
return 0; return 0;
} }
...@@ -6314,18 +6322,17 @@ gimplify_adjust_omp_clauses (tree *list_p) ...@@ -6314,18 +6322,17 @@ gimplify_adjust_omp_clauses (tree *list_p)
if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
&& ctx->outer_context && ctx->outer_context
&& !(OMP_CLAUSE_LINEAR_NO_COPYIN (c) && !(OMP_CLAUSE_LINEAR_NO_COPYIN (c)
&& OMP_CLAUSE_LINEAR_NO_COPYOUT (c)) && OMP_CLAUSE_LINEAR_NO_COPYOUT (c)))
&& !is_global_var (decl))
{ {
if (ctx->outer_context->region_type == ORT_COMBINED_PARALLEL) if (ctx->outer_context->combined_loop
&& !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
{ {
n = splay_tree_lookup (ctx->outer_context->variables, n = splay_tree_lookup (ctx->outer_context->variables,
(splay_tree_key) decl); (splay_tree_key) decl);
if (n == NULL if (n == NULL
|| (n->value & GOVD_DATA_SHARE_CLASS) == 0) || (n->value & GOVD_DATA_SHARE_CLASS) == 0)
{ {
int flags = OMP_CLAUSE_LINEAR_NO_COPYIN (c) int flags = GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE;
? GOVD_LASTPRIVATE : GOVD_SHARED;
if (n == NULL) if (n == NULL)
omp_add_variable (ctx->outer_context, decl, omp_add_variable (ctx->outer_context, decl,
flags | GOVD_SEEN); flags | GOVD_SEEN);
...@@ -6333,7 +6340,7 @@ gimplify_adjust_omp_clauses (tree *list_p) ...@@ -6333,7 +6340,7 @@ gimplify_adjust_omp_clauses (tree *list_p)
n->value |= flags | GOVD_SEEN; n->value |= flags | GOVD_SEEN;
} }
} }
else else if (!is_global_var (decl))
omp_notice_variable (ctx->outer_context, decl, true); omp_notice_variable (ctx->outer_context, decl, true);
} }
} }
......
...@@ -5584,6 +5584,12 @@ expand_omp_for_generic (struct omp_region *region, ...@@ -5584,6 +5584,12 @@ expand_omp_for_generic (struct omp_region *region,
{ {
stmt = gimple_build_assign (endvar, iend); stmt = gimple_build_assign (endvar, iend);
gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (iend)))
stmt = gimple_build_assign (fd->loop.v, iend);
else
stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, iend,
NULL_TREE);
gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
} }
if (fd->collapse > 1) if (fd->collapse > 1)
expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar); expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar);
...@@ -6000,6 +6006,12 @@ expand_omp_for_static_nochunk (struct omp_region *region, ...@@ -6000,6 +6006,12 @@ expand_omp_for_static_nochunk (struct omp_region *region,
{ {
stmt = gimple_build_assign (endvar, e); stmt = gimple_build_assign (endvar, e);
gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (e)))
stmt = gimple_build_assign (fd->loop.v, e);
else
stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, e,
NULL_TREE);
gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
} }
if (fd->collapse > 1) if (fd->collapse > 1)
expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar); expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar);
...@@ -6385,6 +6397,12 @@ expand_omp_for_static_chunk (struct omp_region *region, ...@@ -6385,6 +6397,12 @@ expand_omp_for_static_chunk (struct omp_region *region,
{ {
stmt = gimple_build_assign (endvar, e); stmt = gimple_build_assign (endvar, e);
gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING); gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING);
if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (e)))
stmt = gimple_build_assign (fd->loop.v, e);
else
stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, e,
NULL_TREE);
gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING);
} }
if (fd->collapse > 1) if (fd->collapse > 1)
expand_omp_for_init_vars (fd, &si, counts, inner_stmt, startvar); expand_omp_for_init_vars (fd, &si, counts, inner_stmt, startvar);
......
2014-05-02 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.c/simd-10.c: New test.
* testsuite/libgomp.c/simd-11.c: New test.
* testsuite/libgomp.c/simd-12.c: New test.
* testsuite/libgomp.c/simd-13.c: New test.
2014-04-24 Jakub Jelinek <jakub@redhat.com> 2014-04-24 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.c++/atomic-14.C: Allow seq_cst and * testsuite/libgomp.c++/atomic-14.C: Allow seq_cst and
......
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
/* { dg-additional-options "-mavx" { target avx_runtime } } */
int s = 0, i, u;
void
foo ()
{
#pragma omp for simd schedule(static, 32) reduction(+:s) lastprivate(u)
for (i = 0; i < 128; i++)
{
s++;
u = i;
}
if (i != 128 || s != 128 || u != 127)
__builtin_abort ();
}
int
main ()
{
foo ();
return 0;
}
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
/* { dg-additional-options "-mavx" { target avx_runtime } } */
int s = 0, i, j, u;
void
foo ()
{
#pragma omp for simd schedule(static, 32) reduction(+:s) lastprivate(u) collapse(2)
for (i = 0; i < 16; i++)
for (j = 0; j < 16; j++)
{
s++;
u = i + j;
}
if (i != 16 || j != 16 || s != 256 || u != 30)
__builtin_abort ();
}
int
main ()
{
foo ();
return 0;
}
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
/* { dg-additional-options "-mavx" { target avx_runtime } } */
int
main ()
{
int k = 0, i, s = 0;
#pragma omp parallel
#pragma omp for simd linear(k : 3) reduction(+: s) schedule (static, 16)
for (i = 0; i < 128; i++)
{
k = k + 3;
s = s + k;
}
if (s != 128 * 129 / 2 * 3) __builtin_abort ();
return 0;
}
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
/* { dg-additional-options "-mavx" { target avx_runtime } } */
int
main ()
{
int k = 0, i, s = 0;
#pragma omp parallel for simd linear(k : 3) reduction(+: s) schedule (static, 16)
for (i = 0; i < 128; i++)
{
k = k + 3;
s = s + k;
}
if (s != 128 * 129 / 2 * 3) __builtin_abort ();
return 0;
}
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