https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98117
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
<bb 2> [local count: 118111600]:
c_lsm.6_7 = c;
niters.8_1 = -c_lsm.6_7;
if (c_lsm.6_7 > 240)
goto <bb 11>; [10.00%]
else
goto <bb 6>; [90.00%]
<bb 6> [local count: 106300440]:
_18 = niters.8_1 + 240;
_19 = _18 >> 4;
# RANGE [1, 15] NONZERO 15
bnd.9_17 = _19 + 1;
but here c == 0 and thus _19 + 1 is 16. The number of latch invocations is 255
but the number of iterations is that + 1 and thus zero in the IVs type. This
is why we have num_itersm1 and so I guess
/* Peeling algorithm guarantees that vector loop bound is at least ONE,
we set range information to make niters analyzer's life easier. */
if (stmts != NULL && log_vf)
set_range_info (niters_vector, VR_RANGE,
wi::to_wide (build_int_cst (type, 1)),
wi::to_wide (fold_build2 (RSHIFT_EXPR, type,
TYPE_MAX_VALUE (type),
log_vf)));
needs to use TYPE_MAX_VALUE + 1 >> log_vf here to be on the safe side for the
"non-representable" niter value.