diff options
author | Richard Biener <rguenther@suse.de> | 2023-08-24 11:10:43 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-08-24 13:01:55 +0200 |
commit | 43da77a4f1636280c4259402c9c2c543e6ec6c0b (patch) | |
tree | 331ee2615562e0a2595414da699202ccc3aa5e8a /gcc | |
parent | 207a5daa9dcf31e367152163ad2a2ab4a0858967 (diff) | |
download | gcc-43da77a4f1636280c4259402c9c2c543e6ec6c0b.zip gcc-43da77a4f1636280c4259402c9c2c543e6ec6c0b.tar.gz gcc-43da77a4f1636280c4259402c9c2c543e6ec6c0b.tar.bz2 |
tree-optimization/111125 - avoid BB vectorization in novector loops
When a loop is marked with
#pragma GCC novector
the following makes sure to also skip BB vectorization for contained
blocks. That avoids gcc.dg/vect/bb-slp-29.c failing on aarch64
because of extra BB vectorization therein. I'm not specifically
dealing with sub-loops of novector loops, the desired semantics
isn't documented.
PR tree-optimization/111125
* tree-vect-slp.cc (vect_slp_function): Split at novector
loop entry, do not push blocks in novector loops.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/tree-vect-slp.cc | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index ace0ff3..0b1c223 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -7802,6 +7802,17 @@ vect_slp_function (function *fun) bbs[0]->loop_father->num, bb->index); split = true; } + else if (!bbs.is_empty () + && bb->loop_father->header == bb + && bb->loop_father->dont_vectorize) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "splitting region at dont-vectorize loop %d " + "entry at bb%d\n", + bb->loop_father->num, bb->index); + split = true; + } if (split && !bbs.is_empty ()) { @@ -7809,19 +7820,25 @@ vect_slp_function (function *fun) bbs.truncate (0); } - /* We need to be able to insert at the head of the region which - we cannot for region starting with a returns-twice call. */ if (bbs.is_empty ()) - if (gcall *first = safe_dyn_cast <gcall *> (first_stmt (bb))) - if (gimple_call_flags (first) & ECF_RETURNS_TWICE) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "skipping bb%d as start of region as it " - "starts with returns-twice call\n", - bb->index); - continue; - } + { + /* We need to be able to insert at the head of the region which + we cannot for region starting with a returns-twice call. */ + if (gcall *first = safe_dyn_cast <gcall *> (first_stmt (bb))) + if (gimple_call_flags (first) & ECF_RETURNS_TWICE) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "skipping bb%d as start of region as it " + "starts with returns-twice call\n", + bb->index); + continue; + } + /* If the loop this BB belongs to is marked as not to be vectorized + honor that also for BB vectorization. */ + if (bb->loop_father->dont_vectorize) + continue; + } bbs.safe_push (bb); |