I am testing the following to fix PR78997.

Bootstrap / regtest running on x86_64-unknown-linux-gnu.

Richard.

2016-01-05  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/78997
        * tree-vect-slp.c (vect_mask_constant_operand_p): Handle SSA
        name condition properly.

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

Index: gcc/tree-vect-slp.c
===================================================================
*** gcc/tree-vect-slp.c (revision 244093)
--- gcc/tree-vect-slp.c (working copy)
*************** vect_mask_constant_operand_p (gimple *st
*** 2897,2905 ****
        tree cond = gimple_assign_rhs1 (stmt);
  
        if (TREE_CODE (cond) == SSA_NAME)
!       return false;
! 
!       if (opnum)
        op = TREE_OPERAND (cond, 1);
        else
        op = TREE_OPERAND (cond, 0);
--- 2897,2904 ----
        tree cond = gimple_assign_rhs1 (stmt);
  
        if (TREE_CODE (cond) == SSA_NAME)
!       op = cond;
!       else if (opnum)
        op = TREE_OPERAND (cond, 1);
        else
        op = TREE_OPERAND (cond, 0);
Index: gcc/testsuite/gcc.dg/torture/pr78997.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr78997.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr78997.c      (working copy)
***************
*** 0 ****
--- 1,106 ----
+ /* { dg-do compile } */
+ 
+ int printf (const char *, ...);
+ 
+ static short f, p, q, s, u, aa, ab, ac;
+ static int b, c, d, e, h, k, l, m, n, o, r, t, v, w, x, y, z, ad, ae, af, ag, 
ah, ai, aj, ak, al, am, an;
+ int a, ao, ap, aq, ar, g, as, at, au, av, aw, ax, ay;
+ 
+ void foo ()
+ { 
+   int ba[2], i, j, bb;
+   while (b)
+     { 
+       b++;
+       while (b)
+       { 
+         for (; aw; aw++)
+           for (; q; q++)
+             { 
+               short bc[20];
+               if (k)
+                 for (i = 0; i < 4; i++)
+                   for (j = 0; j < 4; j++)
+                     if (p)
+                       bc[i * 4 + j] = 8;
+               for (; ad; ad--)
+                 t = bc[1];
+             }
+         for (bb = 0; bb < 5; bb++)
+           if (m && v)
+             { 
+               printf ("%d", n);
+               v = g && v;
+               n = 0;
+             }
+         ab &= ba[0];
+         aw = l;
+         aa++;
+         x++;
+         while (1)
+           { 
+             int bd[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1};
+             ap = a ? ba[1] : 0;
+             if (ba[0] && o < ax)
+               { 
+                 int be[] = 
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1};
+                 for (; ae; ae++)
+                   { 
+                     e ^= ba[b] ^ aa;
+                     f = r;
+                     for (; y; y++)
+                       aj &= u | ag;
+                     int e[] = 
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1};
+                     if (a)
+                       { 
+                         r = c;
+                         aj &= ag |= aq;
+                       }
+                     av = ai * u;
+                     af = c;
+                   }
+                 au = d;
+                 p++;
+                 u = aj;
+                 a = ba[1];
+                 at = ar = af != ai && l;
+                 as = ax = f;
+                 ao = ak ? 0 : ah;
+                 aw = ao;
+               }
+             ay = c;
+             int bf[] = 
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1};
+             if (w < f)
+               { 
+                 int bg[] = {0};
+                 if (aw)
+                   break;
+               }
+             else
+               aw = aa | (h &= ag) >> d, c = b = z && am;
+             for (; w; w--)
+               l = ac ^= al |= b;
+             for (; k; k = 0)
+               { 
+                 int bh = m | s && n;
+                 m = bh;
+                 for (; t; t--)
+                   f = q ^= (c < (e < ah));
+               }
+             d = an |= b;
+             if (v)
+               { 
+                 int bi[] = 
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1};
+                 if (aw)
+                   break;
+               }
+           }
+       }
+     }
+ }
+ 
+ int main ()
+ { 
+   foo ();
+   return 0;
+ }

Reply via email to