From 4288fea21277dfd56522378ce31ae2461a299303 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 24 Jan 2007 21:56:45 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 ++ gcc/gimplify.c | 7 ++- gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/g++.dg/gomp/pr30494.C | 30 +++++++++++++ gcc/testsuite/gcc.dg/gomp/pr30494.c | 30 +++++++++++++ libgomp/ChangeLog | 5 +++ libgomp/testsuite/libgomp.c/pr30494.c | 64 +++++++++++++++++++++++++++ 7 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gomp/pr30494.C create mode 100644 gcc/testsuite/gcc.dg/gomp/pr30494.c create mode 100644 libgomp/testsuite/libgomp.c/pr30494.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 252b4192e3d..8d5d41189c3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2007-01-24 Jakub Jelinek + 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 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index d14e01e8202..be02fb23cbb 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2d9fc84346c..fcb4e7442a6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2007-01-24 Jakub Jelinek + 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. diff --git a/gcc/testsuite/g++.dg/gomp/pr30494.C b/gcc/testsuite/g++.dg/gomp/pr30494.C new file mode 100644 index 00000000000..3f2d120585c --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr30494.C @@ -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; +} diff --git a/gcc/testsuite/gcc.dg/gomp/pr30494.c b/gcc/testsuite/gcc.dg/gomp/pr30494.c new file mode 100644 index 00000000000..6a042ce6974 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr30494.c @@ -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; +} diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 93021993e39..e0e21298dfa 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2007-01-24 Jakub Jelinek + + PR middle-end/30494 + * testsuite/libgomp.c/pr30494.c: New test. + 2007-01-15 Tom Tromey * configure: Rebuilt. diff --git a/libgomp/testsuite/libgomp.c/pr30494.c b/libgomp/testsuite/libgomp.c/pr30494.c new file mode 100644 index 00000000000..ec6828e4406 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr30494.c @@ -0,0 +1,64 @@ +/* PR middle-end/30494 */ +/* { dg-do run } */ + +#include + +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; +}