[PATCH] Rewrite get_size_range for irange API.

Aldy Hernandez aldyh@redhat.com
Mon Aug 10 11:47:23 GMT 2020



On 8/6/20 9:30 PM, Martin Sebor wrote:
> On 8/6/20 8:53 AM, Aldy Hernandez via Gcc-patches wrote:

>> +  // Remove the unknown parts of a multi-range.
>> +  // This will transform [5,10][20,MAX] into [5,10].
> 
> Is this comment correct?  Wouldn't this result in returning smaller
> sizes than the actual value allows?  If so, I'd expect that to cause
> false positives (and in that case, if none of our tests fail we need
> to add some that would).
> 
> By my reading of the code below it seems to return the upper range
> (i.e., [20, MAX]) but I'm not fully acquainted with the new ranger
> APIs yet.

I believe the comment is correct.  What I'm trying to do is remove 
[X,TYPE_MAX_VALUE] from the range

>> +  int pairs = positives.num_pairs ();
>> +  if (pairs > 1
>> +      && positives.upper_bound () == wi::to_wide (TYPE_MAX_VALUE 
>> (exptype)))
>>       {
>> -      if (integral)
>> -    {
>> -      /* Use the full range of the type of the expression when
>> -         no value range information is available.  */
>> -      range[0] = TYPE_MIN_VALUE (exptype);
>> -      range[1] = TYPE_MAX_VALUE (exptype);
>> -      return true;
>> -    }
>> -
>> -      range[0] = NULL_TREE;
>> -      range[1] = NULL_TREE;
>> -      return false;
>> +      value_range last_range (exptype,
>> +                  positives.lower_bound (pairs - 1),
>> +                  positives.upper_bound (pairs - 1), VR_ANTI_RANGE);
>> +      positives.intersect (last_range);
>>       }

Notice that we start with positives == vr (where vr is the range 
returned by determine_value_range).

Then we build last_range which is the *opposite* of [X,TYPE_MAX_VALUE]. 
Notice the VR_ANTI_RANGE in the constructor.

(Note that the nomenclature VR_ANTI_RANGE is being used in the 
constructor to keep with the original API.  It means "create the inverse 
of this range".  Ideally, when the m_kind field disappears along with 
VR_ANTI_RANGEs, the enum could become RANGE_INVERSE or something less 
confusing.)

Finally, last_range is intersected with positives, which will become 
whatever VR had, minus the last sub-range.

Those that make sense, or did I miss something?

If you have a testcase that yields a false positive in my proposed 
patch, but not in the original code, please let me know so I can adjust 
the patch.

Thanks for your feedback.
Aldy



More information about the Gcc-patches mailing list