diff options
author | Richard Biener <rguenther@suse.de> | 2015-11-12 09:00:37 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-11-12 09:00:37 +0000 |
commit | 3826795b8c5540f1ec3da2c5b67957f29cde4bef (patch) | |
tree | 165702c1a3bb0b890da5040523be748bc7ca34ca /gcc/tree-vect-generic.c | |
parent | c471289ac8af8608dab424693d9411be6042ded6 (diff) |
re PR tree-optimization/58497 (SLP vectorizes identical operations)
2015-11-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/58497
* tree-vect-generic.c: Include gimplify.h.
(tree_vec_extract): Lookup constant/constructor DEFs.
(do_cond): Unshare cond.
From-SVN: r230216
Diffstat (limited to 'gcc/tree-vect-generic.c')
-rw-r--r-- | gcc/tree-vect-generic.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index 5883db8abd6..af1af17a425 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-eh.h" #include "gimple-iterator.h" #include "gimplify-me.h" +#include "gimplify.h" #include "tree-cfg.h" @@ -105,6 +106,15 @@ static inline tree tree_vec_extract (gimple_stmt_iterator *gsi, tree type, tree t, tree bitsize, tree bitpos) { + if (TREE_CODE (t) == SSA_NAME) + { + gimple *def_stmt = SSA_NAME_DEF_STMT (t); + if (is_gimple_assign (def_stmt) + && (gimple_assign_rhs_code (def_stmt) == VECTOR_CST + || (bitpos + && gimple_assign_rhs_code (def_stmt) == CONSTRUCTOR))) + t = gimple_assign_rhs1 (def_stmt); + } if (bitpos) { if (TREE_CODE (type) == BOOLEAN_TYPE) @@ -1419,7 +1429,7 @@ do_cond (gimple_stmt_iterator *gsi, tree inner_type, tree a, tree b, if (TREE_CODE (TREE_TYPE (b)) == VECTOR_TYPE) b = tree_vec_extract (gsi, inner_type, b, bitsize, bitpos); tree cond = gimple_assign_rhs1 (gsi_stmt (*gsi)); - return gimplify_build3 (gsi, code, inner_type, cond, a, b); + return gimplify_build3 (gsi, code, inner_type, unshare_expr (cond), a, b); } /* Expand a vector COND_EXPR to scalars, piecewise. */ |