diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr80539.c | 22 | ||||
-rw-r--r-- | gcc/tree-chrec.c | 14 |
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. */ |