This fixes PR60012 by considering TBAA for all DDRs in vectorizer
dependence analysis because the vectorizer can rely on at least
covering two scalar iterations.

It _should_ be a regression from 4.4 but I can't make a testcase
that has two TBAA disambiguatable types and is vectorized with 4.4
it seems ...

Bootstrapped and tested on x86_64-unknown-linux-gnu, ok at this stage?

Thanks,
Richard.

2014-02-03  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/60012
        * tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Apply
        TBAA disambiguation to all DDRs.

        * gcc.dg/vect/pr60012.c: New testcase.

Index: gcc/tree-vect-data-refs.c
===================================================================
--- gcc/tree-vect-data-refs.c   (revision 207417)
+++ gcc/tree-vect-data-refs.c   (working copy)
@@ -235,6 +235,18 @@ vect_analyze_data_ref_dependence (struct
       || (DR_IS_READ (dra) && DR_IS_READ (drb)))
     return false;
 
+  /* Even if we have an anti-dependence then, as the vectorized loop covers at
+     least two scalar iterations, there is always also a true dependence.
+     As the vectorizer does not re-order loads and stores we can ignore
+     the anti-dependence if TBAA can disambiguate both DRs similar to the
+     case with known negative distance anti-dependences (positive
+     distance anti-dependences would violate TBAA constraints).  */
+  if (((DR_IS_READ (dra) && DR_IS_WRITE (drb))
+       || (DR_IS_WRITE (dra) && DR_IS_READ (drb)))
+      && !alias_sets_conflict_p (get_alias_set (DR_REF (dra)),
+                                get_alias_set (DR_REF (drb))))
+    return false;
+
   /* Unknown data dependence.  */
   if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
     {

Index: gcc/testsuite/gcc.dg/vect/pr60012.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/pr60012.c (revision 0)
--- gcc/testsuite/gcc.dg/vect/pr60012.c (working copy)
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "--param vect-max-version-for-alias-checks=0" } */
+ 
+ typedef struct
+ {
+   short real;
+   short imag;
+ } complex16_t;
+ 
+ void
+ libvector_AccSquareNorm_ref (unsigned long long  *acc,
+                            const complex16_t *x, unsigned len)
+ {
+   unsigned i;
+   for (i = 0; i < len; i++)
+     acc[i] += ((unsigned long long)((int)x[i].real * x[i].real))
+       + ((unsigned long long)((int)x[i].imag * x[i].imag));
+ }
+ 
+ /* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */

Reply via email to