tree-optimization/100089 - BB vectorization of if-converted loop bodies
authorRichard Biener <rguenther@suse.de>
Fri, 21 Jan 2022 12:29:06 +0000 (13:29 +0100)
committerRichard Biener <rguenther@suse.de>
Fri, 21 Jan 2022 13:23:07 +0000 (14:23 +0100)
The PR complains that when we only partially BB vectorize an
if-converted loop body that this can leave unvectorized code
unconditionally executed and thus effectively slow down code.
For -O2 we already mitigated the issue by not doing BB vectorization
when not all if-converted stmts were covered but the issue is
present with -O3 as well.  Thus the following simply extends the
fix to cover all but the unlimited cost models.  It is after all
very likely that we vectorize some stmts, if only a single
paired store.

2022-01-21  Richard Biener  <rguenther@suse.de>

PR tree-optimization/100089
* tree-vect-slp.cc (vect_slp_region): Reject BB vectorization
of if-converted loops with unvectorized COND_EXPRs for
all but the unlimited cost models.

gcc/tree-vect-slp.cc

index 5ffb636..926106c 100644 (file)
@@ -5906,9 +5906,8 @@ vect_slp_region (vec<basic_block> bbs, vec<data_reference_p> datarefs,
              profitable_subgraphs.safe_push (instance);
            }
 
-         /* When we're vectorizing an if-converted loop body with the
-            very-cheap cost model make sure we vectorized all if-converted
-            code.  */
+         /* When we're vectorizing an if-converted loop body make sure
+            we vectorized all if-converted code.  */
          if (!profitable_subgraphs.is_empty ()
              && orig_loop)
            {
@@ -5924,7 +5923,7 @@ vect_slp_region (vec<basic_block> bbs, vec<data_reference_p> datarefs,
                      gimple_set_visited (gsi_stmt (gsi), false);
                      continue;
                    }
-                 if (flag_vect_cost_model != VECT_COST_MODEL_VERY_CHEAP)
+                 if (flag_vect_cost_model == VECT_COST_MODEL_UNLIMITED)
                    continue;
 
                  if (gassign *ass = dyn_cast <gassign *> (gsi_stmt (gsi)))