This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Improve uncprop and coalescing


On Wed, Jun 12, 2013 at 6:04 PM, Jeff Law <law@redhat.com> wrote:
>
> On 06/07/13 03:14, Richard Biener wrote:
>
>>> +/* Given SSA_NAMEs NAME1 and NAME2, return true if they are candidates
>>> for
>>> +   coalescing together, false otherwise.
>>> +
>>> +   This must stay consistent with the code in tree-ssa-live.c which
>>> +   sets up base values in the var map.  */
>>> +
>>> +bool
>>> +gimple_can_coalesce_p (tree name1, tree name2)
>>> +{
>>> +  /* First check the SSA_NAME's associated DECL.  We only want to
>>> +     coalesce if they have the same DECL or both have no associated
>>> DECL.
>>> */
>>> +  if (SSA_NAME_VAR (name1) != SSA_NAME_VAR (name2))
>>> +    return false;
>>> +
>>> +  /* Now check the types.  If the types are the same, then we should
>>> +     try to coalesce V1 and V2.  */
>>> +  tree t1 = TREE_TYPE (name1);
>>> +  tree t2 = TREE_TYPE (name2);
>>> +  if (t1 == t2)
>>> +    return true;
>>> +
>>> +  /* If the types are not the same, check for a canonical type match.
>>> This
>>> +     (for example) allows coalescing when the types are fundamentally
>>> the
>>> +     same, but just have different names.  */
>>> +  if (TYPE_CANONICAL (t1) && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2))
>>
>>
>> Please use types_compatible_p (t1, t2) here, that's the correct API to use
>> here.
>>
>>> +    return true;
>>> +
>>> +  return false;
>>> +}
>>> diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c
>>> index 83a52a0..a624d00 100644
>>> --- a/gcc/tree-ssa-live.c
>>> +++ b/gcc/tree-ssa-live.c
>>> @@ -111,8 +111,12 @@ var_map_base_init (var_map map)
>>>             as it restricts the sets we compute conflicts for.
>>>             Using TREE_TYPE to generate sets is the easies as
>>>             type equivalency also holds for SSA names with the same
>>> -          underlying decl.  */
>>> -       m->base.from = TREE_TYPE (var);
>>> +          underlying decl.
>>> +
>>> +          Check gimple_can_coalesce_p when changing this code.  */
>>> +       m->base.from = (TYPE_CANONICAL (TREE_TYPE (var))
>>> +                       ? TYPE_CANONICAL (TREE_TYPE (var))
>>> +                       : TREE_TYPE (var));
>>
>>
>> eh, but it's made complicated here ... so above do
>>
>>
>> if (TYPE_CANONICAL (t1) && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2)
>>      && types_compatible_p (t1, t2))
>>
>> because looking at useless_type_conversion_p it looks like pointer types
>> with different address-spaces may have the same canonical type.  A comment
>> on why we check both, refering to var_map_base_init should also be added.
>
> Reading this again after a night of sleep, it appears you're agreeing that
> we can't just use types_compatible_p to drive what objects are put on the
> coalesce list.  The only code change you're asking for is to make sure we
> properly reject pointer types with different address spaces (which can be
> done via types_compatible_p).
>
>
> Right?

Yes, if I remember correctly after this long time ;)

Richard.

> jeff
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]