On Tue, 13 Oct 2020, Jan Hubicka wrote:

> > > So I implemented my own pattern matching and I think we should switch 
> > > ipa-prop
> > > on it incrementally. It is based on similar logic in
> > > ao_ref_init_from_ptr_and_size.
> > 
> > So instead of re-inventing the wheel what about splitting out a
> > common helper instead?
> 
> It was my original idea. However it is not completely trivial:
> ao_ref_init_from_ptr_and_size does bit something else since it is trying
> to keep the original ref inside ADDR_EXPR (if one is found) to feed it
> into oracle rather then stripping them all.  If refs are present it does
> not need to build MEM_REF.

You've also coded other subtle differences - is it really better
to have p_1 with unknown offset for in p_3 = p_1 + i_2 instead of
having p_3?  I suppose the idea is to look for an offsetted
default def (aka parameter)?

Frankly I don't like the loop - unbounded walk over unoptimized ptr += 4;
ptr += 4; ... chain, possibly quadratic if it's like

void foo (void *p, int i)
{
  void *p1 = p + i;
  void *p2 = p1 + i;
  void *p3 = p2 + i;
  bar (p1, p2, p3);
}

so I wonder if the propagation engine instead wants to cache
the discovered base + offset for a (pointer?) SSA name?  Not
sure if this recursion when the offset becomes unknown is
of any help to ipa-prop - IPA prop is also interested in
other than pointer parameters I guess.

> static void
> ao_ref_init_from_ptr_and_range (ao_ref *ref, tree ptr,
>                               bool range_known,
>                               poly_int64 offset,
>                               poly_int64 size,
>                               poly_int64 max_size)
> {
>   poly_int64 t, extra_offset = 0;
> 
>   ref->ref = NULL_TREE;
>   if (TREE_CODE (ptr) == SSA_NAME)
>     {
>       gimple *stmt = SSA_NAME_DEF_STMT (ptr);
>       if (gimple_assign_single_p (stmt)
>         && gimple_assign_rhs_code (stmt) == ADDR_EXPR)
>       ptr = gimple_assign_rhs1 (stmt);
>       else if (is_gimple_assign (stmt)
>              && gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
>              && ptrdiff_tree_p (gimple_assign_rhs2 (stmt), &extra_offset))
>       {
>         ptr = gimple_assign_rhs1 (stmt);
>         extra_offset *= BITS_PER_UNIT;
>       }
>     }
> 
>   if (TREE_CODE (ptr) == ADDR_EXPR)
>     {
>       ref->base = get_addr_base_and_unit_offset (TREE_OPERAND (ptr, 0), &t);
>       if (ref->base)
>       ref->offset = BITS_PER_UNIT * t;
>       else
>       {
>         range_known = false;
>         ref->offset = 0;
>         ref->base = get_base_address (TREE_OPERAND (ptr, 0));
>       }
>     }
>   else
>     {
>       gcc_assert (POINTER_TYPE_P (TREE_TYPE (ptr)));
>       ref->base = build2 (MEM_REF, char_type_node,
>                         ptr, null_pointer_node);
>       ref->offset = 0;
>     }
> 
> I could add a flag if I am looking for ADDR_EXPR or just the base
> pointer but it seemed more for incremental change.  The new helper
> should be immediately useful for ipa-modref, ipa-prop and
> ipa-polymorphic-call though.
> 
> Honza
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imend

Reply via email to