Honza left an ICE when we cannot compute number_of_iterations_exit in remove_redundant_iv_tests, but that can for sure happen by design (see bugzilla).
The following patch fixes it, bootstrap and regtest pending on x86_64-unknown-linux-gnu. Richard. 2012-12-14 Richard Biener <rguent...@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. Index: gcc/tree-ssa-loop-ivcanon.c =================================================================== *** gcc/tree-ssa-loop-ivcanon.c (revision 194496) --- gcc/tree-ssa-loop-ivcanon.c (working copy) *************** remove_redundant_iv_tests (struct loop * *** 555,563 **** /* 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) || !integer_zerop (niter.may_be_zero) || !niter.niter || TREE_CODE (niter.niter) != INTEGER_CST --- 555,562 ---- /* 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) ! || !integer_onep (niter.assumptions) || !integer_zerop (niter.may_be_zero) || !niter.niter || TREE_CODE (niter.niter) != INTEGER_CST Index: gcc/testsuite/gcc.dg/torture/pr55684.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr55684.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr55684.c (working copy) *************** *** 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); + }