This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR56812
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 3 Apr 2013 10:00:16 +0200 (CEST)
- Subject: [PATCH] Fix PR56812
This fixes PR56812 - the vectorizer TLC got rid of special-casing
interleaving chain members in data dependence analysis. I re-instantiated
that after having a quick look why dependence analysis doesn't
disambiguate them (it should - known issue, on my TODO list).
And added a testcase to make sure we don't regress.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard.
2013-04-03 Richard Biener <rguenther@suse.de>
PR tree-optimization/56812
* tree-vect-data-refs.c (vect_slp_analyze_data_ref_dependence):
DRs of the same interleaving chain are independent.
* g++.dg/vect/slp-pr56812.cc: New testcase.
Index: gcc/tree-vect-data-refs.c
===================================================================
*** gcc/tree-vect-data-refs.c (revision 197356)
--- gcc/tree-vect-data-refs.c (working copy)
*************** vect_slp_analyze_data_ref_dependence (st
*** 484,489 ****
--- 484,496 ----
if (DR_IS_READ (dra) && DR_IS_READ (drb))
return false;
+ /* If dra and drb are part of the same interleaving chain consider
+ them independent. */
+ if (STMT_VINFO_GROUPED_ACCESS (vinfo_for_stmt (DR_STMT (dra)))
+ && (GROUP_FIRST_ELEMENT (vinfo_for_stmt (DR_STMT (dra)))
+ == GROUP_FIRST_ELEMENT (vinfo_for_stmt (DR_STMT (drb)))))
+ return false;
+
/* Unknown data dependence. */
if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
{
Index: gcc/testsuite/g++.dg/vect/slp-pr56812.cc
===================================================================
*** gcc/testsuite/g++.dg/vect/slp-pr56812.cc (revision 0)
--- gcc/testsuite/g++.dg/vect/slp-pr56812.cc (working copy)
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-require-effective-target vect_float } */
+ /* { dg-options "-O3 -funroll-loops -fdump-tree-slp-details" } */
+
+ class mydata {
+ public:
+ mydata() {Set(-1.0);}
+ void Set (float);
+ static int upper() {return 8;}
+ float data[8];
+ };
+
+ void mydata::Set (float x)
+ {
+ for (int i=0; i<upper(); i++)
+ data[i] = x;
+ }
+
+ /* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp" } } */
+ /* { dg-final { cleanup-tree-dump "slp" } } */