aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-slp.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-10-10 11:17:13 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-10-10 11:17:13 +0000
commitf1485e5b24f83af957e3d528dc80cd88b67acdc5 (patch)
treedcad327648e25cff091d2c3a264b952d5ec44924 /gcc/tree-vect-slp.c
parent18cda88d873b67cfa06ac2a9c8b2e85468a73f4c (diff)
downloadgcc-f1485e5b24f83af957e3d528dc80cd88b67acdc5.zip
gcc-f1485e5b24f83af957e3d528dc80cd88b67acdc5.tar.gz
gcc-f1485e5b24f83af957e3d528dc80cd88b67acdc5.tar.bz2
re PR tree-optimization/63379 (Incorrect vectorization when enabling SSE and O3, initialises loop with wrong value)
2014-10-10 Richard Biener <rguenther@suse.de> PR tree-optimization/63379 * tree-vect-slp.c (vect_get_constant_vectors): Do not compute a neutral operand for min/max when it is not a reduction chain. * gcc.dg/vect/pr63379.c: New testcase. From-SVN: r216070
Diffstat (limited to 'gcc/tree-vect-slp.c')
-rw-r--r--gcc/tree-vect-slp.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index d48d3f5..5984229 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -2395,13 +2395,21 @@ vect_get_constant_vectors (tree op, slp_tree slp_node,
neutral_op = build_int_cst (TREE_TYPE (op), -1);
break;
- case MAX_EXPR:
- case MIN_EXPR:
- def_stmt = SSA_NAME_DEF_STMT (op);
- loop = (gimple_bb (stmt))->loop_father;
- neutral_op = PHI_ARG_DEF_FROM_EDGE (def_stmt,
- loop_preheader_edge (loop));
- break;
+ /* For MIN/MAX we don't have an easy neutral operand but
+ the initial values can be used fine here. Only for
+ a reduction chain we have to force a neutral element. */
+ case MAX_EXPR:
+ case MIN_EXPR:
+ if (!GROUP_FIRST_ELEMENT (stmt_vinfo))
+ neutral_op = NULL;
+ else
+ {
+ def_stmt = SSA_NAME_DEF_STMT (op);
+ loop = (gimple_bb (stmt))->loop_father;
+ neutral_op = PHI_ARG_DEF_FROM_EDGE (def_stmt,
+ loop_preheader_edge (loop));
+ }
+ break;
default:
neutral_op = NULL;