From: Jakub Jelinek Date: Tue, 19 Jul 2011 19:33:30 +0000 (+0200) Subject: backport: re PR middle-end/49640 (Internal compiler in C99 code (using variable-lengt... X-Git-Tag: releases/gcc-4.4.7~312 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0f5cb6b43549e4d34410e982715c02a70992edcb;p=thirdparty%2Fgcc.git backport: re PR middle-end/49640 (Internal compiler in C99 code (using variable-length arrays) and OpenMP) Backport from mainline 2011-07-07 Jakub Jelinek PR middle-end/49640 * gimplify.c (gimplify_compound_lval): For last 2 ARRAY_*REF operands and last COMPONENT_REF operand call gimplify_expr on it if non-NULL. * gcc.dg/gomp/pr49640.c: New test. From-SVN: r176486 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f653e9405855..6daa84686535 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ 2011-07-19 Jakub Jelinek Backport from mainline + 2011-07-07 Jakub Jelinek + + PR middle-end/49640 + * gimplify.c (gimplify_compound_lval): For last 2 ARRAY_*REF + operands and last COMPONENT_REF operand call gimplify_expr on it + if non-NULL. + 2011-07-04 Jakub Jelinek PR rtl-optimization/49619 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 631f54a00521..19b985fb4082 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -2053,8 +2053,14 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ret = MIN (ret, tret); } } + else + { + tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p, + is_gimple_reg, fb_rvalue); + ret = MIN (ret, tret); + } - if (!TREE_OPERAND (t, 3)) + if (TREE_OPERAND (t, 3) == NULL_TREE) { tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))); tree elmt_size = unshare_expr (array_ref_element_size (t)); @@ -2073,11 +2079,17 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ret = MIN (ret, tret); } } + else + { + tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p, post_p, + is_gimple_reg, fb_rvalue); + ret = MIN (ret, tret); + } } else if (TREE_CODE (t) == COMPONENT_REF) { /* Set the field offset into T and gimplify it. */ - if (!TREE_OPERAND (t, 2)) + if (TREE_OPERAND (t, 2) == NULL_TREE) { tree offset = unshare_expr (component_ref_field_offset (t)); tree field = TREE_OPERAND (t, 1); @@ -2096,6 +2108,12 @@ gimplify_compound_lval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ret = MIN (ret, tret); } } + else + { + tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p, + is_gimple_reg, fb_rvalue); + ret = MIN (ret, tret); + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4c256de8369f..a009368ca9e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2011-07-19 Jakub Jelinek Backport from mainline + 2011-07-07 Jakub Jelinek + + PR middle-end/49640 + * gcc.dg/gomp/pr49640.c: New test. + 2011-07-04 Jakub Jelinek PR rtl-optimization/49619 diff --git a/gcc/testsuite/gcc.dg/gomp/pr49640.c b/gcc/testsuite/gcc.dg/gomp/pr49640.c new file mode 100644 index 000000000000..6e0973864a3c --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr49640.c @@ -0,0 +1,29 @@ +/* PR middle-end/49640 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -std=gnu99 -fopenmp" } */ + +void +foo (int N, int M, int K, int P, int Q, int R, int i, int j, int k, + unsigned char x[P][Q][R], int y[N][M][K]) +{ + int ii, jj, kk; + +#pragma omp parallel for private(ii,jj,kk) + for (ii = 0; ii < P; ++ii) + for (jj = 0; jj < Q; ++jj) + for (kk = 0; kk < R; ++kk) + y[i + ii][j + jj][k + kk] = x[ii][jj][kk]; +} + +void +bar (int N, int M, int K, int P, int Q, int R, int i, int j, int k, + unsigned char x[P][Q][R], float y[N][M][K], float factor, float zero) +{ + int ii, jj, kk; + +#pragma omp parallel for private(ii,jj,kk) + for (ii = 0; ii < P; ++ii) + for (jj = 0; jj < Q; ++jj) + for (kk = 0; kk < R; ++kk) + y[i + ii][j + jj][k + kk] = factor * x[ii][jj][kk] + zero; +}