From: Richard Guenther Date: Tue, 7 Jul 2009 12:44:32 +0000 (+0000) Subject: re PR middle-end/40328 (internal compiler error: in set_ssa_val_to, at tree-ssa-sccvn... X-Git-Tag: releases/gcc-4.3.4~87 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b7fbb20dfe12f67a724e817b1525000d5afc6108;p=thirdparty%2Fgcc.git re PR middle-end/40328 (internal compiler error: in set_ssa_val_to, at tree-ssa-sccvn.c:1811) 2009-07-07 Richard Guenther 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6a11ef4ecc17..621f2e268bc5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2009-07-07 Richard Guenther + + 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 PR middle-end/40585 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 8aaae776e89c..76d8adc00b9f 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1f62540db166..98848545a8de 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-07-07 Richard Guenther + + 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 PR fortran/40638 diff --git a/gcc/testsuite/gcc.dg/pr40669.c b/gcc/testsuite/gcc.dg/pr40669.c new file mode 100644 index 000000000000..9a6dabb6e6dc --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr40669.c @@ -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 index 000000000000..e378e63c00ab --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr40328.c @@ -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; +} + diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c index bd3da8866686..ffcf8b8895eb 100644 --- a/gcc/tree-tailcall.c +++ b/gcc/tree-tailcall.c @@ -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);