]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR middle-end/49640 (Internal compiler in C99 code (using variable-lengt...
authorJakub Jelinek <jakub@redhat.com>
Tue, 19 Jul 2011 19:33:30 +0000 (21:33 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 19 Jul 2011 19:33:30 +0000 (21:33 +0200)
Backport from mainline
2011-07-07  Jakub Jelinek  <jakub@redhat.com>

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

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/pr49640.c [new file with mode: 0644]

index f653e9405855388b1f42a6782e3afdfd02820e4d..6daa8468653506349b9c81b37d33736c4b1bb8ea 100644 (file)
@@ -1,6 +1,13 @@
 2011-07-19  Jakub Jelinek  <jakub@redhat.com>
 
        Backport from mainline
+       2011-07-07  Jakub Jelinek  <jakub@redhat.com>
+
+       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  <jakub@redhat.com>
 
        PR rtl-optimization/49619
index 631f54a005218c4a7b716b3bf392c5b7d44786f4..19b985fb4082247e6e96d46a9fa441f8055e33c6 100644 (file)
@@ -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);
+           }
        }
     }
 
index 4c256de8369f32d130dc30011a4ef13b49f891a3..a009368ca9e5dfff9c300d69eb45798d270576c4 100644 (file)
@@ -1,6 +1,11 @@
 2011-07-19  Jakub Jelinek  <jakub@redhat.com>
 
        Backport from mainline
+       2011-07-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/49640
+       * gcc.dg/gomp/pr49640.c: New test.
+
        2011-07-04  Jakub Jelinek  <jakub@redhat.com>
 
        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 (file)
index 0000000..6e09738
--- /dev/null
@@ -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;
+}