From faa5399be693b2cdea641b976156f0fc89fa10cf Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 29 Aug 2017 07:04:31 +0000 Subject: [PATCH] tree-vect-slp.c (vect_bb_slp_scalar_cost): Properly confine life to the active subtree. 2017-08-29 Richard Biener Dominik Infuehr * tree-vect-slp.c (vect_bb_slp_scalar_cost): Properly confine life to the active subtree. * gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp.c: New testcase. Co-Authored-By: Dominik Infuehr From-SVN: r251398 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 ++++ .../costmodel/x86_64/costmodel-vect-slp.c | 28 +++++++++++++++++++ gcc/tree-vect-slp.c | 13 +++++++-- 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9a60a80b746..682f4054b04 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-08-29 Richard Biener + Dominik Infuehr + + * tree-vect-slp.c (vect_bb_slp_scalar_cost): Properly confine + life to the active subtree. + 2017-08-28 Jeff Law * tree-ssa-dom.c (edge_info::record_simple_equiv): Call diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0ffc4f9a70f..ed3c6742329 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-08-29 Richard Biener + Dominik Infuehr + + * gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp.c: New testcase. + 2017-08-28 Jeff Law * gcc.dg/torture/pr57214.c: Fix type of loop counter. diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp.c b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp.c new file mode 100644 index 00000000000..5121a88efea --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-slp.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fdump-tree-slp-details" } */ + +#define N 4 + +int s1[N], s2[N], s3[N]; +void escape(int, int, int, int); + +void +foo () +{ + int t1, t2, t3, t4; + + t1 = s1[0] + s2[0] + s3[0]; + t2 = s1[1] + s2[1] + s3[1]; + t3 = s1[2] + s2[2] + s3[2]; + t4 = s1[3] + s2[3] + s3[3]; + + s3[0] = t1 - s1[0] * s2[0]; + s3[1] = t2 - s1[1] * s2[1]; + s3[2] = t3 - s1[2] * s2[2]; + s3[3] = t4 - s1[3] * s2[3]; + + escape (t1, t2, t3, t4); +} + +/* { dg-final { scan-tree-dump-not "vectorization is not profitable" "slp2" } } */ +/* { dg-final { scan-tree-dump "basic block vectorized" "slp2" } } */ diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 04ecaab7fc3..2167293076f 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -2690,9 +2690,18 @@ vect_bb_slp_scalar_cost (basic_block bb, scalar_cost += stmt_cost; } + auto_vec subtree_life; FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child) - if (SLP_TREE_DEF_TYPE (child) == vect_internal_def) - scalar_cost += vect_bb_slp_scalar_cost (bb, child, life); + { + if (SLP_TREE_DEF_TYPE (child) == vect_internal_def) + { + /* Do not directly pass LIFE to the recursive call, copy it to + confine changes in the callee to the current child/subtree. */ + subtree_life.safe_splice (*life); + scalar_cost += vect_bb_slp_scalar_cost (bb, child, &subtree_life); + subtree_life.truncate (0); + } + } return scalar_cost; } -- 2.30.2