re PR middle-end/80539 (gcc ICE at -O2 and above on valid code on x86_64-linux-gnu in "chrec_fold_plus_poly_poly")

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.

	* gcc.dg/torture/pr80539.c: New testcase.

From-SVN: r247322
This commit is contained in:
Richard Biener 2017-04-27 11:42:57 +00:00 committed by Richard Biener
parent a6d25cadec
commit 1b7c8d39fb
4 changed files with 46 additions and 2 deletions

View file

@ -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

View file

@ -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

View file

@ -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;
}

View file

@ -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. */