Message ID | 20140611134736.GE17894@msticlxl57.ims.intel.com |
---|---|
State | New |
Headers | show |
Hi, On Wed, Jun 11, 2014 at 05:47:36PM +0400, Ilya Enkovich wrote: > > Here is fixed verison. I'm fine with the ipa-cp hunks but I cannot approve them, Honza is the right person to ask. Thanks, Martin > > Thanks, > Ilya > -- > gcc/ > > 2014-06-11 Ilya Enkovich <ilya.enkovich@intel.com> > > * cgraph.h (cgraph_local_p): New. > * ipa-cp.c (initialize_node_lattices): Use cgraph_local_p > to handle instrumentation clones properly. > (propagate_constants_accross_call): Do not propagate > through instrumentation thunks. > > > diff --git a/gcc/cgraph.h b/gcc/cgraph.h > index 5e702a7..b225ebe 100644 > --- a/gcc/cgraph.h > +++ b/gcc/cgraph.h > @@ -1556,4 +1556,17 @@ symtab_in_same_comdat_p (symtab_node *one, symtab_node *two) > { > return DECL_COMDAT_GROUP (one->decl) == DECL_COMDAT_GROUP (two->decl); > } > + > +/* Return true if NODE is local. Instrumentation clones are counted as local > + only when originla function is local. */ > + > +static inline bool > +cgraph_local_p (cgraph_node *node) > +{ > + if (!node->instrumentation_clone || !node->instrumented_version) > + return node->local.local; > + > + return node->local.local && node->instrumented_version->local.local; > +} > + > #endif /* GCC_CGRAPH_H */ > diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c > index 689378a..4318789 100644 > --- a/gcc/ipa-cp.c > +++ b/gcc/ipa-cp.c > @@ -699,7 +699,7 @@ initialize_node_lattices (struct cgraph_node *node) > int i; > > gcc_checking_assert (cgraph_function_with_gimple_body_p (node)); > - if (!node->local.local) > + if (!cgraph_local_p (node)) > { > /* When cloning is allowed, we can assume that externally visible > functions are not called. We will compensate this by cloning > @@ -1434,6 +1434,24 @@ propagate_constants_accross_call (struct cgraph_edge *cs) > if (parms_count == 0) > return false; > > + /* No propagation through instrumentation thunks is available yet. > + It should be possible with proper mapping of call args and > + instrumented callee params in the propagation loop below. But > + this case mostly occurs when legacy code calls instrumented code > + and it is not a primary target for optimizations. > + We detect instrumentation thunks in aliases and thunks chain by > + checking instrumentation_clone flag for chain source and target. > + Going through instrumentation thunks we always have it changed > + from 0 to 1 and all other nodes do not change it. */ > + if (!cs->callee->instrumentation_clone > + && callee->instrumentation_clone) > + { > + for (i = 0; i < parms_count; i++) > + ret |= set_all_contains_variable (ipa_get_parm_lattices (callee_info, > + i)); > + return ret; > + } > + > /* If this call goes through a thunk we must not propagate to the first (0th) > parameter. However, we might need to uncover a thunk from below a series > of aliases first. */
On 06/17/14 07:41, Martin Jambor wrote: > Hi, > > On Wed, Jun 11, 2014 at 05:47:36PM +0400, Ilya Enkovich wrote: >> >> Here is fixed verison. > > I'm fine with the ipa-cp hunks but I cannot approve them, Honza is the > right person to ask. I'll step in and say these bits are fine :-) Thanks for the reviews Martin. Ilya, please hold off installing until all the patches are approved. We're obviously trying to keep up with them as they come in. jeff
diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 5e702a7..b225ebe 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -1556,4 +1556,17 @@ symtab_in_same_comdat_p (symtab_node *one, symtab_node *two) { return DECL_COMDAT_GROUP (one->decl) == DECL_COMDAT_GROUP (two->decl); } + +/* Return true if NODE is local. Instrumentation clones are counted as local + only when originla function is local. */ + +static inline bool +cgraph_local_p (cgraph_node *node) +{ + if (!node->instrumentation_clone || !node->instrumented_version) + return node->local.local; + + return node->local.local && node->instrumented_version->local.local; +} + #endif /* GCC_CGRAPH_H */ diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 689378a..4318789 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -699,7 +699,7 @@ initialize_node_lattices (struct cgraph_node *node) int i; gcc_checking_assert (cgraph_function_with_gimple_body_p (node)); - if (!node->local.local) + if (!cgraph_local_p (node)) { /* When cloning is allowed, we can assume that externally visible functions are not called. We will compensate this by cloning @@ -1434,6 +1434,24 @@ propagate_constants_accross_call (struct cgraph_edge *cs) if (parms_count == 0) return false; + /* No propagation through instrumentation thunks is available yet. + It should be possible with proper mapping of call args and + instrumented callee params in the propagation loop below. But + this case mostly occurs when legacy code calls instrumented code + and it is not a primary target for optimizations. + We detect instrumentation thunks in aliases and thunks chain by + checking instrumentation_clone flag for chain source and target. + Going through instrumentation thunks we always have it changed + from 0 to 1 and all other nodes do not change it. */ + if (!cs->callee->instrumentation_clone + && callee->instrumentation_clone) + { + for (i = 0; i < parms_count; i++) + ret |= set_all_contains_variable (ipa_get_parm_lattices (callee_info, + i)); + return ret; + } + /* If this call goes through a thunk we must not propagate to the first (0th) parameter. However, we might need to uncover a thunk from below a series of aliases first. */