diff options
author | Richard Biener <rguenther@suse.de> | 2013-05-28 13:36:25 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-05-28 13:36:25 +0000 |
commit | fbd7e8773135e1912e36d22e0a9c9a4e6e78c43f (patch) | |
tree | 0fe965daa826d92ed1f2160c72a0c984376a261e /gcc | |
parent | bbba11173ac429c0506e8aece7dfa3eea42307a8 (diff) | |
download | gcc-fbd7e8773135e1912e36d22e0a9c9a4e6e78c43f.zip gcc-fbd7e8773135e1912e36d22e0a9c9a4e6e78c43f.tar.gz gcc-fbd7e8773135e1912e36d22e0a9c9a4e6e78c43f.tar.bz2 |
re PR tree-optimization/56787 (Vectorization fails because of CLOBBER statements)
2013-05-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/56787
* tree-vect-data-refs.c (vect_analyze_data_refs): Drop clobbers
from the list of data references.
* tree-vect-loop.c (vect_determine_vectorization_factor): Skip
clobbers.
(vect_analyze_loop_operations): Likewise.
(vect_transform_loop): Remove clobbers.
* gcc.dg/vect/pr56787.c: New testcase.
From-SVN: r199380
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr56787.c | 35 | ||||
-rw-r--r-- | gcc/tree-vect-data-refs.c | 14 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 20 |
5 files changed, 80 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6dbdf32..9f4f85e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2013-05-28 Richard Biener <rguenther@suse.de> + + PR tree-optimization/56787 + * tree-vect-data-refs.c (vect_analyze_data_refs): Drop clobbers + from the list of data references. + * tree-vect-loop.c (vect_determine_vectorization_factor): Skip + clobbers. + (vect_analyze_loop_operations): Likewise. + (vect_transform_loop): Remove clobbers. + 2013-05-28 Martin Jambor <mjambor@suse.cz> * tree-cfg.c (verify_expr): Verify that BIT_FIELD_REFs, IMAGPART_EXPRs diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7e70dce..28c6a6da 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-05-28 Richard Biener <rguenther@suse.de> + + PR tree-optimization/56787 + * gcc.dg/vect/pr56787.c: New testcase. + 2013-05-28 Janus Weil <janus@gcc.gnu.org> Tobias Burnus <burnus@net-b.de> diff --git a/gcc/testsuite/gcc.dg/vect/pr56787.c b/gcc/testsuite/gcc.dg/vect/pr56787.c new file mode 100644 index 0000000..313d477 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr56787.c @@ -0,0 +1,35 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_float } */ + +inline void +bar (const float s[5], float z[3][5]) +{ + float a = s[0], b = s[1], c = s[2], d = s[3], e = s[4]; + float f = 1.0f / a; + float u = f * b, v = f * c, w = f * d; + float p = 0.4f * (e - 0.5f * (b * u + c * v + d * w)); + z[0][3] = b * w; + z[1][3] = c * w; + z[2][3] = d * w + p; +} + +void +foo (unsigned long n, const float *__restrict u0, + const float *__restrict u1, const float *__restrict u2, + const float *__restrict u3, const float *__restrict u4, + const float *__restrict s0, const float *__restrict s1, + const float *__restrict s2, float *__restrict t3, + float *__restrict t4) +{ + unsigned long i; + for (i = 0; i < n; i++) + { + float u[5], f[3][5]; + u[0] = u0[i]; u[1] = u1[i]; u[2] = u2[i]; u[3] = u3[i]; u[4] = u4[i]; + bar (u, f); + t3[i] = s0[i] * f[0][3] + s1[i] * f[1][3] + s2[i] * f[2][3]; + } +} + +/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index c26d25d..47ecad3 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -2861,6 +2861,7 @@ vect_analyze_data_refs (loop_vec_info loop_vinfo, bool gather = false; int vf; +again: if (!dr || !DR_REF (dr)) { if (dump_enabled_p ()) @@ -2872,6 +2873,19 @@ vect_analyze_data_refs (loop_vec_info loop_vinfo, stmt = DR_STMT (dr); stmt_info = vinfo_for_stmt (stmt); + /* Discard clobbers from the dataref vector. We will remove + clobber stmts during vectorization. */ + if (gimple_clobber_p (stmt)) + { + if (i == datarefs.length () - 1) + { + datarefs.pop (); + break; + } + datarefs[i] = datarefs.pop (); + goto again; + } + /* Check that analysis of the data-ref succeeded. */ if (!DR_BASE_ADDRESS (dr) || !DR_OFFSET (dr) || !DR_INIT (dr) || !DR_STEP (dr)) diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 058e4a4..d3281e4 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -270,8 +270,9 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) gcc_assert (stmt_info); /* Skip stmts which do not need to be vectorized. */ - if (!STMT_VINFO_RELEVANT_P (stmt_info) - && !STMT_VINFO_LIVE_P (stmt_info)) + if ((!STMT_VINFO_RELEVANT_P (stmt_info) + && !STMT_VINFO_LIVE_P (stmt_info)) + || gimple_clobber_p (stmt)) { if (STMT_VINFO_IN_PATTERN_P (stmt_info) && (pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info)) @@ -1431,7 +1432,8 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo, bool slp) for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) { gimple stmt = gsi_stmt (si); - if (!vect_analyze_stmt (stmt, &need_to_vectorize, NULL)) + if (!gimple_clobber_p (stmt) + && !vect_analyze_stmt (stmt, &need_to_vectorize, NULL)) return false; } } /* bbs */ @@ -5595,7 +5597,17 @@ vect_transform_loop (loop_vec_info loop_vinfo) if (transform_pattern_stmt) stmt = pattern_stmt; else - stmt = gsi_stmt (si); + { + stmt = gsi_stmt (si); + /* During vectorization remove existing clobber stmts. */ + if (gimple_clobber_p (stmt)) + { + unlink_stmt_vdef (stmt); + gsi_remove (&si, true); + release_defs (stmt); + continue; + } + } if (dump_enabled_p ()) { |