Handle EAF_DIRECT and EAF_UNUSED of pure calls

Richard Biener richard.guenther@gmail.com
Mon Nov 30 09:59:54 GMT 2020


On Sun, Nov 29, 2020 at 4:37 PM Jan Hubicka <hubicka@ucw.cz> wrote:
>
> > On Wed, Nov 25, 2020 at 3:14 PM Jan Hubicka <hubicka@ucw.cz> wrote:
> > >
> > > Hi,
> > > while looking into structalias I noticed that we ignore EAF flags here.
> > > This is pity since we still can apply direct and unused.
> > > This patch simply copies logic from normal call handling. I relaize that
> > > it is bit more expensive by creating callarg and doing transitive
> > > closure there instead of doing one common transitive closure on call use.
> > > I can also scan first if there are both direct and !direct argument and
> > > do this optimization, but it does not seem to affect build times (tested
> > > on spec2k6 gcc LTO build)
> > >
> > > lto-boostrapped/regtested x86_64-linux.
> >
> > OK.
> Hi,
> I actually noticed that I missed to update handling of static chain and
> NRV values, but while testing updated patch I also found that it has no
> measurable effect on cc1plus and I failed to construct testcase where
> handling of EAF_DIRECT would do somehting useful.  The points-to set
> of returned value contains all eascape and nonlocal solutions (as it
> should).  So I decided to commit only the EAF_UNUSED part. As it stands
> EAF_DIRECT handling only makes constraint graph bigger for no much
> benefit.
>
> I think to make return values useful we need to also use the info about
> global memory uses.  This is easilly available from modref but doing so
> seems non-trivial since pure functions can return addresses of global
> symbols but NONLOCAL solution is too big for that.

Well, pure can even return the address of escaped things.

int *p;

int *foo () { return p; } // pure

int main()
{
  int i;
  p = &i;
  if (foo () != &i)
    abort ();
}

so ESCAPED would be correct and even larger than NONLOCAL.

> Honza
>
>         * tree-ssa-structalias.c (handle_pure_call): Skip EAF_UNUSED
>          parameters.
> diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
> index 9f4de96d544..cf653be8b6d 100644
> --- a/gcc/tree-ssa-structalias.c
> +++ b/gcc/tree-ssa-structalias.c
> @@ -4274,6 +4274,11 @@ handle_pure_call (gcall *stmt, vec<ce_s> *results)
>    for (i = 0; i < gimple_call_num_args (stmt); ++i)
>      {
>        tree arg = gimple_call_arg (stmt, i);
> +      int flags = gimple_call_arg_flags (stmt, i);
> +
> +      /* If the argument is not used we can ignore it.  */
> +      if (flags & EAF_UNUSED)
> +       continue;
>        if (!uses)
>         {
>           uses = get_call_use_vi (stmt);


More information about the Gcc-patches mailing list