]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/40328 (internal compiler error: in set_ssa_val_to, at tree-ssa-sccvn...
authorRichard Guenther <rguenther@suse.de>
Tue, 7 Jul 2009 12:44:32 +0000 (12:44 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 7 Jul 2009 12:44:32 +0000 (12:44 +0000)
2009-07-07  Richard Guenther  <rguenther@suse.de>

PR middle-end/40328
PR tree-optimization/40669
* tree-tailcall.c (adjust_accumulator_values): Properly
set DECL_GIMPLE_REG_P.
(adjust_return_value): Likewise.
(tree_optimize_tail_calls_1): Likewise.
* fold-const.c (fold_convert): Fold the built COMPLEX_EXPR.

* gcc.dg/pr40669.c: New testcase.
* gcc.dg/torture/pr40328.c: Likewise.

From-SVN: r149321

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr40669.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr40328.c [new file with mode: 0644]
gcc/tree-tailcall.c

index 6a11ef4ecc1754c197c591c5514336f1add36218..621f2e268bc5504735eb913f3df5f68dc3cbe76d 100644 (file)
@@ -1,3 +1,13 @@
+2009-07-07  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/40328
+       PR tree-optimization/40669
+       * tree-tailcall.c (adjust_accumulator_values): Properly
+       set DECL_GIMPLE_REG_P.
+       (adjust_return_value): Likewise.
+       (tree_optimize_tail_calls_1): Likewise.
+       * fold-const.c (fold_convert): Fold the built COMPLEX_EXPR.
+
 2009-07-02  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/40585
index 8aaae776e89c7c810b46df7e7880717849645c2a..76d8adc00b9f3a4bce2c95ba9b968b4c0c719ffa 100644 (file)
@@ -2598,9 +2598,9 @@ fold_convert (tree type, tree arg)
        case POINTER_TYPE: case REFERENCE_TYPE:
        case REAL_TYPE:
        case FIXED_POINT_TYPE:
-         return build2 (COMPLEX_EXPR, type,
-                        fold_convert (TREE_TYPE (type), arg),
-                        fold_convert (TREE_TYPE (type), integer_zero_node));
+         return fold_build2 (COMPLEX_EXPR, type,
+                             fold_convert (TREE_TYPE (type), arg),
+                             fold_convert (TREE_TYPE (type), integer_zero_node));
        case COMPLEX_TYPE:
          {
            tree rpart, ipart;
index 1f62540db16633de4caa82e0f2a30655840ed4ab..98848545a8de7d9f3aea734325b36e3899d0efad 100644 (file)
@@ -1,3 +1,10 @@
+2009-07-07  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/40328
+       PR tree-optimization/40669
+       * gcc.dg/pr40669.c: New testcase.
+       * gcc.dg/torture/pr40328.c: Likewise.
+
 2009-07-03  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/40638
diff --git a/gcc/testsuite/gcc.dg/pr40669.c b/gcc/testsuite/gcc.dg/pr40669.c
new file mode 100644 (file)
index 0000000..9a6dabb
--- /dev/null
@@ -0,0 +1,27 @@
+/* PR middle-end/40669 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math" } */
+
+double _Complex
+test (int d, int t, double *x, double *y, double *z, int n,
+      double _Complex (*fnp) (double))
+{
+  int m = n / 2;
+  double min = y[t], max = z[t], med = x[m * d + t];
+  double _Complex result = 0.0;
+
+  if (n == 0)
+    return 0.0;
+
+  if (min > med)
+    result += test (d, (t + 1) % d, x + (m + 1) * d, y, z, n - m - 1, fnp);
+  else if (max < med)
+    result += test (d, (t + 1) % d, x, y, z, m, fnp);
+  else
+    {
+      result += fnp (y[0] + x[m]);
+      result += test (d, (t + 1) % d, x + (m + 1) * d, y, z, n - m - 1, fnp);
+    }
+  return result;
+}
+
diff --git a/gcc/testsuite/gcc.dg/torture/pr40328.c b/gcc/testsuite/gcc.dg/torture/pr40328.c
new file mode 100644 (file)
index 0000000..e378e63
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-fno-tree-sra" } */
+
+_Complex float foo(void)
+{
+  _Complex float a[64] = {};
+  _Complex float x;
+  x =  a[1];
+  return x;
+}
+
index bd3da88666864ef7b101177593c71a12d20ab513..ffcf8b8895eb1a38d35ddf1939aa7ae2ebee4111 100644 (file)
@@ -566,6 +566,9 @@ adjust_accumulator_values (block_stmt_iterator bsi, tree m, tree a, edge back)
                                                       m_acc, a));
 
              tmp = create_tmp_var (ret_type, "acc_tmp");
+             if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
+                 || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
+               DECL_GIMPLE_REG_P (tmp) = 1;
              add_referenced_var (tmp);
 
              var = make_ssa_name (tmp, stmt);
@@ -646,6 +649,9 @@ adjust_return_value (basic_block bb, tree m, tree a)
                                               m_acc, ret_var));
 
       tmp = create_tmp_var (ret_type, "acc_tmp");
+      if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
+         || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
+       DECL_GIMPLE_REG_P (tmp) = 1;
       add_referenced_var (tmp);
 
       var = make_ssa_name (tmp, stmt);
@@ -662,6 +668,9 @@ adjust_return_value (basic_block bb, tree m, tree a)
                                               a_acc, var));
 
       tmp = create_tmp_var (ret_type, "acc_tmp");
+      if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
+         || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
+       DECL_GIMPLE_REG_P (tmp) = 1;
       add_referenced_var (tmp);
 
       var = make_ssa_name (tmp, stmt);
@@ -933,6 +942,9 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls)
          ret_type = TREE_TYPE (DECL_RESULT (current_function_decl));
 
          tmp = create_tmp_var (ret_type, "add_acc");
+         if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
+             || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
+           DECL_GIMPLE_REG_P (tmp) = 1;
          add_referenced_var (tmp);
 
          phi = create_phi_node (tmp, first);
@@ -949,6 +961,9 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls)
          ret_type = TREE_TYPE (DECL_RESULT (current_function_decl));
 
          tmp = create_tmp_var (ret_type, "mult_acc");
+         if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
+             || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
+           DECL_GIMPLE_REG_P (tmp) = 1;
          add_referenced_var (tmp);
 
          phi = create_phi_node (tmp, first);