[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