The following avoids leading debug stmts in BB vectorizer regions. Bootstrap and regtest running on x86_64-unknown-linux-gnu.
2020-06-10 Richard Biener <rguent...@suse.de> PR tree-optimization/95576 * tree-vect-slp.c (vect_slp_bb): Skip leading debug stmts. * g++.dg/vect/pr95576.cc: New testcase. --- gcc/testsuite/g++.dg/vect/pr95576.cc | 23 +++++++++++++++++++++++ gcc/tree-vect-slp.c | 7 ++++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/vect/pr95576.cc diff --git a/gcc/testsuite/g++.dg/vect/pr95576.cc b/gcc/testsuite/g++.dg/vect/pr95576.cc new file mode 100644 index 00000000000..64e0e2dae7f --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr95576.cc @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-additional-options "-O3 -fno-tree-forwprop -fcompare-debug" } + +struct S { + virtual ~S(); + struct S *s; + virtual void m(); + int f; + void *d; +}; + +struct T : S { + void m(); +}; + +S::~S() { + if (s) { + s->f = 0; + s->d = __null; + } +} + +void T::m() {} diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 0217a524f05..de82c198309 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -3316,7 +3316,12 @@ vect_slp_bb (basic_block bb) { gimple *stmt = gsi_stmt (gsi); if (is_gimple_debug (stmt)) - continue; + { + /* Skip leading debug stmts. */ + if (gsi_stmt (region_begin) == stmt) + gsi_next (®ion_begin); + continue; + } insns++; if (gimple_location (stmt) != UNKNOWN_LOCATION) -- 2.26.2