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:
Jakub Jelinek 2015-09-10 09:31:14 +02:00 committed by Jakub Jelinek
parent 4e4d2c41b9
commit 499c20bbe4
4 changed files with 68 additions and 6 deletions

View File

@ -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>
* config/nvptx/nvptx.md (call_operation): Move bound out of loop.

View File

@ -7123,13 +7123,27 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1;
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_CHAIN (c) = OMP_FOR_CLAUSES (for_stmt);
OMP_FOR_CLAUSES (for_stmt) = c;
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->region_type == ORT_WORKSHARE
@ -7166,9 +7180,16 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
if (outer->region_type == ORT_WORKSHARE
&& outer->combined_loop)
{
if (outer->outer_context
&& (outer->outer_context->region_type
== ORT_COMBINED_PARALLEL))
n = splay_tree_lookup (outer->variables,
(splay_tree_key)decl);
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;
else if (omp_check_private (outer, decl, false))
outer = NULL;

View File

@ -1,5 +1,8 @@
2015-09-10 Jakub Jelinek <jakub@redhat.com>
PR c++/67514
* g++.dg/gomp/pr67514.C: New test.
PR c++/67511
* g++.dg/gomp/pr67511.C: New test.

View File

@ -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);
}