aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2007-11-13 19:23:03 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-11-13 19:23:03 +0100
commitf6ee9faefced4284e4d602a84a745e3456a58f2e (patch)
tree2a51c38968aa2cc2736236248ae0b477efeddf34 /gcc
parent4dd9d9db1d0571e5b416f4c3e6d7b902389f0fd9 (diff)
downloadgcc-f6ee9faefced4284e4d602a84a745e3456a58f2e.zip
gcc-f6ee9faefced4284e4d602a84a745e3456a58f2e.tar.gz
gcc-f6ee9faefced4284e4d602a84a745e3456a58f2e.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr34063.C25
-rw-r--r--gcc/tree-chrec.c6
4 files changed, 42 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ffff6cc..c88d351 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,12 @@
-2007-11-13 diego novillo <dnovillo@google.com>
+2007-11-13 Jakub Jelinek <jakub@redhat.com>
- 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 <dnovillo@google.com>
+
+ 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 a1166ec..7a5f41a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,11 @@
+2007-11-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/34063
+ * g++.dg/tree-ssa/pr34063.C: New test.
+
2007-11-13 Diego Novillo <dnovillo@google.com>
- 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 0000000..994920b
--- /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 d46cfda..37b7c0d 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);
}