On December 12, 2017 5:13:19 PM GMT+01:00, Qing Zhao <qing.z...@oracle.com> 
wrote:
>Hi, Richard,
>
>thanks a lot for your review.
>
>> 
>>>                {
>>>                  /* __copy is always the same for characters.
>>>                     Check to see if copy function already exists. 
>*/
>>> -                 sprintf (name, "__copy_character_%d", ts->kind);
>>> +                 name = xasprintf ("__copy_character_%d",
>ts->kind);
>>>                  contained = ns->contained;
>>>                  for (; contained; contained = contained->sibling)
>>>                    if (contained->proc_name
>>> @@ -2796,6 +2802,7 @@ find_intrinsic_vtab (gfc_typespec *ts)
>>>          vtab->ts.u.derived = vtype;
>>>          vtab->value = gfc_default_initializer (&vtab->ts);
>>>        }
>>> +      free (name);
>> 
>> It looks like this might be in a performance critical lookup path
>> where we'd really
>> like to avoid allocating/freeing memory.  Why's GFC_MAX_SYMBOL_LEN+1
>not
>> enough?  Leaving for fortran folks to comment - note you should CC
>> fort...@gcc.gnu.org <mailto:fort...@gcc.gnu.org>
>> for fortran patches (done).
>
>I have sent this patch to fort...@gcc.gnu.org
><mailto:fort...@gcc.gnu.org> per Thomas’s suggestion last week, and got
>approval by fortran team on last Friday:
>
>https://gcc.gnu.org/ml/fortran/2017-12/msg00027.html
>
>> 
>>>    }
>>> 
>>>  found_sym = vtab;
>>> diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
>>> index 353a46e..fef1969 100644
>>> --- a/gcc/gimple-fold.c
>>> +++ b/gcc/gimple-fold.c
>>> @@ -1323,6 +1323,19 @@ get_range_strlen (tree arg, tree length[2],
>bitmap *visited, int type,
>>>                 the array could have zero length.  */
>>>              *minlen = ssize_int (0);
>>>            }
>>> +
>>> +          if (VAR_P (arg)
>>> +              && TREE_CODE (TREE_TYPE (arg)) == ARRAY_TYPE)
>>> +            {
>>> +              val = TYPE_SIZE_UNIT (TREE_TYPE (arg));
>>> +              if (!val || integer_zerop (val))
>> 
>> val might be non-constant so you also need to check TREE_CODE (val)
>!=
>> INTEGER_CST here.
>
>Okay.
>> 
>>> +                return false;
>>> +              val = fold_build2 (MINUS_EXPR, TREE_TYPE (val), val,
>>> +                                 integer_one_node);
>> 
>>   val = wide_int_to_tree (TREE_TYPE (val), wi::minus (wi::to_wide
>(val), 1));
I don't see this requested change. 

>> you pass a possibly bogus type of 1 to fold_build2 above so the
>wide-int variant
>> is prefered.
>> 
>> The gimple-fold.c changes are ok with that change.
>
>Per your comments, the updated gimple-fold.c is like the following:
>
>diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
>index 353a46e..0500fba 100644
>--- a/gcc/gimple-fold.c
>+++ b/gcc/gimple-fold.c
>@@ -1323,6 +1323,19 @@ get_range_strlen (tree arg, tree length[2],
>bitmap *visited, int type,
>                the array could have zero length.  */
>             *minlen = ssize_int (0);
>           }
>+
>+          if (VAR_P (arg) 
>+              && TREE_CODE (TREE_TYPE (arg)) == ARRAY_TYPE)
>+            {
>+              val = TYPE_SIZE_UNIT (TREE_TYPE (arg));
>+              if (!val || TREE_CODE (val) != INTEGER_CST ||
>integer_zerop (val))
>+                return false;
>+              val = fold_build2 (MINUS_EXPR, TREE_TYPE (val), val,
>+                               build_int_cst (TREE_TYPE (val), 1));
>+              /* Set the minimum size to zero since the string in
>+                 the array could have zero length.  */
>+              *minlen = ssize_int (0);
>+            }
>       }
> 
>       if (!val)
>
>let me know any further issue with the above.
>
>thanks a lot.
>
>Qing

Reply via email to