Hi,

> diff -u gcc/tree-ssa-loop-niter.c (working copy) gcc/tree-ssa-loop-niter.c 
> (working copy)
> --- gcc/tree-ssa-loop-niter.c (working copy)
> +++ gcc/tree-ssa-loop-niter.c (working copy)
> @@ -2875,6 +2875,16 @@
>    low = lower_bound_in_type (type, type);
>    high = upper_bound_in_type (type, type);
>  
> +  /* In C, pointer arithmetic p + 1 cannot use a NULL pointer, and p - 1 
> cannot
> +     produce a NULL pointer.  The contrary would mean NULL points to an 
> object,
> +     while NULL is supposed to compare unequal with the address of all 
> objects.
> +     Furthermore, p + 1 cannot produce a NULL pointer and p - 1 cannot use a
> +     NULL pointer since that would mean wrapping, which we assume here not to
> +     happen.  So, we can exclude NULL from the valid range of pointer
> +     arithmetic.  */
> +  if (int_cst_value (low) == 0)
> +    low = build_int_cstu (TREE_TYPE (low), TYPE_ALIGN_UNIT (TREE_TYPE 
> (type)));
> +
>    record_nonwrapping_iv (loop, base, step, stmt, low, high, false, true);
>  }

OK,

Zdenek

Reply via email to