[PATCH] use zero as the lower bound for a signed-unsigned range (PR 79327)

Jeff Law law@redhat.com
Thu Feb 16 23:34:00 GMT 2017


On 02/14/2017 01:32 PM, Jakub Jelinek wrote:
> On Tue, Feb 14, 2017 at 12:15:59PM -0700, Martin Sebor wrote:
>> That comment explains how the likely_adjust variable ("the adjustment")
>> is being used, or more precisely, how it was being used in the first
>> version of the patch.  The comment became somewhat out of date with
>> the committed version of the patch (this was my bad).
>>
>> The variable is documented where it's defined and again where it's
>> assigned to.  With the removal of those comments it seems especially
>> important that the only remaining description of what's going on be
>> accurate.
>>
>> The comment is outdated because it refers to "the adjustment" which
>> doesn't exist anymore.  (It was replaced by a flag in my commit).
>> To bring it up to date it should say something like:
>>
>>   /* Set the LIKELY counter to MIN.  In base 8 and 16, when
>>      the argument is in range that includes zero, adjust it
>>      upward to include the length of the base prefix since
>>      in that case the MIN counter does include it.  */
>
> So for a comment, what about following then?  With or without
> the IMNSHO useless
> && (tree_int_cst_sgn (argmin) < 0 || tree_int_cst_sgn (argmax) > 0)
>
>> On a separate note, while testing the patch I noticed that it's
>> not exactly equivalent to what's on trunk.  Trunk silently accepts
>> the call below but with the patch it complains.  That's great (it
>> should complain) but the change should be tested.  More to my point,
>> while in this case your change happened to fix a subtle bug (which
>> I'm certainly happy about), it could have just as easily introduced
>> one.
>
> Yeah, indeed.  That should be a clear argument for why writing it in
> so many places is bad, it is simply much more error-prone, there are
> too many cases to get right.
>
>>   char d[2];
>>
>>   void f (unsigned i)
>>   {
>>     if (i < 1234 || 12345 < i)
>>       i = 1234;
>>
>>     __builtin_sprintf (d, "%#hhx", i);
>>   }
>
> What happens is that because the original range doesn't contain zero
> you set likely_adjust to false and then never update it again because
> the implicit cast changed the range.
>
> If some version of the patch is approved, I'll leave addition of this
> testcase to you (incrementally).
>
> 2017-02-14  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR tree-optimization/79327
> 	* gimple-ssa-sprintf.c (format_integer): Remove likely_adjust
> 	variable, its initialization and use.
This is fine.  And the addition of the test from Martin is pre-approved 
as well.

jeff



More information about the Gcc-patches mailing list