> +  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

Reply via email to