diff options
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/gimplify.c | 21 | ||||
-rw-r--r-- | gcc/omp-low.c | 18 | ||||
-rw-r--r-- | libgomp/ChangeLog | 7 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/simd-10.c | 26 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/simd-11.c | 27 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/simd-12.c | 19 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/simd-13.c | 18 |
8 files changed, 141 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 738dee31511..95978058013 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +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> * hwint.h (zext_hwi): Fix signed overflow for prec == 63. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 008a2528644..37c3778624f 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -6273,9 +6273,17 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data) 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; lang_hooks.decls.omp_finish_clause (clause); - return 0; } @@ -6314,18 +6322,17 @@ gimplify_adjust_omp_clauses (tree *list_p) if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR && ctx->outer_context && !(OMP_CLAUSE_LINEAR_NO_COPYIN (c) - && OMP_CLAUSE_LINEAR_NO_COPYOUT (c)) - && !is_global_var (decl)) + && OMP_CLAUSE_LINEAR_NO_COPYOUT (c))) { - 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, (splay_tree_key) decl); if (n == NULL || (n->value & GOVD_DATA_SHARE_CLASS) == 0) { - int flags = OMP_CLAUSE_LINEAR_NO_COPYIN (c) - ? GOVD_LASTPRIVATE : GOVD_SHARED; + int flags = GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE; if (n == NULL) omp_add_variable (ctx->outer_context, decl, flags | GOVD_SEEN); @@ -6333,7 +6340,7 @@ gimplify_adjust_omp_clauses (tree *list_p) n->value |= flags | GOVD_SEEN; } } - else + else if (!is_global_var (decl)) omp_notice_variable (ctx->outer_context, decl, true); } } diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 28b2c6aea8c..453bd294fd4 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -5584,6 +5584,12 @@ expand_omp_for_generic (struct omp_region *region, { stmt = gimple_build_assign (endvar, iend); 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) expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar); @@ -6000,6 +6006,12 @@ expand_omp_for_static_nochunk (struct omp_region *region, { stmt = gimple_build_assign (endvar, e); 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) expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar); @@ -6385,6 +6397,12 @@ expand_omp_for_static_chunk (struct omp_region *region, { stmt = gimple_build_assign (endvar, e); 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) expand_omp_for_init_vars (fd, &si, counts, inner_stmt, startvar); diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 0b26b9fdb4a..c73e60ba2da 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,10 @@ +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> * testsuite/libgomp.c++/atomic-14.C: Allow seq_cst and diff --git a/libgomp/testsuite/libgomp.c/simd-10.c b/libgomp/testsuite/libgomp.c/simd-10.c new file mode 100644 index 00000000000..70cd9f0156d --- /dev/null +++ b/libgomp/testsuite/libgomp.c/simd-10.c @@ -0,0 +1,26 @@ +/* { 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; +} diff --git a/libgomp/testsuite/libgomp.c/simd-11.c b/libgomp/testsuite/libgomp.c/simd-11.c new file mode 100644 index 00000000000..b09f0dde8ed --- /dev/null +++ b/libgomp/testsuite/libgomp.c/simd-11.c @@ -0,0 +1,27 @@ +/* { 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; +} diff --git a/libgomp/testsuite/libgomp.c/simd-12.c b/libgomp/testsuite/libgomp.c/simd-12.c new file mode 100644 index 00000000000..6685111a06e --- /dev/null +++ b/libgomp/testsuite/libgomp.c/simd-12.c @@ -0,0 +1,19 @@ +/* { 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; +} diff --git a/libgomp/testsuite/libgomp.c/simd-13.c b/libgomp/testsuite/libgomp.c/simd-13.c new file mode 100644 index 00000000000..7c817b793db --- /dev/null +++ b/libgomp/testsuite/libgomp.c/simd-13.c @@ -0,0 +1,18 @@ +/* { 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; +} |