Commit 3d55c64b by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/30421 (incorrect warning when using firstprivate and lastprivate clauses)

	PR middle-end/30421
	* omp-low.c (lower_omp_for_lastprivate): Add dlist argument.
	If lower_lastprivate_clauses emits some statements, append them
	to dlist rather than body_p and to body_p append an initializer.
	(lower_omp_for): Adjust caller.

	* gcc.dg/gomp/pr30421.c: New test.

From-SVN: r121131
parent 62df2805
2007-01-24 Jakub Jelinek <jakub@redhat.com>
PR middle-end/30421
* omp-low.c (lower_omp_for_lastprivate): Add dlist argument.
If lower_lastprivate_clauses emits some statements, append them
to dlist rather than body_p and to body_p append an initializer.
(lower_omp_for): Adjust caller.
2007-01-24 Steve Ellcey <sje@cup.hp.com> 2007-01-24 Steve Ellcey <sje@cup.hp.com>
* target.h (globalize_decl_name): New. * target.h (globalize_decl_name): New.
......
...@@ -1601,7 +1601,7 @@ omp_reduction_init (tree clause, tree type) ...@@ -1601,7 +1601,7 @@ omp_reduction_init (tree clause, tree type)
static void static void
lower_rec_input_clauses (tree clauses, tree *ilist, tree *dlist, lower_rec_input_clauses (tree clauses, tree *ilist, tree *dlist,
omp_context *ctx) omp_context *ctx)
{ {
tree_stmt_iterator diter; tree_stmt_iterator diter;
tree c, dtor, copyin_seq, x, args, ptr; tree c, dtor, copyin_seq, x, args, ptr;
...@@ -3986,13 +3986,14 @@ lower_omp_critical (tree *stmt_p, omp_context *ctx) ...@@ -3986,13 +3986,14 @@ lower_omp_critical (tree *stmt_p, omp_context *ctx)
/* A subroutine of lower_omp_for. Generate code to emit the predicate /* A subroutine of lower_omp_for. Generate code to emit the predicate
for a lastprivate clause. Given a loop control predicate of (V for a lastprivate clause. Given a loop control predicate of (V
cond N2), we gate the clause on (!(V cond N2)). The lowered form cond N2), we gate the clause on (!(V cond N2)). The lowered form
is appended to *BODY_P. */ is appended to *DLIST, iterator initialization is appended to
*BODY_P. */
static void static void
lower_omp_for_lastprivate (struct omp_for_data *fd, tree *body_p, lower_omp_for_lastprivate (struct omp_for_data *fd, tree *body_p,
struct omp_context *ctx) tree *dlist, struct omp_context *ctx)
{ {
tree clauses, cond; tree clauses, cond, stmts, vinit, t;
enum tree_code cond_code; enum tree_code cond_code;
cond_code = fd->cond_code; cond_code = fd->cond_code;
...@@ -4010,7 +4011,24 @@ lower_omp_for_lastprivate (struct omp_for_data *fd, tree *body_p, ...@@ -4010,7 +4011,24 @@ lower_omp_for_lastprivate (struct omp_for_data *fd, tree *body_p,
cond = build2 (cond_code, boolean_type_node, fd->v, fd->n2); cond = build2 (cond_code, boolean_type_node, fd->v, fd->n2);
clauses = OMP_FOR_CLAUSES (fd->for_stmt); clauses = OMP_FOR_CLAUSES (fd->for_stmt);
lower_lastprivate_clauses (clauses, cond, body_p, ctx); stmts = NULL;
lower_lastprivate_clauses (clauses, cond, &stmts, ctx);
if (stmts != NULL)
{
append_to_statement_list (stmts, dlist);
/* Optimize: v = 0; is usually cheaper than v = some_other_constant. */
vinit = fd->n1;
if (cond_code == EQ_EXPR
&& host_integerp (fd->n2, 0)
&& ! integer_zerop (fd->n2))
vinit = build_int_cst (TREE_TYPE (fd->v), 0);
/* Initialize the iterator variable, so that threads that don't execute
any iterations don't execute the lastprivate clauses by accident. */
t = build2 (GIMPLE_MODIFY_STMT, void_type_node, fd->v, vinit);
gimplify_and_add (t, body_p);
}
} }
...@@ -4066,6 +4084,8 @@ lower_omp_for (tree *stmt_p, omp_context *ctx) ...@@ -4066,6 +4084,8 @@ lower_omp_for (tree *stmt_p, omp_context *ctx)
/* Once lowered, extract the bounds and clauses. */ /* Once lowered, extract the bounds and clauses. */
extract_omp_for_data (stmt, &fd); extract_omp_for_data (stmt, &fd);
lower_omp_for_lastprivate (&fd, body_p, &dlist, ctx);
append_to_statement_list (stmt, body_p); append_to_statement_list (stmt, body_p);
append_to_statement_list (OMP_FOR_BODY (stmt), body_p); append_to_statement_list (OMP_FOR_BODY (stmt), body_p);
...@@ -4074,7 +4094,6 @@ lower_omp_for (tree *stmt_p, omp_context *ctx) ...@@ -4074,7 +4094,6 @@ lower_omp_for (tree *stmt_p, omp_context *ctx)
append_to_statement_list (t, body_p); append_to_statement_list (t, body_p);
/* After the loop, add exit clauses. */ /* After the loop, add exit clauses. */
lower_omp_for_lastprivate (&fd, &dlist, ctx);
lower_reduction_clauses (OMP_FOR_CLAUSES (stmt), body_p, ctx); lower_reduction_clauses (OMP_FOR_CLAUSES (stmt), body_p, ctx);
append_to_statement_list (dlist, body_p); append_to_statement_list (dlist, body_p);
......
2007-01-24 Jakub Jelinek <jakub@redhat.com>
PR middle-end/30421
* gcc.dg/gomp/pr30421.c: New test.
2007-01-24 Steve Ellcey <sje@cup.hp.com> 2007-01-24 Steve Ellcey <sje@cup.hp.com>
* gcc.target/ia64/versionid-1.c: New test. * gcc.target/ia64/versionid-1.c: New test.
/* PR middle-end/30421 */
/* { dg-do compile } */
/* { dg-options "-O2 -fopenmp -Wall" } */
int
foo ()
{
int a = 0, i;
#pragma omp parallel for firstprivate(a) lastprivate(a)
for (i = 0; i < 10; i++)
a += i;
return a;
}
int
bar ()
{
int a = 0, i;
#pragma omp parallel for firstprivate(a) lastprivate(a) schedule(static, 2)
for (i = 0; i < 10; i++)
a += i;
return a;
}
int
baz ()
{
int a = 0, i;
#pragma omp parallel for firstprivate(a) lastprivate(a) schedule(dynamic)
for (i = 0; i < 10; i++)
a += i;
return a;
}
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