diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-05-22 20:51:54 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-05-22 20:51:54 +0200 |
commit | c24783c49924474f54feb0c6038cba4719125634 (patch) | |
tree | ac190183444200175ba69ab2d6aaf216d6806398 /gcc | |
parent | 051e40e0cb151d3fd7a773213ee00f84043e2a25 (diff) | |
download | gcc-c24783c49924474f54feb0c6038cba4719125634.zip gcc-c24783c49924474f54feb0c6038cba4719125634.tar.gz gcc-c24783c49924474f54feb0c6038cba4719125634.tar.bz2 |
re PR middle-end/80853 (OpenMP ICE in build_outer_var_ref with array reduction)
PR middle-end/80853
* omp-low.c (lower_reduction_clauses): Pass OMP_CLAUSE_PRIVATE
as last argument to build_outer_var_ref for pointer bases of array
section reductions.
* testsuite/libgomp.c/pr80853.c: New test.
From-SVN: r248344
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/omp-low.c | 16 |
2 files changed, 20 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3dac225..b69ffc0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-05-22 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/80853 + * omp-low.c (lower_reduction_clauses): Pass OMP_CLAUSE_PRIVATE + as last argument to build_outer_var_ref for pointer bases of array + section reductions. + 2017-05-19 Martin Sebor <msebor@redhat.com> * print-tree.c (print_node): Print DECL_READ_P flag. diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 9cc2996..26e6586 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -5140,15 +5140,25 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp, omp_context *ctx) if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_REDUCTION) continue; + enum omp_clause_code ccode = OMP_CLAUSE_REDUCTION; orig_var = var = OMP_CLAUSE_DECL (c); if (TREE_CODE (var) == MEM_REF) { var = TREE_OPERAND (var, 0); if (TREE_CODE (var) == POINTER_PLUS_EXPR) var = TREE_OPERAND (var, 0); - if (TREE_CODE (var) == INDIRECT_REF - || TREE_CODE (var) == ADDR_EXPR) + if (TREE_CODE (var) == ADDR_EXPR) var = TREE_OPERAND (var, 0); + else + { + /* If this is a pointer or referenced based array + section, the var could be private in the outer + context e.g. on orphaned loop construct. Pretend this + is private variable's outer reference. */ + ccode = OMP_CLAUSE_PRIVATE; + if (TREE_CODE (var) == INDIRECT_REF) + var = TREE_OPERAND (var, 0); + } orig_var = var; if (is_variable_sized (var)) { @@ -5162,7 +5172,7 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp, omp_context *ctx) new_var = lookup_decl (var, ctx); if (var == OMP_CLAUSE_DECL (c) && omp_is_reference (var)) new_var = build_simple_mem_ref_loc (clause_loc, new_var); - ref = build_outer_var_ref (var, ctx); + ref = build_outer_var_ref (var, ctx, ccode); code = OMP_CLAUSE_REDUCTION_CODE (c); /* reduction(-:var) sums up the partial results, so it acts |