summaryrefslogtreecommitdiff
path: root/gcc/tree-vect-generic.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-11-12 09:00:37 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-11-12 09:00:37 +0000
commit3826795b8c5540f1ec3da2c5b67957f29cde4bef (patch)
tree165702c1a3bb0b890da5040523be748bc7ca34ca /gcc/tree-vect-generic.c
parentc471289ac8af8608dab424693d9411be6042ded6 (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.c12
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. */