]> 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 13:06:00 +0000 (15:06 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 19 Jul 2011 13:06:00 +0000 (15:06 +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: r176455

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

index a0fa492467a657cb0e03d65d293b77b1ac6cfab7..be911bca5785f905d01f3fbc978d89c60ffc777a 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 4db3bc44634831f48ba23b7e48e55ff0fd573f51..c018b4c8f76c1bcd4d0d72dc43aebdeca5053dfa 100644 (file)
@@ -1953,8 +1953,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));
@@ -1973,11 +1979,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);
@@ -1996,6 +2008,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 7f7e9952ca76904638cb160d6cb39d4cd4680dca..209f4a2c03be1318ef25aefe47c54bf64baf8aa1 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;
+}