[PATCH] Fix PR59903

Richard Biener rguenther@suse.de
Thu Jan 30 15:02:00 GMT 2014


This fixes PR59903, guarding the PHI stmt case similar to the regular
one.

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

Thanks,
Richard.

2014-01-30  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/59903
	* tree-vect-loop.c (vect_transform_loop): Guard multiple-types
	check properly.

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

Index: gcc/tree-vect-loop.c
===================================================================
*** gcc/tree-vect-loop.c	(revision 207238)
--- gcc/tree-vect-loop.c	(working copy)
*************** vect_transform_loop (loop_vec_info loop_
*** 5869,5876 ****
  	      && !STMT_VINFO_LIVE_P (stmt_info))
  	    continue;
  
! 	  if ((TYPE_VECTOR_SUBPARTS (STMT_VINFO_VECTYPE (stmt_info))
! 	        != (unsigned HOST_WIDE_INT) vectorization_factor)
  	      && dump_enabled_p ())
  	    dump_printf_loc (MSG_NOTE, vect_location, "multiple-types.\n");
  
--- 5869,5877 ----
  	      && !STMT_VINFO_LIVE_P (stmt_info))
  	    continue;
  
! 	  if (STMT_VINFO_VECTYPE (stmt_info)
! 	      && (TYPE_VECTOR_SUBPARTS (STMT_VINFO_VECTYPE (stmt_info))
! 		  != (unsigned HOST_WIDE_INT) vectorization_factor)
  	      && dump_enabled_p ())
  	    dump_printf_loc (MSG_NOTE, vect_location, "multiple-types.\n");
  
Index: gcc/testsuite/gcc.dg/torture/pr59903.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr59903.c	(revision 0)
--- gcc/testsuite/gcc.dg/torture/pr59903.c	(working copy)
***************
*** 0 ****
--- 1,56 ----
+ /* { dg-do compile } */
+ 
+ int a, b, c, d, e, f, g, h, i[3], l, m, n, o, p, q, r;
+ 
+ struct S0
+ {
+   int f0;
+   int f1;
+   int f2;
+   int f3;
+ } j;
+ 
+ static int
+ fn1 (int p1)
+ {
+   return p1 || ((p1 > 0) > (e << 1)); 
+ }
+ 
+ static struct S0
+ fn2 (struct S0 p1)
+ {
+   char s;
+   struct S0 t = {0,0,0,0};
+   int u = 2;
+   for (;;)
+     {
+       if (i[0])
+ 	break;
+       for (m = 0; m < 4; m++)
+ 	for (p1.f0 = 0; p1.f0 < 3; p1.f0++)
+ 	  {
+ 	    j = t;
+ 	    t.f3 = i[p1.f0];
+ 	    o = b || 1 >> b ? 0 : a < 0;
+ 	    q = 1 % d;
+ 	    if ((g < fn1 ((1 ^ (q & 1)) | n)) ^ u)
+ 	      j.f3 |= p % 2;
+ 	    s = j.f3 > 0 ? j.f3 : j.f3 << 1;
+ 	    r = l = s && p1.f1 * c;
+ 	    h = p1.f1;
+ 	  }
+     }
+   return p1;
+ }
+ 
+ int
+ main ()
+ {
+   for (;f;)
+     {
+       struct S0 v = {0,0,0,0};
+       fn2 (v);
+       j.f3 = 0;
+     }
+   return 0;
+ }



More information about the Gcc-patches mailing list