re PR middle-end/30494 (ICE with VLA and openmp)

PR middle-end/30494
	* gimplify.c (omp_add_variable): Don't call omp_notice_variable
	on TYPE_SIZE_UNIT for GOVD_LOCAL VLAs.

	* gcc.dg/gomp/pr30494.c: New test.
	* g++.dg/gomp/pr30494.C: New test.

	* testsuite/libgomp.c/pr30494.c: New test.

From-SVN: r121132
This commit is contained in:
Jakub Jelinek 2007-01-24 21:56:45 +01:00 committed by Jakub Jelinek
parent 3d55c64b49
commit 4288fea212
7 changed files with 142 additions and 2 deletions

View File

@ -1,5 +1,9 @@
2007-01-24 Jakub Jelinek <jakub@redhat.com>
PR middle-end/30494
* gimplify.c (omp_add_variable): Don't call omp_notice_variable
on TYPE_SIZE_UNIT for GOVD_LOCAL VLAs.
PR middle-end/30421
* omp-low.c (lower_omp_for_lastprivate): Add dlist argument.
If lower_lastprivate_clauses emits some statements, append them

View File

@ -4505,8 +4505,11 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
/* We're going to make use of the TYPE_SIZE_UNIT at least in the
alloca statement we generate for the variable, so make sure it
is available. This isn't automatically needed for the SHARED
case, since we won't be allocating local storage then. */
else
case, since we won't be allocating local storage then.
For local variables TYPE_SIZE_UNIT might not be gimplified yet,
in this case omp_notice_variable will be called later
on when it is gimplified. */
else if (! (flags & GOVD_LOCAL))
omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
}
else if (lang_hooks.decls.omp_privatize_by_reference (decl))

View File

@ -1,5 +1,9 @@
2007-01-24 Jakub Jelinek <jakub@redhat.com>
PR middle-end/30494
* gcc.dg/gomp/pr30494.c: New test.
* g++.dg/gomp/pr30494.C: New test.
PR middle-end/30421
* gcc.dg/gomp/pr30421.c: New test.

View File

@ -0,0 +1,30 @@
// PR middle-end/30494
// { dg-do compile }
int
foo (int n)
{
int i;
#pragma omp for
for (i = 0; i < 6; i++)
{
int v[n], w[n * 3 + i];
v[0] = 1;
w[0] = 2;
}
return 0;
}
int
bar (int n)
{
int i;
#pragma parallel omp for
for (i = 0; i < 6; i++)
{
int v[n], w[n * 3 + i];
v[0] = 1;
w[0] = 2;
}
return 0;
}

View File

@ -0,0 +1,30 @@
/* PR middle-end/30494 */
/* { dg-do compile } */
int
foo (int n)
{
int i;
#pragma omp for
for (i = 0; i < 6; i++)
{
int v[n], w[n * 3 + i];
v[0] = 1;
w[0] = 2;
}
return 0;
}
int
bar (int n)
{
int i;
#pragma parallel omp for
for (i = 0; i < 6; i++)
{
int v[n], w[n * 3 + i];
v[0] = 1;
w[0] = 2;
}
return 0;
}

View File

@ -1,3 +1,8 @@
2007-01-24 Jakub Jelinek <jakub@redhat.com>
PR middle-end/30494
* testsuite/libgomp.c/pr30494.c: New test.
2007-01-15 Tom Tromey <tromey@redhat.com>
* configure: Rebuilt.

View File

@ -0,0 +1,64 @@
/* PR middle-end/30494 */
/* { dg-do run } */
#include <omp.h>
int errors;
int
check (int m, int i, int *v, int *w)
{
int j;
int n = omp_get_thread_num ();
for (j = 0; j < m; j++)
if (v[j] != j + n)
#pragma omp atomic
errors += 1;
for (j = 0; j < m * 3 + i; j++)
if (w[j] != j + 10 + n)
#pragma omp atomic
errors += 1;
}
int
foo (int n, int m)
{
int i;
#pragma omp for
for (i = 0; i < 6; i++)
{
int v[n], w[n * 3 + i], j;
for (j = 0; j < n; j++)
v[j] = j + omp_get_thread_num ();
for (j = 0; j < n * 3 + i; j++)
w[j] = j + 10 + omp_get_thread_num ();
check (m, i, v, w);
}
return 0;
}
int
bar (int n, int m)
{
int i;
#pragma omp parallel for num_threads (4)
for (i = 0; i < 6; i++)
{
int v[n], w[n * 3 + i], j;
for (j = 0; j < n; j++)
v[j] = j + omp_get_thread_num ();
for (j = 0; j < n * 3 + i; j++)
w[j] = j + 10 + omp_get_thread_num ();
check (m, i, v, w);
}
return 0;
}
int
main (void)
{
#pragma omp parallel num_threads (3)
foo (128, 128);
bar (256, 256);
return 0;
}