aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2012-12-14 13:35:03 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-12-14 13:35:03 +0000
commit13ea799b4ab20ae078ed754fa04b3c8766aa6954 (patch)
tree7045eb957d1f2631f5c062712b4103079a65ca2c /gcc
parent105e8c0682d220f6abc7320ff1ae05e20136080a (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr55684.c33
-rw-r--r--gcc/tree-ssa-loop-ivcanon.c5
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