summaryrefslogtreecommitdiff
path: root/gcc/tree-chrec.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-04-27 11:42:57 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-04-27 11:42:57 +0000
commit1b7c8d39fb9f98a73adfd125b5f3b768c6401cd2 (patch)
tree0162d1c63f240c0d17e565190baaf3fa6ffa4ea4 /gcc/tree-chrec.c
parenta6d25cadecc8f573fa66131b8a89c9047d596794 (diff)
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
Diffstat (limited to 'gcc/tree-chrec.c')
-rw-r--r--gcc/tree-chrec.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c
index 80a1bbd2327..28c08e7115c 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. */