Commit 5961d779 by Richard Biener Committed by Richard Biener

re PR tree-optimization/60012 (Vectorizer generates unnecessary loop versioning for alias)

2014-02-04  Richard Biener  <rguenther@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.

From-SVN: r207455
parent 91da0481
2014-02-04 Richard Biener <rguenther@suse.de>
PR tree-optimization/60012
* tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Apply
TBAA disambiguation to all DDRs.
2014-02-04 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR target/59788
......
2014-02-04 Richard Biener <rguenther@suse.de>
PR tree-optimization/60012
* gcc.dg/vect/pr60012.c: New testcase.
2014-02-04 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR target/59788
......
/* { 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" } } */
......@@ -235,6 +235,18 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr,
|| (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)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment