I am testing the following to fix PR69170.

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

Richard.

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

        PR tree-optimization/69170
        * tree-vect-slp.c (vect_build_slp_tree): Verify we are not
        building a vector from scalar results of a pattern stmt.

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

Index: gcc/tree-vect-slp.c
===================================================================
*** gcc/tree-vect-slp.c (revision 232415)
--- gcc/tree-vect-slp.c (working copy)
*************** vect_build_slp_tree (vec_info *vinfo,
*** 933,939 ****
        {
          /* If we have all children of child built up from scalars then just
             throw that away and build it up this node from scalars.  */
!         if (!SLP_TREE_CHILDREN (child).is_empty ())
            {
              slp_tree grandchild;
  
--- 966,977 ----
        {
          /* If we have all children of child built up from scalars then just
             throw that away and build it up this node from scalars.  */
!         if (!SLP_TREE_CHILDREN (child).is_empty ()
!             /* ???  Rejecting patterns this way doesn't work.  We'd have to
!                do extra work to cancel the pattern so the uses see the
!                scalar version.  */
!             && !is_pattern_stmt_p
!                   (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0])))
            {
              slp_tree grandchild;
  
*************** vect_build_slp_tree (vec_info *vinfo,
*** 1060,1066 ****
  
              /* If we have all children of child built up from scalars then
                 just throw that away and build it up this node from scalars.  
*/
!             if (!SLP_TREE_CHILDREN (child).is_empty ())
                {
                  unsigned int j;
                  slp_tree grandchild;
--- 1115,1126 ----
  
              /* If we have all children of child built up from scalars then
                 just throw that away and build it up this node from scalars.  
*/
!             if (!SLP_TREE_CHILDREN (child).is_empty ()
!                 /* ???  Rejecting patterns this way doesn't work.  We'd have
!                    to do extra work to cancel the pattern so the uses see the
!                    scalar version.  */
!                 && !is_pattern_stmt_p
!                       (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0])))
                {
                  unsigned int j;
                  slp_tree grandchild;
Index: gcc/testsuite/gcc.dg/torture/pr69170.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr69170.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr69170.c      (working copy)
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do compile } */
+ 
+ typedef long sha2_word_t;
+ typedef struct {
+     sha2_word_t length_upper, length_lower;
+     char buf[];
+ } hash_state;
+ int a;
+ hash_state b;
+ void fn1()
+ {
+   a = 0;
+   for (; a < 8; a++)
+     b.buf[a + 1024 / 8] = b.length_upper >> (1 - a) * 5;
+   a = 0;
+   for (; a < 8; a++)
+     b.buf[a + 1024 / 8 + 8] = b.length_lower >> (1 - a) * 5;
+ }

Reply via email to