aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr80539.c22
-rw-r--r--gcc/tree-chrec.c14
4 files changed, 46 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cc20232..44580fc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-04-27 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/80539
+ * tree-chrec.c (chrec_fold_plus_poly_poly): Deal with not
+ being in loop-closed SSA form conservatively.
+ (chrec_fold_multiply_poly_poly): Likewise.
+
2017-04-27 Tamar Christina <tamar.christina@arm.com>
PR middle-end/79665
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fb60df2..a28e1a9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-04-27 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/80539
+ * gcc.dg/torture/pr80539.c: New testcase.
+
2017-04-27 Jakub Jelinek <jakub@redhat.com>
PR target/77728
diff --git a/gcc/testsuite/gcc.dg/torture/pr80539.c b/gcc/testsuite/gcc.dg/torture/pr80539.c
new file mode 100644
index 0000000..a667678
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr80539.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+signed char a, b;
+void fn1()
+{
+ signed char c, e;
+ short d;
+ if (0) {
+ for (; d;) {
+l1:
+ for (c = 7; a; c++)
+ ;
+ e = 6;
+ for (; b; e++)
+ ;
+ }
+ c -= e;
+ }
+ if (d == 7)
+ goto l1;
+ a = c;
+}
diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c
index 80a1bbd2..28c08e7 100644
--- a/gcc/tree-chrec.c
+++ b/gcc/tree-chrec.c
@@ -149,7 +149,12 @@ chrec_fold_plus_poly_poly (enum tree_code code,
/* This function should never be called for chrecs of loops that
do not belong to the same loop nest. */
- gcc_assert (loop0 == loop1);
+ if (loop0 != loop1)
+ {
+ /* It still can happen if we are not in loop-closed SSA form. */
+ gcc_assert (! loops_state_satisfies_p (LOOP_CLOSED_SSA));
+ return chrec_dont_know;
+ }
if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
{
@@ -211,7 +216,12 @@ chrec_fold_multiply_poly_poly (tree type,
chrec_fold_multiply (type, CHREC_LEFT (poly0), poly1),
CHREC_RIGHT (poly0));
- gcc_assert (loop0 == loop1);
+ if (loop0 != loop1)
+ {
+ /* It still can happen if we are not in loop-closed SSA form. */
+ gcc_assert (! loops_state_satisfies_p (LOOP_CLOSED_SSA));
+ return chrec_dont_know;
+ }
/* poly0 and poly1 are two polynomials in the same variable,
{a, +, b}_x * {c, +, d}_x -> {a*c, +, a*d + b*c + b*d, +, 2*b*d}_x. */