From 7819730f62579f25a209380d2ca15dc90fa44ea6 Mon Sep 17 00:00:00 2001 From: rguenth Date: Tue, 12 Jan 2016 08:36:24 +0000 Subject: [PATCH] 2016-01-12 Richard Biener PR tree-optimization/69168 * tree-vect-loop.c (vect_analyze_loop_2): Reset both main and pattern stmt SLP type. * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Patterns may end up unused so cope with that case. * gcc.dg/torture/pr69168.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@232261 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr69168.c | 17 +++++++++++++++++ gcc/tree-vect-loop.c | 4 ++-- gcc/tree-vect-slp.c | 8 ++++---- 5 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr69168.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ccdbf8ecb8..96a63869a0a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2016-01-12 Richard Biener + PR tree-optimization/69168 + * tree-vect-loop.c (vect_analyze_loop_2): Reset both main and + pattern stmt SLP type. + * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Patterns may + end up unused so cope with that case. + +2016-01-12 Richard Biener + PR tree-optimization/69157 * tree-vect-stmts.c (vectorizable_mask_load_store): Check stmts def type only during analyze phase. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e19ea3144c7..7829a4e45fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2016-01-12 Richard Biener + PR tree-optimization/69168 + * gcc.dg/torture/pr69168.c: New testcase. + +2016-01-12 Richard Biener + PR tree-optimization/69157 * gcc.dg/torture/pr69157.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr69168.c b/gcc/testsuite/gcc.dg/torture/pr69168.c new file mode 100644 index 00000000000..4f49000450b --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr69168.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +long a, b, e; +short *c; +int *d; +void fn1() +{ + int i; + for (; e; e--) + { + i = 2; + for (; i; i--) + a = b = *d++ / (1 << 9); + b = b ? 8 : a; + *c++ = *c++ = b; + } +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index a797f7056de..706a25d2d0d 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -2189,10 +2189,11 @@ again: !gsi_end_p (si); gsi_next (&si)) { stmt_vec_info stmt_info = vinfo_for_stmt (gsi_stmt (si)); + STMT_SLP_TYPE (stmt_info) = loop_vect; if (STMT_VINFO_IN_PATTERN_P (stmt_info)) { - gcc_assert (STMT_SLP_TYPE (stmt_info) == loop_vect); stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info)); + STMT_SLP_TYPE (stmt_info) = loop_vect; for (gimple_stmt_iterator pi = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (stmt_info)); !gsi_end_p (pi); gsi_next (&pi)) @@ -2201,7 +2202,6 @@ again: STMT_SLP_TYPE (vinfo_for_stmt (pstmt)) = loop_vect; } } - STMT_SLP_TYPE (stmt_info) = loop_vect; } } /* Free optimized alias test DDRS. */ diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index d1858387f11..7ad7c127bc5 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -2016,10 +2016,10 @@ vect_detect_hybrid_slp_stmts (slp_tree node, unsigned i, slp_vect_type stype) { /* Check if a pure SLP stmt has uses in non-SLP stmts. */ gcc_checking_assert (PURE_SLP_STMT (stmt_vinfo)); - /* We always get the pattern stmt here, but for immediate - uses we have to use the LHS of the original stmt. */ - gcc_checking_assert (!STMT_VINFO_IN_PATTERN_P (stmt_vinfo)); - if (STMT_VINFO_RELATED_STMT (stmt_vinfo)) + /* If we get a pattern stmt here we have to use the LHS of the + original stmt for immediate uses. */ + if (! STMT_VINFO_IN_PATTERN_P (stmt_vinfo) + && STMT_VINFO_RELATED_STMT (stmt_vinfo)) stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo); if (TREE_CODE (gimple_op (stmt, 0)) == SSA_NAME) FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, gimple_op (stmt, 0)) -- 2.11.4.GIT