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  <rguent...@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;
+ }

Reply via email to