https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113137
--- Comment #10 from Tamar Christina <tnfchris at gcc dot gnu.org> ---
Ok, so this bug is simply fixed by:
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index f51ae3e719e..e7a5917bc4c 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -976,7 +976,8 @@ vec_init_loop_exit_info (class loop *loop)
if (number_of_iterations_exit_assumptions (loop, exit, &niter_desc,
NULL)
&& !chrec_contains_undetermined (niter_desc.niter))
{
- if (!niter_desc.may_be_zero || !candidate)
+ tree may_be_zero = niter_desc.may_be_zero;
+ if ((may_be_zero && integer_zerop (may_be_zero)) || !candidate)
candidate = exit;
}
}
because niter_desc.may_be_zero is not a boolean but instead a tree that encodes
a boolean.
Due to this we were forcing much more complicated loops than required. However
we *should* be able to handle these complicated loops since we don't know when
they'll occur.. so I'll post a companion patch to fix those too.