From 29ed4920e8f131a9c315be88ab1a9dcd9c5ccc59 Mon Sep 17 00:00:00 2001 From: Ira Rosen Date: Thu, 22 Sep 2011 07:21:07 +0000 Subject: [PATCH] re PR middle-end/50451 (internal compiler error at tree-vect-loop.c:3557) 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. From-SVN: r179079 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/vect/pr50451.c | 18 ++++++++++++++++++ gcc/tree-vect-slp.c | 11 +++-------- 4 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/pr50451.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f183594e01..164daa39e67 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-09-22 Ira Rosen + + 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. + 2011-09-22 David S. Miller * config/sparc/sparc.c (sparc_vis_init_builtins): Do not mark diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 99436d1648c..0c9ffed2585 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-09-22 Ira Rosen + + PR tree-optimization/50451 + * gcc.dg/vect/pr50451.c: New test. + 2011-09-21 Ian Lance Taylor * go.test/go-test.exp (errchk): Add special case for bug332. diff --git a/gcc/testsuite/gcc.dg/vect/pr50451.c b/gcc/testsuite/gcc.dg/vect/pr50451.c new file mode 100644 index 00000000000..0733ea2ad51 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr50451.c @@ -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" } } */ + diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 669b2bb203c..9171ba991b1 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -1905,14 +1905,9 @@ vect_get_constant_vectors (tree op, slp_tree slp_node, 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 slp_node, 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 -- 2.30.2