diff options
author | Richard Biener <rguenther@suse.de> | 2015-11-10 10:12:13 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-11-10 10:12:13 +0000 |
commit | ef785d9f193c035350a2f01223ccd87391226323 (patch) | |
tree | 042b6a7ed561f4faee1df0cbd4d17f0b81ca0d55 /gcc | |
parent | a6524bba206a001a83e60548007f92c701cd0a86 (diff) | |
download | gcc-ef785d9f193c035350a2f01223ccd87391226323.zip gcc-ef785d9f193c035350a2f01223ccd87391226323.tar.gz gcc-ef785d9f193c035350a2f01223ccd87391226323.tar.bz2 |
tree-vect-data-refs.c (vect_slp_analyze_node_dependences): Handle memory using/clobbering stmts without a STMT_VINFO_DATA_REF conservatively.
2015-11-10 Richard Biener <rguenther@suse.de>
* tree-vect-data-refs.c (vect_slp_analyze_node_dependences):
Handle memory using/clobbering stmts without a STMT_VINFO_DATA_REF
conservatively.
From-SVN: r230094
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-vect-data-refs.c | 23 |
2 files changed, 18 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6816374..9db12db3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2015-11-10 Richard Biener <rguenther@suse.de> + * tree-vect-data-refs.c (vect_slp_analyze_node_dependences): + Handle memory using/clobbering stmts without a STMT_VINFO_DATA_REF + conservatively. + +2015-11-10 Richard Biener <rguenther@suse.de> + PR tree-optimization/56118 * tree-vect-slp.c (vect_bb_vectorization_profitable_p): Make equal cost favor vectorized version. diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 6e32391..77313ec 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -573,21 +573,22 @@ vect_slp_analyze_node_dependences (slp_instance instance, slp_tree node) gimple *access = SLP_TREE_SCALAR_STMTS (node)[k]; if (access == last_access) continue; - stmt_vec_info access_stmt_info = vinfo_for_stmt (access); - gimple_stmt_iterator gsi = gsi_for_stmt (access); - gsi_next (&gsi); - for (; gsi_stmt (gsi) != last_access; gsi_next (&gsi)) + data_reference *dr_a = STMT_VINFO_DATA_REF (vinfo_for_stmt (access)); + for (gimple_stmt_iterator gsi = gsi_for_stmt (access); + gsi_stmt (gsi) != last_access; gsi_next (&gsi)) { gimple *stmt = gsi_stmt (gsi); - stmt_vec_info stmt_info = vinfo_for_stmt (stmt); - if (!STMT_VINFO_DATA_REF (stmt_info) - || (DR_IS_READ (STMT_VINFO_DATA_REF (stmt_info)) - && DR_IS_READ (STMT_VINFO_DATA_REF (access_stmt_info)))) + if (! gimple_vuse (stmt) + || (DR_IS_READ (dr_a) && ! gimple_vdef (stmt))) continue; - ddr_p ddr = initialize_data_dependence_relation - (STMT_VINFO_DATA_REF (access_stmt_info), - STMT_VINFO_DATA_REF (stmt_info), vNULL); + /* If we couldn't record a (single) data reference for this + stmt we have to give up. */ + data_reference *dr_b = STMT_VINFO_DATA_REF (vinfo_for_stmt (stmt)); + if (!dr_b) + return false; + + ddr_p ddr = initialize_data_dependence_relation (dr_a, dr_b, vNULL); if (vect_slp_analyze_data_ref_dependence (ddr)) { /* ??? If the dependence analysis failed we can resort to the |