anti-ranges of signed variables

Martin Sebor msebor@gmail.com
Fri Nov 11 18:51:00 GMT 2016


On 11/11/2016 10:53 AM, Richard Biener wrote:
> On November 11, 2016 6:34:37 PM GMT+01:00, Martin Sebor <msebor@gmail.com> wrote:
>> I noticed that variables of signed integer types that are constrained
>> to a specific subrange of values of the type like so:
>>
>>      [-TYPE_MAX + N, N]
>>
>> are reported by get_range_info as the anti-range
>>
>>      [-TYPE_MAX, TYPE_MIN - 1]
>>
>> for all positive N of the type regardless of the variable's actual
>> range.  Basically, such variables are treated the same as variables
>> of the same type that have no range info associated with them at all
>> (such as function arguments or global variables).
>>
>> For example, while a signed char variable between -1 and 126 is
>> represented by
>>
>>      VR_ANTI_RANGE [127, -2]
>
> ? I'd expect [-1, 126].  And certainly never range-min > range-max

Okay.  With this code:

   void f (void *d, const void *s, signed char i)
   {
     if (i < -1 || 126 < i) i = -1;
     __builtin_memcpy (d, s, i);
   }

I see the following in the output of -fdump-tree-vrp:

   prephitmp_11: ~[127, 18446744073709551614]
   ...
   # prephitmp_11 = PHI <_12(3), 18446744073709551615(2)>
   __builtin_memcpy (d_8(D), s_9(D), prephitmp_11);

and this in GDB:

   Breakpoint 1, determine_block_size (len=0x7ffff0daacf0,
   ...
   2913	      else if (range_type == VR_ANTI_RANGE)
   (gdb) s
   2916		  if (min == 0)
   (gdb) p range_type
   $1 = VR_ANTI_RANGE
   (gdb) p min
   $2 = {<wide_int_storage> = {val = {127, 18136432, 140737235550272}, 
len = 1,
       precision = 64}, static is_sign_extended = <optimized out>}
   (gdb) p max
   $3 = {<wide_int_storage> = {val = {-2, 18136478, 140737235550272}, 
len = 1,
       precision = 64}, static is_sign_extended = <optimized out>}

>
>> as one would expect, when the same variable is between -4 and 123
>> it's represented by
>>
>>      VR_ANTI_RANGE [128, -129]
>>
>> rather than the expected
>>
>>      VR_ANTI_RANGE [124, -5]
>>
>> I'd like to know if this is a deliberate feature or a bug.
>
> It must be a misinterpretation on your side.  Or an implementation bug.

Given the above, which does it look like it is?

Thanks
Martin



More information about the Gcc mailing list