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..866ce8d3717 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) @@ -3325,6 +3330,8 @@ vect_slp_bb (basic_block bb) if (!vect_find_stmt_data_reference (NULL, stmt, &datarefs)) break; } + if (gsi_end_p (region_begin)) + break; /* Skip leading unhandled stmts. */ if (gsi_stmt (region_begin) == gsi_stmt (gsi))