]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/55684 (ICE in remove_redundant_iv_tests, at tree-ssa-loop...
authorRichard Biener <rguenther@suse.de>
Fri, 14 Dec 2012 13:35:03 +0000 (13:35 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 14 Dec 2012 13:35:03 +0000 (13:35 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr55684.c [new file with mode: 0644]
gcc/tree-ssa-loop-ivcanon.c

index 0f5b0af6861a530833fbaad1e3332bc71a00cabb..fe4e1e165823e10bdc35c85a717aa546cdda559e 100644 (file)
@@ -1,3 +1,10 @@
+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
index c8578bf465b7c065eaf3d5a98918eb3ab4f56e01..d1020d0b70868e302d6d0f9889da8843b0ffae49 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gcc.dg/torture/pr55684.c b/gcc/testsuite/gcc.dg/torture/pr55684.c
new file mode 100644 (file)
index 0000000..7002a37
--- /dev/null
@@ -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);
+}
index d54f704725afb5570165b785ea7078ace3719529..eef613c4a775cf64de57c4a753d7ef87e30e85b3 100644 (file)
@@ -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