From: Richard Biener Date: Thu, 24 Aug 2023 09:10:43 +0000 (+0200) Subject: tree-optimization/111125 - avoid BB vectorization in novector loops X-Git-Tag: basepoints/gcc-15~6695 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=43da77a4f1636280c4259402c9c2c543e6ec6c0b;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index ace0ff3ef60c..0b1c2233017d 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 (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 (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);