From: Jakub Jelinek Date: Tue, 13 Nov 2007 18:23:03 +0000 (+0100) Subject: re PR tree-optimization/34063 (ICE: build2_stat, at tree.c:3115) X-Git-Tag: releases/gcc-4.3.0~1535 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f6ee9faefced4284e4d602a84a745e3456a58f2e;p=thirdparty%2Fgcc.git re PR tree-optimization/34063 (ICE: build2_stat, at tree.c:3115) PR tree-optimization/34063 * tree-chrec.c (chrec_evaluate): Put CHREC_LEFT based argument as first chrec_fold_plus operand rather than second. * g++.dg/tree-ssa/pr34063.C: New test. From-SVN: r130151 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ffff6ccaa2ca..c88d351a1124 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ -2007-11-13 diego novillo +2007-11-13 Jakub Jelinek - pr 33870 + PR tree-optimization/34063 + * tree-chrec.c (chrec_evaluate): Put CHREC_LEFT based argument + as first chrec_fold_plus operand rather than second. + +2007-11-13 Diego Novillo + + PR tree-optimization/33870 * tree.h (strcut tree_memory_tag): add field unpartitionable. remove field in_nested_struct. (struct tree_struct_field_tag): add field nesting_level. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a1166ece4a98..7a5f41af85bb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ +2007-11-13 Jakub Jelinek + + PR tree-optimization/34063 + * g++.dg/tree-ssa/pr34063.C: New test. + 2007-11-13 Diego Novillo - PR 33870 + PR tree-optimization/33870 * gcc.c-torture/execute/pr33870-1.c: New test. * gcc.dg/tree-ssa/alias-16.c: New test. diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr34063.C b/gcc/testsuite/g++.dg/tree-ssa/pr34063.C new file mode 100644 index 000000000000..994920bb923f --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr34063.C @@ -0,0 +1,25 @@ +// { PR tree-optimization/34063 } +// { dg-do compile } +// { dg-options "-O2" } + +struct S +{ + double e[9]; + + double const & + operator() (int r, int c) const + { + return e[r * 3 + c]; + } +}; + +void +foo() +{ + S r; + double *p; + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + for (int l = k + 1; l < 3; l++) + *p++ = r (k, 0) * r (l, j) + r (k, j) * r (l, 0); +} diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c index d46cfda5529a..37b7c0d671d9 100644 --- a/gcc/tree-chrec.c +++ b/gcc/tree-chrec.c @@ -522,13 +522,13 @@ chrec_evaluate (unsigned var, tree chrec, tree n, unsigned int k) if (TREE_CODE (chrec) == POLYNOMIAL_CHREC && CHREC_VARIABLE (chrec) == var) { - arg0 = chrec_evaluate (var, CHREC_RIGHT (chrec), n, k + 1); - if (arg0 == chrec_dont_know) + arg1 = chrec_evaluate (var, CHREC_RIGHT (chrec), n, k + 1); + if (arg1 == chrec_dont_know) return chrec_dont_know; binomial_n_k = tree_fold_binomial (type, n, k); if (!binomial_n_k) return chrec_dont_know; - arg1 = fold_build2 (MULT_EXPR, type, + arg0 = fold_build2 (MULT_EXPR, type, CHREC_LEFT (chrec), binomial_n_k); return chrec_fold_plus (type, arg0, arg1); }