diff options
author | Dorit Nuzman <dorit@gcc.gnu.org> | 2007-10-23 19:50:18 +0000 |
---|---|---|
committer | Dorit Nuzman <dorit@gcc.gnu.org> | 2007-10-23 19:50:18 +0000 |
commit | 68cba9eee7fe480459a7277a38ab61f1b5fa2af6 (patch) | |
tree | 047fe26d7d3b1ec9ba7ad07a291d09bd776edf5b /gcc | |
parent | d1ed933d78374d661171a23892aeca9980804ca7 (diff) | |
download | gcc-68cba9eee7fe480459a7277a38ab61f1b5fa2af6.zip gcc-68cba9eee7fe480459a7277a38ab61f1b5fa2af6.tar.gz gcc-68cba9eee7fe480459a7277a38ab61f1b5fa2af6.tar.bz2 |
re PR tree-optimization/33860 (ICE in vectorizable_load, at tree-vect-transform.c:5503)
PR tree-optimization/33860
* tree-vect-transform.c (vect_analyze_data_ref_access): Don't allow
interleaved accesses in case the dr is inside the inner-loop during
outer-loop vectorization.
From-SVN: r129587
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr33860.cc | 25 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr33860a.cc | 25 | ||||
-rw-r--r-- | gcc/tree-vect-analyze.c | 4 |
5 files changed, 68 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9217faa..a8d8a9f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-10-23 Dorit Nuzman <dorit@il.ibm.com> + + PR tree-optimization/33860 + * tree-vect-transform.c (vect_analyze_data_ref_access): Don't allow + interleaved accesses in case the dr is inside the inner-loop during + outer-loop vectorization. + 2007-10-23 Eric Botcazou <ebotcazou@libertysurf.fr> * doc/rtl.texi (Flags): Fix MEM_SCALAR_P entry. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9a78b16..a1bf668 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2007-10-23 Martin Michlmayr <tbm@cyrius.com> + Dorit Nuzman <dorit@il.ibm.com> + + PR tree-optimization/33860 + * g++.dg/vect/pr33860.cc: New test. + * g++.dg/vect/pr33860a.cc: New test. + 2007-10-23 Tehila Meyzels <tehila@il.ibm.com> Revital Eres <eres@il.ibm.com> diff --git a/gcc/testsuite/g++.dg/vect/pr33860.cc b/gcc/testsuite/g++.dg/vect/pr33860.cc new file mode 100644 index 0000000..e70ec67 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr33860.cc @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* Testcase by Martin Michlmayr <tbm@cyrius.com> */ + +class Matrix +{ + public: + double data[4][4]; + Matrix operator* (const Matrix matrix) const; + void makeRotationAboutVector (void); +}; +void Matrix::makeRotationAboutVector (void) +{ + Matrix irx; + *this = irx * (*this); +} +Matrix Matrix::operator* (const Matrix matrix) const +{ + Matrix ret; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + ret.data[j][i] = matrix.data[j][2] + matrix.data[j][3]; + return ret; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr33860a.cc b/gcc/testsuite/g++.dg/vect/pr33860a.cc new file mode 100644 index 0000000..a4f7bec --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr33860a.cc @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* Testcase by Martin Michlmayr <tbm@cyrius.com> */ + +class Matrix +{ + public: + float data[4][4] __attribute__ ((__aligned__(16))); + Matrix operator* (const Matrix matrix) const; + void makeRotationAboutVector (void); +}; +void Matrix::makeRotationAboutVector (void) +{ + Matrix irx; + *this = irx * (*this); +} +Matrix Matrix::operator* (const Matrix matrix) const +{ + Matrix ret; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + ret.data[j][i] = matrix.data[j][2] + matrix.data[j][3]; + return ret; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/tree-vect-analyze.c b/gcc/tree-vect-analyze.c index b91fbc0..ff81f9d 100644 --- a/gcc/tree-vect-analyze.c +++ b/gcc/tree-vect-analyze.c @@ -2322,6 +2322,10 @@ vect_analyze_data_ref_access (struct data_reference *dr) if (nested_in_vect_loop_p (loop, stmt)) { + /* Interleaved accesses are not yet supported within outer-loop + vectorization for references in the inner-loop. */ + DR_GROUP_FIRST_DR (vinfo_for_stmt (stmt)) = NULL_TREE; + /* For the rest of the analysis we use the outer-loop step. */ step = STMT_VINFO_DR_STEP (stmt_info); dr_step = TREE_INT_CST_LOW (step); |