Commit 4288fea2 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 3d55c64b
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
......
......@@ -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))
......
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.
// 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;
}
/* 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;
}
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.
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment