[PATCH] Fix PR55687

Richard Biener rguenther@suse.de
Fri Dec 14 12:07:00 GMT 2012


This fixes PR55687 - there is a latent issue in SCEV analysis.
For (int) (short) {(unsigned short) i_2, +, 1 }_4 no_evolution_in_loop_p
returns false when asked whether that CHREC has an evolution in loop 4
(which is obviously wrong).  The reason is that the machinery is not
good at filtering NOPs.

The following patch conservatively fixes it (appropriate for stage3)
to use tree_contains_chrecs instead of just checking whether the
outermost tree is a chrec.

In fact hide_evolution_in_other_loops_than_loop isn't conservative
(but luckily unused apart from from no_evolution_in_loop_p).  Instead
of trying to implement that no_evolution_in_loop_p could be simplified
much, piggy-backing on tree_contains_chrecs (and thus also made
more precise).  I'll leave that for 4.9 though (PR 55689 to track that).

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Thanks,
Richard.

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.

	* gcc.dg/torture/pr55687.c: New testcase.

Index: gcc/tree-chrec.h
===================================================================
*** gcc/tree-chrec.h	(revision 194496)
--- gcc/tree-chrec.h	(working copy)
*************** no_evolution_in_loop_p (tree chrec, unsi
*** 117,123 ****
  
    STRIP_NOPS (chrec);
    scev = hide_evolution_in_other_loops_than_loop (chrec, loop_num);
!   *res = !tree_is_chrec (scev);
    return true;
  }
  
--- 117,123 ----
  
    STRIP_NOPS (chrec);
    scev = hide_evolution_in_other_loops_than_loop (chrec, loop_num);
!   *res = !tree_contains_chrecs (scev, NULL);
    return true;
  }
  
Index: gcc/testsuite/gcc.dg/torture/pr55687.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr55687.c	(revision 0)
--- gcc/testsuite/gcc.dg/torture/pr55687.c	(working copy)
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do compile } */
+ 
+ typedef struct _IO_FILE FILE;
+ typedef short gshort;
+ typedef struct _GString GString;
+ 
+ extern char *fgets(char *, int, FILE *);
+ 
+ void verbose_text_loop (void *data)
+ {
+   FILE *dev_vcs;
+   char buf[81];
+   GString *buf_str;
+   gshort i, j;
+   while (1)      
+     {
+       for (i = 1; i <= 7; i++)
+ 	{
+ 	  while (fgets (buf, 81, dev_vcs))
+ 	    {
+ 	      for (j = 0;   j < __builtin_strlen (buf);   j++)
+ 		if (buf[j] != ' ')    
+ 		  break;   
+ 	      for (;   j < __builtin_strlen (buf);   j++)
+ 		g_string_append_c_inline (buf_str, buf[j]); 
+ 	    }
+ 	}
+     }
+ }



More information about the Gcc-patches mailing list