diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-12-16 11:34:28 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-12-16 11:34:28 +0100 |
commit | e9792e1d9d3c06ad57313443f21663f4c6626340 (patch) | |
tree | 868a7ab834e32006cd4680082ed892580ab32dfa /gcc | |
parent | cc7937daac03527ce477cad65d0ae20faa87efc3 (diff) | |
download | gcc-e9792e1d9d3c06ad57313443f21663f4c6626340.zip gcc-e9792e1d9d3c06ad57313443f21663f4c6626340.tar.gz gcc-e9792e1d9d3c06ad57313443f21663f4c6626340.tar.bz2 |
re PR libgomp/58756 (FAIL: libgomp.c/pr58392.c execution test)
PR libgomp/58756
* omp-low.c (lower_rec_input_clauses) <case OMP_CLAUSE_REDUCTION>: For
reductions without placeholder if is_simd, but when not using
GOMP_SIMD* internal calls, also perform the reduction operation
on the outer var rather than simple assignment.
* testsuite/libgomp.c/pr58756.c: New test.
From-SVN: r206011
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/omp-low.c | 22 |
2 files changed, 23 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index accfc23..a3821a8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,13 @@ +2013-12-16 Jakub Jelinek <jakub@redhat.com> + + PR libgomp/58756 + * omp-low.c (lower_rec_input_clauses) <case OMP_CLAUSE_REDUCTION>: For + reductions without placeholder if is_simd, but when not using + GOMP_SIMD* internal calls, also perform the reduction operation + on the outer var rather than simple assignment. + 2013-12-16 Yuri Rumyantsev <ysrumyan@gmail.com> + * config/i386/i386.c (slm_cost): Fix imul cost for HI. 2013-12-16 Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 05fca40..97092dd 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -3565,20 +3565,21 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, { x = omp_reduction_init (c, TREE_TYPE (new_var)); gcc_assert (TREE_CODE (TREE_TYPE (new_var)) != ARRAY_TYPE); + enum tree_code code = OMP_CLAUSE_REDUCTION_CODE (c); + + /* reduction(-:var) sums up the partial results, so it + acts identically to reduction(+:var). */ + if (code == MINUS_EXPR) + code = PLUS_EXPR; + if (is_simd && lower_rec_simd_input_clauses (new_var, ctx, max_vf, idx, lane, ivar, lvar)) { - enum tree_code code = OMP_CLAUSE_REDUCTION_CODE (c); tree ref = build_outer_var_ref (var, ctx); gimplify_assign (unshare_expr (ivar), x, &llist[0]); - /* reduction(-:var) sums up the partial results, so it - acts identically to reduction(+:var). */ - if (code == MINUS_EXPR) - code = PLUS_EXPR; - x = build2 (code, TREE_TYPE (ref), ref, ivar); ref = build_outer_var_ref (var, ctx); gimplify_assign (ref, x, &llist[1]); @@ -3587,8 +3588,13 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, { gimplify_assign (new_var, x, ilist); if (is_simd) - gimplify_assign (build_outer_var_ref (var, ctx), - new_var, dlist); + { + tree ref = build_outer_var_ref (var, ctx); + + x = build2 (code, TREE_TYPE (ref), ref, new_var); + ref = build_outer_var_ref (var, ctx); + gimplify_assign (ref, x, dlist); + } } } break; |