On Thu, Jun 16, 2011 at 5:24 PM, Zdenek Dvorak <rakd...@kam.mff.cuni.cz> wrote:
> 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,

I think this is only valid for !flag_delete_null_pointer_checks, on
architectures where that isn't the default we have to assume that
NULL may point to an object.

Richard.

> Zdenek
>

Reply via email to