]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/111125 - avoid BB vectorization in novector loops
authorRichard Biener <rguenther@suse.de>
Thu, 24 Aug 2023 09:10:43 +0000 (11:10 +0200)
committerRichard Biener <rguenther@suse.de>
Thu, 24 Aug 2023 11:01:55 +0000 (13:01 +0200)
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.

gcc/tree-vect-slp.cc

index ace0ff3ef60cc168eb5e03783d2097e210eb3cc1..0b1c2233017d06114b68065eb7c4a81a76e065d4 100644 (file)
@@ -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);