On 8/28/19 3:12 PM, Martin Sebor wrote:
> On 8/22/19 3:31 PM, Jeff Law wrote:
>> On 8/20/19 8:10 PM, Martin Sebor wrote:
>>> Jeff,
>>>
>>> Please let me know if you agree/disagree and what I need to
>>> do to advance this work:
>>>
>>>    https://gcc.gnu.org/ml/gcc-patches/2019-08/msg00643.html
>> For the official record, I agree :-)
> 
> Great! :)
> 
> Any comments/suggestions on the patch?
> 
>   https://gcc.gnu.org/ml/gcc-patches/2019-08/msg00643.html
> 
> Martin
Yea, they were in an earlier message.  I'll extract the relevant
comments since some we addressed independently:


>>  
>>  
>>  
>> @@ -325,7 +333,7 @@ state_ident_by_name (const char *name, enum 
>> insert_option optins)
>>    namlen = strlen (name);
>>    stid =
>>      (struct state_ident_st *) xmalloc (sizeof (struct state_ident_st) +
>> -                                   namlen);
>> +                                   namlen + 1);
>>    memset (stid, 0, sizeof (struct state_ident_st) + namlen);
>>    strcpy (stid->stid_name, name);
>>    *slot = stid;
> How did you find this goof?
> 
> 
> 
This was more a curiosity than anything.  Nothing we need to change here.

>> diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
>> index fc57fb45e3a..582768090ae 100644
>> --- a/gcc/gimple-fold.c
>> +++ b/gcc/gimple-fold.c
>> @@ -1346,6 +1346,10 @@ get_range_strlen_tree (tree arg, bitmap *visited, 
>> strlen_range_kind rkind,
>>      }
>>      }
>>  
>> +  /* Set if VAL represents the maximum length based on array size (set
>> +     when exact length cannot be determined).  */
>> +  bool maxbound = false;
>> +
>>    if (!val && rkind == SRK_LENRANGE)
>>      {
>>        if (TREE_CODE (arg) == ADDR_EXPR)
>> @@ -1441,6 +1445,7 @@ get_range_strlen_tree (tree arg, bitmap *visited, 
>> strlen_range_kind rkind,
>>            pdata->minlen = ssize_int (0);
>>          }
>>      }
>> +      maxbound = true;
>>      }
>>  
>>    if (!val)
>> @@ -1454,7 +1459,7 @@ get_range_strlen_tree (tree arg, bitmap *visited, 
>> strlen_range_kind rkind,
>>        && tree_int_cst_lt (val, pdata->minlen)))
>>      pdata->minlen = val;
>>  
>> -  if (pdata->maxbound)
>> +  if (pdata->maxbound && TREE_CODE (pdata->maxbound) == INTEGER_CST)
>>      {
>>        /* Adjust the tighter (more optimistic) string length bound
>>       if necessary and proceed to adjust the more conservative
> So inside the conditional guarded by the test you're changing above we have:
> 
>      if (TREE_CODE (val) == INTEGER_CST)
>         {
>           if (TREE_CODE (pdata->maxbound) == INTEGER_CST)
>             {
>               if (tree_int_cst_lt (pdata->maxbound, val))
>                 pdata->maxbound = val;
>             }
>           else
>             pdata->maxbound = build_all_ones_cst (size_type_node);
>         }
> 
> Isn't the inner test that pdata->maxbound == INTEGER_CST always true and
> we should remove the test and the else clause?  Does the else clause
> need to be handled elsewhere (I don't see that it would be handled after
> your changes).  Or perhaps it just doesn't matter...
The redundant test of TREE_CODE (pdata->maxbound) == INTEGER_CST is a
bit of nit, but we might as well clean that up.

I couldn't convince myself that losing the else clause handling was
correct or not.

> 
> 
> > @@ -1653,8 +1661,11 @@ get_range_strlen (tree arg, bitmap *visited,
>  
>  /* Try to obtain the range of the lengths of the string(s) referenced
>     by ARG, or the size of the largest array ARG refers to if the range
> -   of lengths cannot be determined, and store all in *PDATA.  ELTSIZE
> -   is the expected size of the string element in bytes: 1 for char and
> +   of lengths cannot be determined, and store all in *PDATA which must
> +   be zero-initialized on input except PDATA->MAXBOUND may be set to
> +   a non-null tree node other than INTEGER_CST to request to have it
> +   set to the length of the longest string in a PHI.  ELTSIZE is
> +   the expected size of the string element in bytes: 1 for char and
Is there any reason we can't just make a clean distinction between input
and output objects in this routine?  As an API this seems awkward at best.
Any thoughts on the API question raised?


The rest are just nits/typos:


> @@ -2862,51 +2865,78 @@ handle_builtin_memset (gimple_stmt_iterator *gsi)
>    return true;
>  }
>  
> -/* Handle a call to memcmp.  We try to handle small comparisons by
> -   converting them to load and compare, and replacing the call to memcmp
> -   with a __builtin_memcmp_eq call where possible.
> -   return true when call is transformed, return false otherwise.  */
> +/* Return a pointer to the first such equality expression if RES is used
> +   only in experessions testing its equality to zero, and null otherwise.  */
s/experessions/expressions/


>  
> -static bool
> -handle_builtin_memcmp (gimple_stmt_iterator *gsi)
> +static gimple*
> +used_only_for_zero_equality (tree res)
Nit.  A space between "gimple" and "*".




> +
> +/* If IDX1 and IDX2 refer to strings A and B of unequal lengths, return
> +   the result of 0 == strncmp (A, B, BOUND) (which is the same as strcmp
> +   for s sufficiently large BOUND).  If the result is based on the length
> +   of one string being greater than the longest string that would fit in
> +   the array pointer to by the argument, set *PLEN and *PSIZE to
> +   the corresponding length (or its complement when the string is known
> +   to be at least as long and need not be nul-terminated) and size.
> +   Otherwise return null.  */
s/null/NULL/


> +/* Diagnose pointless calls to strcmp whose result is used in equality
> +   epxpressions that evaluate to a constant due to one argument being
> +   longer than the size of the other.  */
s/epxressions/expressions/



> +/* Optimize a call to strcmp or strncmp either by folding it to a constant
> +   when possible or by transforming the latter to the former.  Warn about
> +   calls where the length of one argument is greater than the size of
> +   the array to which the other aargument points if the latter's length
> +   is not known.  Return true when the call has been transformed into
> +   another and false otherwise.  */
s/aargument/argument/


>  
> -  unsigned HOST_WIDE_INT var_sizei = 0;
> -  /* try to determine the minimum size of the object pointed by var_string.  
> */
> -  tree size = determine_min_objsize (var_string);
> +  /* Determine either the length or the size of each of the string
> +     orguments, whichever is available.  */
s/orguments/arguments/

> 

Reply via email to