[PATCH] Fix part of PR30442

2012-06-05 Thread Richard Guenther

PR30442 shows that we do not vectorize basic-blocks if the to-be
vectorized data-references are followed by something that
find_data_references_in_stmt does not know how to analyze
(any call or asm for example).  The following re-organizes how
we create data-references in vect_analyze_data_refs for basic-blocks
employing the same trick as used later when analyzing them - stop
analysis at the stmt that we fail to analyze.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2012-06-05  Richard Guenther  rguent...@suse.de

PR tree-optimization/30442
* tree-vect-data-refs.c (vect_analyze_data_refs): For basic-block
vectorization stop analysis at the first stmt we cannot compute
a data-reference for instead of giving up completely.

* gcc.dg/vect/bb-slp-30.c: New testcase.

Index: gcc/tree-vect-data-refs.c
===
*** gcc/tree-vect-data-refs.c   (revision 188232)
--- gcc/tree-vect-data-refs.c   (working copy)
*** vect_analyze_data_refs (loop_vec_info lo
*** 2844,2854 
  }
else
  {
bb = BB_VINFO_BB (bb_vinfo);
!   res = compute_data_dependences_for_bb (bb, true,
!BB_VINFO_DATAREFS (bb_vinfo),
!BB_VINFO_DDRS (bb_vinfo));
!   if (!res)
{
  if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
fprintf (vect_dump, not vectorized: basic block contains function
--- 2844,2866 
  }
else
  {
+   gimple_stmt_iterator gsi;
+ 
bb = BB_VINFO_BB (bb_vinfo);
!   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (gsi))
!   {
! gimple stmt = gsi_stmt (gsi);
! if (!find_data_references_in_stmt (NULL, stmt,
!BB_VINFO_DATAREFS (bb_vinfo)))
!   {
! /* Mark the rest of the basic-block as unvectorizable.  */
! for (; !gsi_end_p (gsi); gsi_next (gsi))
!   STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt)) = false;
! break;
!   }
!   }
!   if (!compute_all_dependences (BB_VINFO_DATAREFS (bb_vinfo),
!   BB_VINFO_DDRS (bb_vinfo), NULL, true))
{
  if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
fprintf (vect_dump, not vectorized: basic block contains function
Index: gcc/testsuite/gcc.dg/vect/bb-slp-30.c
===
*** gcc/testsuite/gcc.dg/vect/bb-slp-30.c   (revision 0)
--- gcc/testsuite/gcc.dg/vect/bb-slp-30.c   (revision 0)
***
*** 0 
--- 1,47 
+ /* { dg-require-effective-target vect_int } */
+ 
+ int a[32];
+ 
+ void __attribute__((noinline))
+ test1(void)
+ {
+   a[0] = 1;
+   a[1] = 1;
+   a[2] = 1;
+   a[3] = 1;
+   a[4] = 1;
+   a[5] = 1;
+   a[6] = 1;
+   a[7] = 1;
+   a[8] = 1;
+   a[9] = 1;
+   a[10] = 1;
+   a[11] = 1;
+   a[12] = 1;
+   a[13] = 1;
+   a[14] = 1;
+   a[15] = 1;
+   a[16] = 1;
+   a[17] = 1;
+   a[18] = 1;
+   a[19] = 1;
+   a[20] = 1;
+   a[21] = 1;
+   a[22] = 1;
+   a[23] = 1;
+   a[24] = 1;
+   a[25] = 1;
+   a[26] = 1;
+   a[27] = 1;
+   a[28] = 1;
+   a[29] = 1;
+   a[30] = 1;
+   a[31] = 1;
+   asm ( : : : memory);
+   a[21] = 0;
+ }
+ 
+ int main() { test1(); return a[21]; }
+ 
+ /* { dg-final { scan-tree-dump-times basic block vectorized using SLP 1 
slp } } */
+ /* { dg-final { cleanup-tree-dump slp } } */


Re: [PATCH] Fix part of PR30442

2012-06-05 Thread Nathan Froyd
On Tue, Jun 05, 2012 at 02:35:30PM +0200, Richard Guenther wrote:
 Index: gcc/tree-vect-data-refs.c
 !   gimple stmt = gsi_stmt (gsi);
 !   if (!find_data_references_in_stmt (NULL, stmt,
 !  BB_VINFO_DATAREFS (bb_vinfo)))
 ! {
 !   /* Mark the rest of the basic-block as unvectorizable.  */
 !   for (; !gsi_end_p (gsi); gsi_next (gsi))

I see iteration through the rest of the basic block...

 ! STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt)) = false;

...but I don't see corresponding updates to stmt.

-Nathan


Re: [PATCH] Fix part of PR30442

2012-06-05 Thread Richard Guenther
On Tue, 5 Jun 2012, Nathan Froyd wrote:

 On Tue, Jun 05, 2012 at 02:35:30PM +0200, Richard Guenther wrote:
  Index: gcc/tree-vect-data-refs.c
  ! gimple stmt = gsi_stmt (gsi);
  ! if (!find_data_references_in_stmt (NULL, stmt,
  !BB_VINFO_DATAREFS (bb_vinfo)))
  !   {
  ! /* Mark the rest of the basic-block as unvectorizable.  */
  ! for (; !gsi_end_p (gsi); gsi_next (gsi))
 
 I see iteration through the rest of the basic block...
 
  !   STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt)) = false;
 
 ...but I don't see corresponding updates to stmt.

Eh ...

fix in testing.

Richard.


Re: [PATCH] Fix part of PR30442

2012-06-05 Thread Richard Guenther
On Tue, 5 Jun 2012, Richard Guenther wrote:

 On Tue, 5 Jun 2012, Nathan Froyd wrote:
 
  On Tue, Jun 05, 2012 at 02:35:30PM +0200, Richard Guenther wrote:
   Index: gcc/tree-vect-data-refs.c
   !   gimple stmt = gsi_stmt (gsi);
   !   if (!find_data_references_in_stmt (NULL, stmt,
   !  BB_VINFO_DATAREFS 
   (bb_vinfo)))
   ! {
   !   /* Mark the rest of the basic-block as unvectorizable.  */
   !   for (; !gsi_end_p (gsi); gsi_next (gsi))
  
  I see iteration through the rest of the basic block...
  
   ! STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt)) = false;
  
  ...but I don't see corresponding updates to stmt.
 
 Eh ...
 
 fix in testing.

Tested on x86_64-unknown-linxu-gnu, applied.

Richard.

2012-06-05  Richard Guenther  rguent...@suse.de

* tree-vect-data-refs.c (vect_analyze_data_refs): Fix last
change.

Index: gcc/tree-vect-data-refs.c
===
--- gcc/tree-vect-data-refs.c   (revision 188235)
+++ gcc/tree-vect-data-refs.c   (working copy)
@@ -2855,7 +2855,10 @@ vect_analyze_data_refs (loop_vec_info lo
{
  /* Mark the rest of the basic-block as unvectorizable.  */
  for (; !gsi_end_p (gsi); gsi_next (gsi))
-   STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt)) = false;
+   {
+ stmt = gsi_stmt (gsi);
+ STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt)) = false;
+   }
  break;
}
}