From 62446e6e25e2483e1ec5c3bfb119833fab0dd218 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 11 Jan 2016 16:02:23 +0000 Subject: [PATCH] re PR tree-optimization/69173 (ICE (segfault) in vinfo_for_stmt) 2016-01-11 Richard Biener PR tree-optimization/69173 * tree-vect-loop.c (vect_fixup_scalar_cycles_with_patterns): Only fixup the cycle if all stmts are in a pattern. * gcc.dg/torture/pr69173.c: New testcase. From-SVN: r232230 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr69173.c | 12 ++++++++++++ gcc/tree-vect-loop.c | 18 +++++++++++++++--- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr69173.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 62aaea26525..a256b34d978 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-01-11 Richard Biener + + PR tree-optimization/69173 + * tree-vect-loop.c (vect_fixup_scalar_cycles_with_patterns): Only + fixup the cycle if all stmts are in a pattern. + 2016-01-11 Uros Bizjak PR middle-end/68999 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6366b495bce..414c17411fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-11 Richard Biener + + PR tree-optimization/69173 + * gcc.dg/torture/pr69173.c: New testcase. + 2016-01-11 Kyrylo Tkachov PR rtl-optimization/68796 diff --git a/gcc/testsuite/gcc.dg/torture/pr69173.c b/gcc/testsuite/gcc.dg/torture/pr69173.c new file mode 100644 index 00000000000..f2936ce1e70 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr69173.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ + +unsigned a; +unsigned *b; +void fn1() { + char c; + while (b < (unsigned *)fn1) + { + a += b[2] + c; + b++; + } +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index a82cf26f71b..a797f7056de 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -985,9 +985,21 @@ vect_fixup_scalar_cycles_with_patterns (loop_vec_info loop_vinfo) FOR_EACH_VEC_ELT (LOOP_VINFO_REDUCTION_CHAINS (loop_vinfo), i, first) if (STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (first))) { - vect_fixup_reduc_chain (first); - LOOP_VINFO_REDUCTION_CHAINS (loop_vinfo)[i] - = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (first)); + gimple *next = GROUP_NEXT_ELEMENT (vinfo_for_stmt (first)); + while (next) + { + if (! STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (next))) + break; + next = GROUP_NEXT_ELEMENT (vinfo_for_stmt (next)); + } + /* If not all stmt in the chain are patterns try to handle + the chain without patterns. */ + if (! next) + { + vect_fixup_reduc_chain (first); + LOOP_VINFO_REDUCTION_CHAINS (loop_vinfo)[i] + = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (first)); + } } } -- 2.30.2