The split of the versioning condition assumes the definition is
in the condition block which is ensured by the versioning code.
But that only works when we actually have to insert any statements
for the versioning condition. The following adjusts the guard
accordingly and asserts this condition.
PR tree-optimization/108816
* tree-vect-loop-manip.cc (vect_loop_versioning): Adjust
versioning condition split prerequesite, assert required
invariant.
* gcc.dg/torture/pr108816.c: New testcase.
--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-fvect-cost-model=dynamic" } */
+
+int m;
+
+void
+foo (int p[][16], unsigned int x)
+{
+ while (x < 4)
+ {
+ int j;
+
+ for (j = x * 4; j < (x + 1) * 4 - 2; j++)
+ p[0][j] = p[m][j];
+
+ ++x;
+ }
+}
tree cost_name = NULL_TREE;
profile_probability prob2 = profile_probability::uninitialized ();
if (cond_expr
- && !integer_truep (cond_expr)
+ && EXPR_P (cond_expr)
&& (version_niter
|| version_align
|| version_alias
if (cost_name && TREE_CODE (cost_name) == SSA_NAME)
{
gimple *def = SSA_NAME_DEF_STMT (cost_name);
+ gcc_assert (gimple_bb (def) == condition_bb);
/* All uses of the cost check are 'true' after the check we
are going to insert. */
replace_uses_by (cost_name, boolean_true_node);