[PATCH 7/7] Plug ipa-prop escape analysis into gimple_call_arg_flags

Martin Jambor mjambor@suse.cz
Thu May 22 12:49:00 GMT 2014


Hi,

On Wed, May 21, 2014 at 04:27:32PM +0200, Richard Biener wrote:
> On Wed, May 21, 2014 at 3:16 PM, Martin Jambor <mjambor@suse.cz> wrote:
> > Hi,
> >
> > this demonstrates how results of ipa-prop escape analysis from
> > previous patches can be used at a later stage of compilation by
> > directly returning them from gimple_call_arg_flags which currently
> > relies on fnspec annotations.
> >
> > Bootstrapped and tested on x86_64-linux and also passes LTO bootstrap.
> > I have only had a brief look at behavior of this in SPEC 2006 and for
> > example in astar 1.19% of invocations of gimple_call_arg_flags return
> > noescape where we previously never did and in calculix this increases
> > from 15.62% (from annotations) to 18.14%.  Noclobber flag is reported
> > far less often still but for example in gamess that number raises from
> > 5.21% to 7.66%.
> >
> > Thanks,
> >
> > Martin
> >
> >
> > 2014-04-30  Martin Jambor  <mjambor@suse.cz>
> >
> >         * gimple.c: Include cgraph.h.
> >         (gimple_call_arg_flags): Also query bitmaps in cgraph_node.
> >
> > Index: src/gcc/gimple.c
> > ===================================================================
> > --- src.orig/gcc/gimple.c
> > +++ src/gcc/gimple.c
> > @@ -47,7 +47,7 @@ along with GCC; see the file COPYING3.
> >  #include "demangle.h"
> >  #include "langhooks.h"
> >  #include "bitmap.h"
> > -
> > +#include "cgraph.h"
> >
> >  /* All the tuples have their operand vector (if present) at the very bottom
> >     of the structure.  Therefore, the offset required to find the
> > @@ -1349,32 +1349,50 @@ int
> >  gimple_call_arg_flags (const_gimple stmt, unsigned arg)
> >  {
> >    tree attr = gimple_call_fnspec (stmt);
> > +  int ret;
> >
> > -  if (!attr || 1 + arg >= (unsigned) TREE_STRING_LENGTH (attr))
> > -    return 0;
> > -
> > -  switch (TREE_STRING_POINTER (attr)[1 + arg])
> > +  if (attr && 1 + arg < (unsigned) TREE_STRING_LENGTH (attr))
> >      {
> > -    case 'x':
> > -    case 'X':
> > -      return EAF_UNUSED;
> > -
> > -    case 'R':
> > -      return EAF_DIRECT | EAF_NOCLOBBER | EAF_NOESCAPE;
> > -
> > -    case 'r':
> > -      return EAF_NOCLOBBER | EAF_NOESCAPE;
> > -
> > -    case 'W':
> > -      return EAF_DIRECT | EAF_NOESCAPE;
> > -
> > -    case 'w':
> > -      return EAF_NOESCAPE;
> > +      switch (TREE_STRING_POINTER (attr)[1 + arg])
> > +       {
> > +       case 'x':
> > +       case 'X':
> > +         ret = EAF_UNUSED;
> > +         break;
> > +       case 'R':
> > +         ret = EAF_DIRECT | EAF_NOCLOBBER | EAF_NOESCAPE;
> > +         break;
> > +       case 'r':
> > +         ret = EAF_NOCLOBBER | EAF_NOESCAPE;
> > +         break;
> > +       case 'W':
> > +         ret = EAF_DIRECT | EAF_NOESCAPE;
> > +         break;
> > +       case 'w':
> > +         ret = EAF_NOESCAPE;
> > +         break;
> > +       case '.':
> > +       default:
> > +         ret = 0;
> > +       }
> > +    }
> > +  else
> > +    ret = 0;
> >
> > -    case '.':
> > -    default:
> > -      return 0;
> > +  tree callee_decl = gimple_call_fndecl (stmt);
> > +  if (callee_decl)
> > +    {
> > +      cgraph_node *callee_node = cgraph_get_node (callee_decl);
> > +      if (callee_node)
> > +       {
> > +         if (cgraph_param_noescape_p (callee_node, arg))
> > +           ret |= EAF_NOESCAPE;
> > +         if (cgraph_param_noclobber_p (callee_node, arg))
> > +           ret |= EAF_NOCLOBBER;
> 
> That's quite expensive.  I guess we need a better way to store
> those?

if we want to avoid the cgraph_node lookup, then I think we need to
store this information in the decl or struct function.  That is
certainly possible and might even be more appropriate.

Thanks,

Martin

> 
> > +       }
> >      }
> > +
> > +  return ret;
> >  }
> >
> >  /* Detects return flags for the call STMT.  */
> >



More information about the Gcc-patches mailing list