re PR c++/67514 (ICE in omp_add_variable)
PR c++/67514 * gimplify.c (gimplify_omp_for): For loop SIMD construct, if iterator is not explicitly determined, but is defined inside of the combined workshare region, handle it like if it has DECL_EXPR in OMP_FOR_PRE_BODY. * g++.dg/gomp/pr67514.C: New test. From-SVN: r227607
This commit is contained in:
parent
4e4d2c41b9
commit
499c20bbe4
|
@ -1,3 +1,11 @@
|
||||||
|
2015-09-10 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c++/67514
|
||||||
|
* gimplify.c (gimplify_omp_for): For loop SIMD construct, if
|
||||||
|
iterator is not explicitly determined, but is defined inside
|
||||||
|
of the combined workshare region, handle it like if it has
|
||||||
|
DECL_EXPR in OMP_FOR_PRE_BODY.
|
||||||
|
|
||||||
2015-09-09 Nathan Sidwell <nathan@acm.org>
|
2015-09-09 Nathan Sidwell <nathan@acm.org>
|
||||||
|
|
||||||
* config/nvptx/nvptx.md (call_operation): Move bound out of loop.
|
* config/nvptx/nvptx.md (call_operation): Move bound out of loop.
|
||||||
|
|
|
@ -7123,13 +7123,27 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
|
||||||
OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1;
|
OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1;
|
||||||
flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER;
|
flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER;
|
||||||
}
|
}
|
||||||
|
struct gimplify_omp_ctx *outer
|
||||||
|
= gimplify_omp_ctxp->outer_context;
|
||||||
|
if (outer && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
|
||||||
|
{
|
||||||
|
if (outer->region_type == ORT_WORKSHARE
|
||||||
|
&& outer->combined_loop)
|
||||||
|
{
|
||||||
|
n = splay_tree_lookup (outer->variables,
|
||||||
|
(splay_tree_key)decl);
|
||||||
|
if (n != NULL && (n->value & GOVD_LOCAL) != 0)
|
||||||
|
{
|
||||||
|
OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1;
|
||||||
|
flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
OMP_CLAUSE_DECL (c) = decl;
|
OMP_CLAUSE_DECL (c) = decl;
|
||||||
OMP_CLAUSE_CHAIN (c) = OMP_FOR_CLAUSES (for_stmt);
|
OMP_CLAUSE_CHAIN (c) = OMP_FOR_CLAUSES (for_stmt);
|
||||||
OMP_FOR_CLAUSES (for_stmt) = c;
|
OMP_FOR_CLAUSES (for_stmt) = c;
|
||||||
|
|
||||||
omp_add_variable (gimplify_omp_ctxp, decl, flags);
|
omp_add_variable (gimplify_omp_ctxp, decl, flags);
|
||||||
struct gimplify_omp_ctx *outer
|
|
||||||
= gimplify_omp_ctxp->outer_context;
|
|
||||||
if (outer && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
|
if (outer && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
|
||||||
{
|
{
|
||||||
if (outer->region_type == ORT_WORKSHARE
|
if (outer->region_type == ORT_WORKSHARE
|
||||||
|
@ -7166,9 +7180,16 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
|
||||||
if (outer->region_type == ORT_WORKSHARE
|
if (outer->region_type == ORT_WORKSHARE
|
||||||
&& outer->combined_loop)
|
&& outer->combined_loop)
|
||||||
{
|
{
|
||||||
if (outer->outer_context
|
n = splay_tree_lookup (outer->variables,
|
||||||
&& (outer->outer_context->region_type
|
(splay_tree_key)decl);
|
||||||
== ORT_COMBINED_PARALLEL))
|
if (n != NULL && (n->value & GOVD_LOCAL) != 0)
|
||||||
|
{
|
||||||
|
lastprivate = false;
|
||||||
|
outer = NULL;
|
||||||
|
}
|
||||||
|
else if (outer->outer_context
|
||||||
|
&& (outer->outer_context->region_type
|
||||||
|
== ORT_COMBINED_PARALLEL))
|
||||||
outer = outer->outer_context;
|
outer = outer->outer_context;
|
||||||
else if (omp_check_private (outer, decl, false))
|
else if (omp_check_private (outer, decl, false))
|
||||||
outer = NULL;
|
outer = NULL;
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
2015-09-10 Jakub Jelinek <jakub@redhat.com>
|
2015-09-10 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c++/67514
|
||||||
|
* g++.dg/gomp/pr67514.C: New test.
|
||||||
|
|
||||||
PR c++/67511
|
PR c++/67511
|
||||||
* g++.dg/gomp/pr67511.C: New test.
|
* g++.dg/gomp/pr67511.C: New test.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
// PR c++/67514
|
||||||
|
// { dg-do compile }
|
||||||
|
// { dg-options "-fopenmp" }
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void
|
||||||
|
foo (T x, T y)
|
||||||
|
{
|
||||||
|
#pragma omp parallel
|
||||||
|
#pragma omp for simd
|
||||||
|
for (T i = x; i < y; ++i)
|
||||||
|
;
|
||||||
|
#pragma omp parallel
|
||||||
|
#pragma omp for simd collapse (2)
|
||||||
|
for (T i = x; i < y; ++i)
|
||||||
|
for (T j = x; j < y; j++)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bar (int *x, int *y)
|
||||||
|
{
|
||||||
|
foo (x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
baz (int x, int y)
|
||||||
|
{
|
||||||
|
foo (x, y);
|
||||||
|
}
|
Loading…
Reference in New Issue