diff options
author | Richard Biener <rguenther@suse.de> | 2022-05-02 09:30:27 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-05-02 10:43:40 +0200 |
commit | 3a3eda000fdf4f8754c9a2535191091f1db0c2a2 (patch) | |
tree | 2a87f4a9948f63e93e70a215daedc2ac9c45d70c /gcc/tree-vect-slp.cc | |
parent | 82a344f206725ba002af4fed318f37dfb7e566a0 (diff) | |
download | gcc-3a3eda000fdf4f8754c9a2535191091f1db0c2a2.zip gcc-3a3eda000fdf4f8754c9a2535191091f1db0c2a2.tar.gz gcc-3a3eda000fdf4f8754c9a2535191091f1db0c2a2.tar.bz2 |
tree-optimization/105437 - BB vect with extern defs of throwing stmts
We have to watch out for vectorized stmt insert locations if the
def from the last stmt alters control flow. We constrain region
building so we know the def is outside of the current region
and thus we can insert at the region start point.
2022-05-02 Richard Biener <rguenther@suse.de>
PR tree-optimization/105437
* tree-vect-slp.cc (vect_schedule_slp_node): Handle the
case where last_stmt alters control flow.
* g++.dg/vect/pr105437.cc: New testcase.
Diffstat (limited to 'gcc/tree-vect-slp.cc')
-rw-r--r-- | gcc/tree-vect-slp.cc | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 805dd7e..0d400c0 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -7302,6 +7302,13 @@ vect_schedule_slp_node (vec_info *vinfo, gcc_assert (seen_vector_def); si = gsi_after_labels (as_a <bb_vec_info> (vinfo)->bbs[0]); } + else if (is_ctrl_altering_stmt (last_stmt)) + { + /* We split regions to vectorize at control altering stmts + with a definition so this must be an external which + we can insert at the start of the region. */ + si = gsi_after_labels (as_a <bb_vec_info> (vinfo)->bbs[0]); + } else if (is_a <bb_vec_info> (vinfo) && gimple_bb (last_stmt) != gimple_bb (stmt_info->stmt) && gimple_could_trap_p (stmt_info->stmt)) |