diff options
author | Richard Biener <rguenther@suse.de> | 2012-12-14 13:35:03 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-12-14 13:35:03 +0000 |
commit | 13ea799b4ab20ae078ed754fa04b3c8766aa6954 (patch) | |
tree | 7045eb957d1f2631f5c062712b4103079a65ca2c /gcc | |
parent | 105e8c0682d220f6abc7320ff1ae05e20136080a (diff) | |
download | gcc-13ea799b4ab20ae078ed754fa04b3c8766aa6954.zip gcc-13ea799b4ab20ae078ed754fa04b3c8766aa6954.tar.gz gcc-13ea799b4ab20ae078ed754fa04b3c8766aa6954.tar.bz2 |
re PR tree-optimization/55684 (ICE in remove_redundant_iv_tests, at tree-ssa-loop-ivcanon.c:559)
2012-12-14 Richard Biener <rguenther@suse.de>
PR tree-optimization/55684
* tree-ssa-loop-ivcanon.c (remove_redundant_iv_tests): Handle
gracefully the case where we cannot compute the number of
iterations at an exit.
* gcc.dg/torture/pr55684.c: New testcase.
From-SVN: r194499
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr55684.c | 33 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivcanon.c | 5 |
4 files changed, 47 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0f5b0af..fe4e1e1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2012-12-14 Richard Biener <rguenther@suse.de> + PR tree-optimization/55684 + * tree-ssa-loop-ivcanon.c (remove_redundant_iv_tests): Handle + gracefully the case where we cannot compute the number of + iterations at an exit. + +2012-12-14 Richard Biener <rguenther@suse.de> + PR tree-optimization/55687 * tree-chrec.h (no_evolution_in_loop_p): Properly use tree_contains_chrecs. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c8578bf4..d1020d0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2012-12-14 Richard Biener <rguenther@suse.de> + PR tree-optimization/55684 + * gcc.dg/torture/pr55684.c: New testcase. + +2012-12-14 Richard Biener <rguenther@suse.de> + PR tree-optimization/55687 * gcc.dg/torture/pr55687.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr55684.c b/gcc/testsuite/gcc.dg/torture/pr55684.c new file mode 100644 index 0000000..7002a373 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr55684.c @@ -0,0 +1,33 @@ +/* { dg-do compile } */ + +typedef struct _IO_FILE FILE; +unsigned long int strtoul(const char *, char **, int); +char *fgets(char *, int, FILE *); +struct ihexrec { + unsigned char reclen; + unsigned char data[256]; +}; +static void srec_readrec(struct ihexrec * srec, char * rec) +{ + int i, j; + char buf[8]; + int offset = 0, len; + char * e; + for (i=0; j<srec->reclen; j++) + { + if (offset+2 > len) + return; + for (i=0; i<2; i++) + buf[i] = rec[offset++]; + srec->data[j] = strtoul(buf, &e, 16); + } + for (i=0; i<2; i++) + buf[i] = rec[offset++]; +} +void srec2b(FILE *inf) +{ + char buffer[256]; + struct ihexrec srec; + while (fgets(buffer,256,inf)!=(void *)0) + srec_readrec(&srec, buffer); +} diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index d54f704..eef613c 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -555,9 +555,8 @@ remove_redundant_iv_tests (struct loop *loop) /* Only when we know the actual number of iterations, not just a bound, we can remove the exit. */ if (!number_of_iterations_exit (loop, exit_edge, - &niter, false, false)) - gcc_unreachable (); - if (!integer_onep (niter.assumptions) + &niter, false, false) + || !integer_onep (niter.assumptions) || !integer_zerop (niter.may_be_zero) || !niter.niter || TREE_CODE (niter.niter) != INTEGER_CST |