> + if (!get_max_loop_iterations (loop, &nit))
> + /* 10GHz CPU runing one cycle loop will reach 2^60 iterations in 260
> + years. I won't live long enough to be forced to fix the
> + miscompilation. Having the limit here will let us to consider
> + 64bit IVs with base 0 and step 1...16 as non-wrapping which makes
> + niter and ivopts go smoother. */
> + nit = ((widest_int)1 << 60);
>
> I think that's on the border of being acceptable. Consider said loop
> being autoparallelized and run on a PFlop cluster. Please take it out
> for now.
OK, once we will be able to get more than 2^64 iterations in resonable time,
we will need to revisit gcov code ;)
>
> + if (INTEGRAL_TYPE_P (type))
> + {
> + maxt = TYPE_MAX_VALUE (type);
> + mint = TYPE_MIN_VALUE (type);
> + }
> + else
> + {
> + maxt = upper_bound_in_type (type, type);
> + mint = lower_bound_in_type (type, type);
> + }
>
> I think we don't support any non-integral/pointer IVs and thus you
> can simply use
>
> type_min/max = wi::max/min_value (TYPE_PRECISION (type), TYPE_SIGN
> (type));
OK.
>
> + type_min = wi::to_widest (mint);
> + type_max = wi::to_widest (maxt);
> + if ((base_max + step_max * (nit + 1)) > (type_max)
> + || type_min > (base_min + step_min * (nit + 1)))
> + return true;
>
> so I'm not convinced that widest_int precision is enough here. Can't
> you use wide_ints instead of widest_ints and use the wi::add / wi::mult
> overloads which provide the overflow flag? Otherwise do what
> VRP does and use FIXED_WIDE_INT to properly handle __int128_t IVs.
nit is widest_int because, so I suppose first I need to convert it to wide_int
and then do the overflow checks. Do we have narrowing conversion with overflow
flat, too?
>
> scev provides scev_direction for this (of course we don't have the chrec
> anymore here).
Good, thanks!
Honza