Hi, This patch adds a missing support of constant operands in reduction in SLP.
Bootstrapped and tested on powerpc64-suse-linux. Committed. Ira ChangeLog: PR tree-optimization/50451 * tree-vect-slp.c (vect_get_constant_vectors): Don't fail for constant operands in reduction. (vect_get_slp_defs): Don't create vector operand for NULL scalar operand. testsuite/ChangeLog: PR tree-optimization/50451 * gcc.dg/vect/pr50451.c: New test. Index: tree-vect-slp.c =================================================================== --- tree-vect-slp.c (revision 179076) +++ tree-vect-slp.c (working copy) @@ -1905,14 +1905,9 @@ vect_get_constant_vectors (tree op, slp_tree slp_n gimple def_stmt; struct loop *loop; - if (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def) + if (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def + && reduc_index != -1) { - if (reduc_index == -1) - { - VEC_free (tree, heap, *vec_oprnds); - return; - } - op_num = reduc_index - 1; op = gimple_op (stmt, reduc_index); /* For additional copies (see the explanation of NUMBER_OF_COPIES below) @@ -2164,7 +2159,7 @@ vect_get_slp_defs (tree op0, tree op1, slp_tree sl return; code = gimple_assign_rhs_code (first_stmt); - if (get_gimple_rhs_class (code) != GIMPLE_BINARY_RHS || !vec_oprnds1) + if (get_gimple_rhs_class (code) != GIMPLE_BINARY_RHS || !vec_oprnds1 || !op1) return; /* The number of vector defs is determined by the number of vector statements Index: testsuite/gcc.dg/vect/pr50451.c =================================================================== --- testsuite/gcc.dg/vect/pr50451.c (revision 0) +++ testsuite/gcc.dg/vect/pr50451.c (revision 0) @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_int } */ + +int +foo (int integral, int decimal, int power_ten) +{ + while (power_ten > 0) + { + integral *= 10; + decimal *= 10; + power_ten--; + } + + return integral+decimal; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ +