[PATCH] Fix PR55684

Richard Biener rguenther@suse.de
Fri Dec 14 11:55:00 GMT 2012


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  <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.

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);
+ }



More information about the Gcc-patches mailing list